Spring-Cloud-alibaba配置笔记

  1. 1. 管理依赖
  2. 2. Nacos注册中心
    1. 2.1. 1. 依赖引入(只common)
    2. 2.2. 2. 启用服务服务发现
    3. 2.3. 3. 配置文件nacos相关(yml)
    4. 2.4. 4. 启动nacos
  3. 3. Feign
    1. 3.1. 1. 依赖引入(所有需要使用Feign的微服务,除common)
    2. 3.2. 2. 申明feign创建调用
    3. 3.3. 3. 申明启用feign调用
  4. 4. Nacos配置中心
    1. 4.1. 1. 依赖引入(只common)
    2. 4.2. 2. 配置文件
    3. 4.3. Nacos网页配置列表添加
    4. 4.4. 引入配置参数类加注解
    5. 4.5. 3. 以开发测试生产命名空间(不太推荐)
    6. 4.6. 4. 以每个微服务作为命名空间
    7. 4.7. 5. 配置分组
    8. 4.8. 6. 通过分组隔离环境
    9. 4.9. 7. 使用配置集
  5. 5. Gateway网关
    1. 5.1. 1. 依赖引入
    2. 5.2. 2. 注解配置
    3. 5.3. Nacos注册
    4. 5.4. 路由规则

spring-cloud-alibaba配置笔记

管理依赖

在common微服务单独添加如下依赖,该依赖会SpringCloud-alibaba的所有组件进行依赖管理。然后所有微服务必须引入common依赖,
注意:common创建是使用idea自带的maven脚手架创建,而不是springBoot,所以没有启动类

Common服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<?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">
<parent>
<artifactId>project</artifactId>
<groupId>com.example.project</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>project-common</artifactId>
<description>每一个微服务公共的依赖,bean,工具类等</description>

<dependencies>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>

<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.12</version>
</dependency>

<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<!--tomcat存在打包的時候不需要-->
<scope>provided</scope>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>

<!-- 由于每一个微服务都需要配置中心,所以写这里,版本由下面的dependencyManagement管理 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<!-- 使用openfeign的负载均衡,需要排除这个自带的负载均衡 -->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>

<!-- 由于每一个服务都需要使用配置中心,所以写这里,版本由dependencyManagement管理 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

<!-- springBoot的2.4即以上版本需要添加,之后再使用 bootstrap.properties 配置文件 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.1.2</version>
</dependency>

<!-- Bean 校验注解 ,高版本要用starter的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.6.8</version>
</dependency>

</dependencies>

<!-- 依赖管理,上面的部分依赖版本由下面的管理,spring-cloud-alibaba的注册中心、配置中心,管理依赖版本,注意下面的pom示例是spring-cluod-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.7.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
某单独微服务的pom参考
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.8</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.project</groupId>
<artifactId>microServe1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>microServe1</name>
<description>微服务1</description>
<properties>
<java.version>1.8</java.version>
<!-- 指定spring-cloud的依赖 -->
<spring-cloud.version>2021.0.3</spring-cloud.version>
</properties>

<dependencies>
<dependency>
<groupId>com.example.project</groupId>
<artifactId>project-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<!-- 阿里云OSS服务单独抽出到第三方微服务后,不再需要,并且使用的是spring-cloud-starter-alicloud-oss的依赖 -->
<!--<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>-->
</dependencies>

<!-- spring-cloud的依赖管理,上面没有配置版本的都由此管理版本 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<!-- 管理spring-cloud的依赖 -->
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

Nacos注册中心

1. 依赖引入(只common)

1
2
3
4
5
6
7
8
9
10
11
12
<!-- 由于每一个微服务都需要配置中心,所以写common,版本由上面说的dependencyManagement管理 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<!-- 排除ribbon,因为feign不再使用ribbon,而是使用lodblance-starter, 因为feign是单独引用,所以建议lodblance-starter和feign单独引用 -->
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>

2. 启用服务服务发现

添加@EnableDiscoveryClient注解,添加完后应该如下,所有微服务需要注册

1
2
3
4
5
6
7
@EnableDiscoveryClient
@SpringBootApplication
public class microServer1Application {
public static void main(String[] args) {
SpringApplication.run(microServer1Application.class, args);
}
}

3. 配置文件nacos相关(yml)

也可以后续用写入bootstrap.yml中,参考Naocs配置中心章节

1
2
3
4
5
6
7
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: microServer1

4. 启动nacos

1
startup.cmd -m standalone

Feign

申明式的远程调用http客户端(现在已经支持RPC调用了)

1. 依赖引入(所有需要使用Feign的微服务,除common)

注意:在使用idea的springBoot脚手架创建每个微服务时,我们已经选择fegin的初始化创建(同时也选择了web-starter)。所以不再需要引入依赖。

但是,在新版OpenFign使用了RPC的远程调用,需要同时加入一个新的依赖,加完后这两个依赖如下。(版本已经交给dependencyManagement管理,所以不再需要配置版本)

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

