上一篇博客我们对SpringCloud有了一个详细的描述,这一次我们根据上次的理念来一个落地实现。

本次只是一个简单的集成(内容实在是太多了),后面会把每一部分单独出一个博客详细解释,但都是基于此服务

SpringCloud微服务详解(springcloud alibaba)


本篇博客的架构图如下
在这里插入图片描述


一、前期准备

1-1、创建一个父工程

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


后面直接next、finish就可以了。


1-2、创建公共pom


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>www.xdx97.cloud</groupId>
    <artifactId>xdxCloud</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <!-- 统一管理jar包版本 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <lombok.version>1.16.18</lombok.version>
        <mysql.version>5.1.47</mysql.version>
        <druid.version>1.1.16</druid.version>
        <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
    </properties>

    <!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version  -->
    <dependencyManagement>
        <dependencies>
            <!--spring boot 2.2.2-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud Hoxton.SR1-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud alibaba 2.1.0.RELEASE-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid.version}</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.spring.boot.version}</version>
            </dependency>

            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
                <optional>true</optional>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

二、创建一个服务提供方(用户服务)

以后所有的创建方式都是如此


2-1、创建项目

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


2-2、修改pom

<dependencies>
    <!-- SpringBoot整合Web组件 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

2-3、新增yml配置文件

server:
  port: 5001

spring:
  application:
    name: user_server_5001

2-4、新增启动类文件

package com.xdx97;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class UserServer5001 {
    public static void main(String[] args) {
        SpringApplication.run(UserServer5001.class, args);
    }
}

2-5、新增用户服务

package com.xdx97.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @GetMapping("/user")
    public String fun(){
        return "我是用户服务";
    }
}

2-6、测试

在浏览器访问( http://127.0.0.1:5001/user ),如果可以看到结果及表示成功。



三、注册中心(nacos)

目前就用window版本,后面会出nacos集群那时候再用linux版本


3-1、下载

https://github.com/alibaba/nacos/releases


3-2、启动

  1. 把下载好的包,解压出来
  2. 打开CMD去到bin目录下,执行 startup.cmd -m standalone (standalone代表着单机模式运行,非集群模式)
  3. 打开浏览器输入:http://127.0.0.1:8848/nacos/index.htm ,看到如下界面表示成功。
  4. 初始用户名/密码 nacos/nacos

在这里插入图片描述


3-3、用户服务注册进nacos

  1. 修改user服务的pom文件,加入下面的依赖
<!--SpringCloud ailibaba nacos -->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. 修改yum文件为如下内容
server:
  port: 5001

spring:
  application:
    name: user_server_5001
  cloud:
    nacos:
      discovery:
        #server-addr: localhost:8848 #配置Nacos地址
        server-addr: 127.0.0.1:8848
  1. 在启动类上面加上服务发现注解
@EnableDiscoveryClient
  1. 重启服务,然后刷新nacos会发现已经注册进去了

在这里插入图片描述



四、网关 (getway)

网关里面是已经集成了服务调用负载均衡的


4-1、参照二、建立一个模块 (getway6001)


4-2、添加yml文件


这里面有一个坑,我前面的用户服务取名为user_server_5001,这个名字配置在网关里面无法识别,所以我改成了userServer

server:
  port: 6001

spring:
  application:
    name: getway_6001
  cloud:
    nacos:
      discovery:
        #server-addr: localhost:8848 #配置Nacos地址
        server-addr: 127.0.0.1:8848
    gateway:
      discovery:
        locator:
          enabled: true       #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes:
        - id: user_server #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
#          uri: http://localhost:5001          #匹配后提供服务的路由地址
          uri: lb://userServer                  #配置nacos里面的服务名
          predicates:
            - Path=/user/**         # 断言,路径相匹配的进行路由

4-3、配置pom

<dependencies>
    <!--gateway-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <!--SpringCloud ailibaba nacos -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

4-4、配置启动类

@SpringBootApplication
@EnableDiscoveryClient
public class Getway6001 {
    public static void main(String[] args) {
        SpringApplication.run(Getway6001.class, args);
    }
}

4-5、测试

在浏览器输入 http://localhost:6001/user 如果可以成功访问,表示成功。


4-6、其它

本以为网关就是一个转发,但是刚刚测试发现还有其它好玩的东西,但是博客写的太长不好,而且这篇博客就是简单搭建微服务,后面会单独写一篇文章。



五、配置中心(nacos)

为用户服务添加配置中心,以便可以动态的更新配置文件


5-1、添加pom

<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

5-2、修改配置文件

5-2-1、bootstrap.yml

我们需要新增一个bootstrap.yml文件,在读取顺序的时候bootstrap.yml是优先于application.yml。

server:
  port: 5001

spring:
  application:
    name: userServer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置

5-2-2、application.yml
spring:
  profiles:
    active: dev

5-3、添加nacos配置

在这里插入图片描述
在这里插入图片描述


5-4、配置动态刷新效果

这里很关键,不可能说当我们去修改了nacos里面的配置文件,然后我们的系统代码立即就收到的,他是有一个过程的。

我们要把全部的配置文件写到一个java文件里面,然后别的地方要用的时候去调用就好了,比如下面的用法:ConfigController.wxApp;

package com.xdx97.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @GetMapping("/user")
    public String fun(){
        return "我是用户服务" + ConfigController.wxApp;
    }
}

我们来配置这个ConfigController,使他里面的都可以动态获取,我这里只配置一个属性(wx.app)作为演示,具体数量看实际需求。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RefreshScope
@RestController
public class ConfigController {

    @RequestMapping("/refreshConfig")
    public String refreshConfig(){
        return "配置刷新成功";
    }

    public static String wxApp;

    @Value("${wx.app}")
    public void setWxApp(String wxApp) {
        this.wxApp = wxApp;
    }
}

5-5、最终效果演示

在这里插入图片描述



六、服务监控(sentinel)

6-1、sentinal 控制台

6-1-1、下载

https://github.com/alibaba/Sentinel/releases

下载后启动, java -jar sentinel-dashboard-1.8.1.jar


6-1-2、登录

访问 http://127.0.0.1:8080 , 用户名/密码 sentinel / sentinel

在这里插入图片描述

6-2、userServer集成sentinel

6-2-1、添加如下pom
<!--SpringCloud ailibaba sentinel -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

6-2-2、修改配置文件(bootstrap.yml)
server:
  port: 5001

spring:
  application:
    name: userServer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置
    sentinel:
      transport:
        dashboard: localhost:8080
        port: 8719

6-2-3、userServer注册进sentinal

我们的sentinel是懒加载的,我们重启userServer服务,然后访问 http://127.0.0.1:5001/user,再刷新sentinel就可以看到如下内容

在这里插入图片描述

6-2-4、服务限流

sentinal 可以提供各个维度不同的限流,这里我只测试一个最简单的流程:当QPS大于1的时候快速失败

在这里插入图片描述



七、Nginx负载

Nginx实现负载均衡Linux版本(六种负载策略)



八、源代码/安装包 获取

关注微信公众号回复: SpringCloudAlibabaDemo

在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