前言
本文主要讲述微服务组件中的:注册中心、配置中心
一、各组件关系与技术选择
最终的技术搭配方案为:
SpringCloud Alibaba - Nacos:注册中心(服务发现/注册)
SpringCloud Alibaba - Nacos:配置中心(动态配置管理)
SpringCloud - Ribbon:负载均衡
SpringCloud - Feign:声明式 HTTP 客户端(调用远程服务)
SpringCloud Alibaba - Sentinel:服务容错(限流、降级、熔断)
SpringCloud - Gateway:API 网关(webflux 编程模式)
SpringCloud - Sleuth:调用链监控
SpringCloud Alibaba - Seata:原 Fescar,即分布式事务解决方案
其中不止springboot与springcloud版本对应关系,还有其它与springboot的版本对应关系
在引入组件前引入依赖管理,可以在后续引入组件依赖时忽略版本号,这些依赖都引入公共模块common中。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.4.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
二、Nacos
1.Nacos作为注册中心
引入相关依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 下载Nacos注册中心 Nacos Server
- 为每个服务配置nacos服务注册配置
server.port=8081 spring.application.name=nacos-provider spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 management.endpoints.web.exposure.include=*
- 启动项添加注解@EnableDiscoveryClient开启服务注册/发现
@SpringBootApplication
@EnableDiscoveryClient
public class GuliCouponApplication {
public static void main(String[] args) {
SpringApplication.run(GuliCouponApplication.class, args);
}
}
- 启动服务进行服务注册发现
如果使用win启动nacos则需要更改win启动脚本文件使用单机启动
在脚本文件末尾加入pause endlocal 可以在启动错误时不闪退,可以看到报错信息
2.使用openFeign远程调用
- Feign是一个声明式HTTP客户端,使服务间远程调用更方便,它内置了HTTP请求模板,通过接口和注解就可以定义好HTTP请求的参数等信息。
- Feign整合了Ribbon(负载均衡)和Hystrix(服务熔断)
这里在微服务版本超过2020时,Feign对负载均衡器做出了调整调整为Spring Cloud Loadbalancer,为此需要引入Spring Cloud Loadbalancer的相关依赖并移除Ribbon引用和增加配置,不然开启远程调用的服务会启动报错
spring.cloud.loadbalancer.ribbon.enabled: false
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 远程调用步骤为
-
引入open-feign
-
在需要远程调用的服务里编写一个接口,这个接口需要调用远程服务
- 声明接口的每一个方法都是调用那个远程服务的那个请求
- 声明接口的每一个方法都是调用那个远程服务的那个请求
-
开启远程调用功能,在启动类中添加注解@EnableFeignClients(basePackages = “com.smz.guli.member.feign”),basePackages表示刚刚创建接口的位置。
-
在接口处使用远程调用的接口可获取其它服务接口的值
-
3.Nacos作为配置中心
- 简介
配置中心主要解决的问题是,当需要修改某个服务的配置时,由于服务是集群化和分布式的,修改耗时耗力,配置中心则是统一化,将配置分发给对应的服务,这样就只用配置一遍而使所有服务都读取到配置。
- 在公共服务中添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
如果微服务版本大于2020,则以下形式将需要引入bootstrap的依赖才可以,不导入依赖的方式比较麻烦这里不再赘述
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.1.0</version>
</dependency>
- 为了使配置中心的读取在配置文件之前需要创建bootstrap.properties文件,springboot中bootstrap.properties文件会在application.yml之前。
- 配置配置中心信息
spring.application.name=guli-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
-
给配置中心默认添加一个数据集(Data Id)guli-coupon.properties。默认规则,应用名.properties。
-
在guli-coupon.properties添加配置
-
动态获取配置
- 动态刷新配置注解 @RefreshScope
- 获取配置值 @Value(“${配置项名}”)
如果配置中心和配置文件中都配置了,优先使用配置中心的
4.配置中心细节
- 命名空间
配置隔离
- 用来隔离不同环境下的配置(开发、测试、生产)
可以在bootstrap.properties配置指定命名空间
spring.cloud.nacos.config.namespace=c700d749-47f7-4b10-9116-4fe586a1a2a2
- 各个服务间配置隔离
每个微服务创建自己的命名空间
默认:public(保留空间);默认新增的所有配置都在public空间
- 配置集
所有的配置的集合
- 配置集ID
Data ID
- 配置分组
默认所有的配置集都属于DEFAULT_GROUP
配置分组可以用来区分环境
可以在bootstrap.properties配置指定配置分组
spring.cloud.nacos.config.group=1111
- 同时加载多个配置集
在bootstrap.properties文件中配置如下代码
spring.cloud.nacos.config.extension-configs[0].data-id=datasource.yml // Data ID
spring.cloud.nacos.config.extension-configs[0].group=dev // 配置分组
spring.cloud.nacos.config.extension-configs[0].refresh=true // 是否动态更新
微服务中所有的配置都可以交给nacos配置中心管理。配置中心有的优先使用配置中心的
总结
本章主要讲了微服务的注册发现和配置中心两个组件。