SpringCloud-Nacos
Nacos服务注册使用
服务注册到Nacos:引入nacos.discovery依赖,配置nacos地址spring.cloud.nacos.server-addr
1、在cloud-demo父工程中添加spring-cloud-alilbaba的管理依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
2、添加nacos的客户端依赖:
<!-- nacos客户端依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3、application.yml文件添加nacos地址:
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos 服务端地址
Nacos和Eureka的区别
Nacos和Eureka整体结构类似,服务注册、服务拉取、心跳等待,但是也存在一些差异:
-
Nacos与eureka的共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
-
Nacos与Eureka的区别
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
Nacos服务分级存储模型
- 一级是服务,例如userserivice
- 二级是集群,例如北京或上海
- 三级是实例,例如杭州机房的某台部署了userservice的服务器
把同在一个机房的多个实例称为集群,服务调用尽可能选择本地集群的服务,跨集群调用延迟较高,本地集群不可访问时,再去访问其他集群。
配置集群
配置实例的集群属性:
orderService/src/resources/applicatiom.yml
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ
配置NacosRule负载均衡
服务在选择实例时的规则是由负载均衡的规则决定的(IRULE),默认轮询。为保证orderService远程调用userService时优先选择本地集群:使用NacosRule
NacosRule的访问特点:优先选择本地集群,在本地集群内的多个服务,采用随机方式进行负载均衡。当本集群的服务全部宕机,会跨集群访问,此时orderService会有一个警告信息A cross-cluster call occurs
。
修改负载均衡规则:
orderService/src/resources/applicatiom.yml
spring:
cloud:
nacos:
server-addr: 127.0.0.1:8848 # nacos服务端地址
discovery:
cluster-name: HZ # 集群名称
userservice: # 要做配置的微服务名称
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
通过在控制台设置实例的权重还可以根据权重负载均衡,可以让性能好的机器承担更多的用户请求
权重设置为0后,可以进行版本升级等操作。然后将权重改为0.01等让少数用户进行访问,当没有问题时逐步扩大比例依次升级,这样做可以做到用户无感知的平滑升级。
配置namespace环境隔离
Nacos中服务存储和配置存储、数据存储的最外层都是一个名为namespace的东西用来做最外层的隔离;每个namespace都有唯一的id,不同的namespace下的服务不可见。
Namespace
->Group
->Service/Data
修改配置的命名空间:
orderService/src/resources/applicatiom.yml
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ
namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID
配置永久实例
Nacos会把实例划分成临时实例和非临时实例【临时的主动联系nacos,非临时的nacos主动联系你】
- 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。
- 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。
配置一个服务实例为永久实例:
spring:
cloud:
nacos:
discovery:
ephemeral: false # 设置为非临时实例
Nacos配置管理
Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。
项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。
Spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,bootstrap.yaml一般配置nacos的配置信息,然后拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。
pom.xml
<!--nacos配置管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
bootstrap.yaml
spring:
application:
name: userservice # 服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 # Nacos地址
config:
file-extension: yaml # 文件后缀名
这里会根据spring.cloud.nacos.server-addr获取nacos地址,再根据${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
作为文件id,来读取配置;本例中,就是去读取userservice-dev.yaml
:
然后就可以使用@Value
获取配置信息了
Nacos配置热更新
- 方式一:在
@Value
注入的变量所在类上添加注解@RefreshScope
- 方式二:使用
@ConfigurationProperties
注解代替@Value
注解。
pattern:
dateformat: yyyy-MM-dd
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat;
}
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private PatternProperties patternProperties;
@GetMapping("now")
public String now(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));
}
}
多环境配置共享
微服务启动时会去nacos读取多个配置文件,例如[spring.application.name]-[spring.profiles.active].yaml
和[spring.application.name].yaml
;[spring.application.name].yaml
不包含环境,因此可以被多个环境共享。
优先级:服务名-profile.yaml
>服务名.yaml
>本地配置
pattern:
envSharedValue: 111
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String envSharedValue;
}