<!-- 新版本cloud-open-feign不再使用ribbon做负载均衡,而是使用spring-cloud-starter-loadbalancer -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

2. 申明feign创建调用

在Application启动类同级目录下创建feign文件夹,后面的的远程调用写在此文件夹中,方便管理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 注解`@FeignClient("microServer2")`申明为fegin客户端,要远程调用 microServer2 的服务
* 调用过程,首先去注册中心nacos找到 microServer2 服务,然后再根具下面的具体路径地址调用其服务
* microServer2 是被调用的微服务的注册在nacos的名称 (spring.application.name 的值)
*
* 要调用的直接调用自己包下的 exampleFeignService
*/
@FeignClient("microServer2")
public interface exampleFeignService {
/**
* 从远程接口复制过来的方法(被调用的方法)
* 同时远程的接口的地址也写全
* SpuBoundDto 不必与远程接口是同一个实体类,只要通过json能完全转过去
*/
@PostMapping("example/example/example/list") // 远程接口的地址,从controller上开始
R saveSpuBonds(@RequestBody SpuBoundDto spuBoundDto);
}

3. 申明启用feign调用

开启feign的注解, 指定feign要扫描的指定地址下的所有接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 1. 想要远程调用,需要开启服务发现
* 1) 引入依赖:open-feign
* 2) 编写一个接口,告诉springCloud这个接口需要调用远程服务
* (创建feign文件夹,创建接口,申明feign客户端,调用,详细见feign注释)
* 1. 申明接口的每一个方法都是调用的哪一个远程服务
* 3) 开启feign的注解, 并指定feign要扫描的指定地址下的所有接口
*/
@EnableFeignClients(basePackages = "com.example.example.example.fegin") // 启用feign并说明feign在那个包
@EnableDiscoveryClient
@SpringBootApplication
public class ServerMemberApplication {
public static void main(String[] args) {
SpringApplication.run(ServerMemberApplication.class, args);
}
}

Nacos配置中心

1. 依赖引入(只common)

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

<!-- springBoot的2.4即以上版本需要添加,之后再使用 bootstrap.properties 配置文件 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.1.2</version>
</dependency>

2. 配置文件

resources目录下辖创建bootstrap.properties文件,该文件会先于application.properties文件加载。必须要先于加载,加载后去配置中心读取配置文件。如下配置文件皆是修改bootstrap文件。如果只看结果,翻到最后一点即可。

读取流程:

  1. 先通过配置地址server-addr查找到nacos,
  2. 再通过命名空间,查找到uuid为‘361a2167-5594-4440-ac8e-ea927be56c67’的命名空间(如无则为public)
  3. 再查找组名。(如无则为DEFAULT_GROUP)
  4. 再查找应用名server1。找到server1.后缀的作为配置文件。
1
2
3
4
5
6
7
8
spring.application.name=server1 # 模块名称(每个微服务的第一个文件夹名,建议和artifactId保持一致)
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 要先创建命名空间,才能有uuid,才能设置。
spring.cloud.nacos.config.namespace=361a2167-5594-4440-ac8e-ea927be56c67 # 指定要使用的命名空间的配置uuid
# 如果配置中心使用的配置文件是yaml,需要指定,否则默认为server1.properties(分组拆分的时候已经指明文件为xxx.yaml时可以不用)
spring.cloud.nacos.config.file-extension=yaml
# 要先创建组名,才有,可以先不管,后面有说明
spring.cloud.nacos.config.group=events # 指定组名为events

Nacos网页配置列表添加

打开左侧配置管理/配置列表,点击加号,Data ID是应用名称,就是上面一点配置文件中的spring.application.name=microServer的microServer,一般取名为微分服务的最外层文件夹名。例如:·/father/example/src/main…·,其中father为聚合服务,example为微服务应用名。添加配置实现热更新

引入配置参数类加注解

引用了application.properties的文件,需要加上注解@RefreshScope,才能实时更新,动态获取配置值。

1
2
3
4
5
6
7
8
9
10
11
12
@RefreshScope // 用于实时从Nacos的配置中心获取参数
@RestController
@RequestMapping("server1/test")
public class TestController {

// 引用配置中心的参数
@Value("${user.name}")
private String name;
// 引用配置中心的参数
@Value("${user.age}")
private Integer age;
}

如果配置中心和配置文件都使用了相同的配置项,优先使用配置中心的配置。

3. 以开发测试生产命名空间(不太推荐)

命名空间主要是用来区分,开发、测试、生产的环境的配置文件。默认有一个public,利用命名空间做环境隔离,需要在bootstrap.properties配置上,需要使用哪一个命名空间下的配置文件。

如果微服务众多,可以每一个微服务都创建自己的命名空间。只加载自己命名空间下的所有配置。

Nacos命名空间

创建完成后,配置列表会多如下的可选择项。

Nacos配置列表选择项

然后根据需要,在配置文件中指定要使用的命名空间的uuid。

选择命名空间

