spring-cloud-alibaba配置笔记
管理依赖
在common微服务单独添加如下依赖,该依赖会SpringCloud-alibaba的所有组件进行依赖管理。然后所有微服务必须引入common依赖,
注意:common创建是使用idea自带的maven脚手架创建,而不是springBoot,所以没有启动类
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> <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> <scope>provided</scope> </dependency>
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.17</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <exclusions> <exclusion> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </exclusion> </exclusions> </dependency>
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> <version>3.1.2</version> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> <version>2.6.8</version> </dependency>
</dependencies>
<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>
|
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/> </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.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>
</dependencies> <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>
<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
| <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <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>
<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") public interface exampleFeignService {
@PostMapping("example/example/example/list") 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
|
@EnableFeignClients(basePackages = "com.example.example.example.fegin") @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>
<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文件。如果只看结果,翻到最后一点即可。
读取流程:
- 先通过配置地址server-addr查找到nacos,
- 再通过命名空间,查找到uuid为‘361a2167-5594-4440-ac8e-ea927be56c67’的命名空间(如无则为public)
- 再查找组名。(如无则为DEFAULT_GROUP)
- 再查找应用名
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
spring.cloud.nacos.config.namespace=361a2167-5594-4440-ac8e-ea927be56c67 # 指定要使用的命名空间的配置uuid
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 @RestController @RequestMapping("server1/test") public class TestController { @Value("${user.name}") private String name; @Value("${user.age}") private Integer age; }
|
如果配置中心和配置文件都使用了相同的配置项,优先使用配置中心的配置。
3. 以开发测试生产命名空间(不太推荐)
命名空间主要是用来区分,开发、测试、生产的环境的配置文件。默认有一个public,利用命名空间做环境隔离,需要在bootstrap.properties配置上,需要使用哪一个命名空间下的配置文件。
如果微服务众多,可以每一个微服务都创建自己的命名空间。只加载自己命名空间下的所有配置。
创建完成后,配置列表会多如下的可选择项。
然后根据需要,在配置文件中指定要使用的命名空间的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
spring.cloud.nacos.config.group=dev
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>
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
<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
文件。
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: - Query=url,baidu - id: qq_route uri: https://www.qq.com predicates: - Query=url,qq - id: product_route uri: lb://micro-serverName predicates: - Path=/api/product/** filters: - RewritePath=/api/(?<segment>.*),/$\{segment} - id: admin_route uri: lb://micro-serverName2 predicates: - Path=/api/** filters: - RewritePath=/api/?(?<segment>.*), /renren-fast/$\{segment}
|