1
2
3
spring.application.name=microServer # 应用名称
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=5fb79757-32f8-49d1-a94d-8a198f602d52 # 指定要使用的命名空间的配置uuid

4. 以每个微服务作为命名空间

配置列表中,选择克隆,可以从其他命名空间复制配置文件。

微服务作为命名空间

5. 配置分组

图中同一命名空间下有相同的Data_ID的。但是分组不同,可于配置文件中配置分组。

配置分组

1
2
3
4
spring.application.name=server1
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=5fb79757-32f8-49d1-a94d-8a198f602d52 # 指定命名空间
spring.cloud.nacos.config.group=events # 指定组名为events

6. 通过分组隔离环境

分dev组和prod组

分组隔离环境

7. 使用配置集

yaml中的配置可以进一步的拆分,如下将原本的配置application.yml配置文件拆分成datasource、mybatis、other模块。在配置集中没有的参数,会去指定的空间与组名中尝试去查找。

配置集的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
spring.application.name=server1
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 指定命名空间,
spring.cloud.nacos.config.namespace=5fb79757-32f8-49d1-a94d-8a198f602d52
# 指定组名为dev,当在下列配置集中找不到的时候,会尝试来此组中查找
spring.cloud.nacos.config.group=dev

# 使用配置集,是个集合。此配置有三个组成,这里已经指定为配置名.yaml,所以不再需要配置文件类型为yaml
spring.cloud.nacos.config.extension-configs[0].data-id=datasource.yaml # Data_ID
spring.cloud.nacos.config.extension-configs[0].group=dev # 组名
spring.cloud.nacos.config.extension-configs[0].refresh=true # 动态更新

spring.cloud.nacos.config.extension-configs[1].data-id=mybatis.yaml
spring.cloud.nacos.config.extension-configs[1].group=dev
spring.cloud.nacos.config.extension-configs[1].refresh=true

spring.cloud.nacos.config.extension-configs[2].data-id=other.yaml
spring.cloud.nacos.config.extension-configs[2].group=dev
spring.cloud.nacos.config.extension-configs[2].refresh=true

Gateway网关

gateway用来做网关。使用idea的spring脚手架初始化项目,

1. 依赖引入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2021.0.3</spring-cloud.version>
</properties>
<!-- 引入common工程依赖,因为该微服务也需要使用Nacos -->

<!-- 添加gateway依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

<!-- 添加 loadbalancer依赖解决gateway路径重写503问题-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

<!-- 上面的版本由cloud控制,cloud版本由cloud.version控制-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

bootstrap.properties 添加配置

1
2
3
spring.application.name=microServer2-gatewa
spring.cloud.nacos.config.server-addr=127.0.0.1:8848 # 配置中心Nacos地址
spring.cloud.nacos.config.namespace=d6d7433c-c339-4381-9138-661749338b2a

application.properties 添加配置

1
2
3
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848	# 注册中心Nacos地址
spring.application.name=microServer2-gateway # 注册服务名
server.port=88 # gatewway的端口号

2. 注解配置

在启动类上添加启用Nacos注解,同时排除myabtis自动配置的。

1
2
3
4
5
6
7
8
@EnableDiscoveryClient
// 排除数据库自动配置
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class ServerGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ServerGatewayApplication.class, args);
}
}

Nacos注册

在Nacos中给gateway创建命名空间。并创建Data_ID的yaml配置文件。同时创建bootstrap.properties文件。

gateway的Nacos中的配置文件

1
2
3
spring.application.name=microServer2
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=d6d7433c-c339-4381-9138-661749338b2a

路由规则

gate可以创建路由规则,在满足断言的情况下,可以路由到指定的地址,创建application.yml文件,创建如下路由规则。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
spring:
cloud:
gateway:
routes:
# `-`表示数组,可以平级配置多个
- id: test_route
uri: https://www.baidu.com
predicates:
# 查询参数包含url=baidu,则路由到上面的地址
- Query=url,baidu
- id: qq_route
uri: https://www.qq.com
predicates:
- Query=url,qq
- id: product_route
uri: lb://micro-serverName # Nacos上注册的服务名(要路由到哪个微服务)
predicates:
- Path=/api/product/** # 断言该路径下的所有请求(写在前面的先断言,所以详细的路径应该写前面)
filters:
# api下的所有请求, 把api前缀去掉,剩下的留着,再调用(调用上面指定的微服务的接口路径)
- RewritePath=/api/(?<segment>.*),/$\{segment}
- id: admin_route
uri: lb://micro-serverName2 # Nacos上注册的服务名(要路由到哪个微服务)
predicates:
- Path=/api/** #(宽泛的路径写后面)
filters:
- RewritePath=/api/?(?<segment>.*), /renren-fast/$\{segment}
## 前端项目, 发送请求都带api前缀, 如下请求路径会被路由到后面的实际地址
## product: http://localhost:88/api/product/category/list/tree http://localhost:10000/product/category/list/tree