Nacos注册中心

nacos是阿里的注册中心

  1. 引入父工程依赖
<dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.5.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
  1. 注释原来eureka的依赖
  2. 添加nacos客户端依赖
<!--        nacos客户端依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

Nacos服务分级存储模型

nacos上的权重配置 nacos权重路由_java

服务调用尽可能选择本地集群的服务,跨集群调用延迟较高,本地集群不可访问时,再去访问其他集群

userserver:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
  • 一级:服务,比如:userserver
  • 二级:集群,比如:杭州上海
  • 三级:实例,比如:杭州集群里部署了userserver的服务器
cloud:
    nacos:
      server-addr: localhost:8848 #nacos服务地址
      discovery:
        cluster-name: HZ

加权负载均衡

实例的权重控制

  • Nacos控制台可以设置实例的权重值,0~1之间
  • 同集群内的多个实例,权重越高被访问的频率越高
  • 权重设置为0则完全不会被访问

环境隔离

namespace

相同的环境下才能互相访问,不同环境下就会隔离开,即:每个namespace都有唯一id,不同namespace下的服务不可见

如果不指定namespace,默认在public组里

cloud:
    nacos:
      discovery:
        namespace: df1422b6-b616-4119-834e-b0082825fe02

nacos上的权重配置 nacos权重路由_nacos上的权重配置_02


nacos原理

nacos上的权重配置 nacos权重路由_环境配置_03

跟eureka类似,都有心跳检测机制,但是是有区别

  • eureka:提供者每隔30s心跳检测一次
  • nacos:提供者分为两种:临时实例,非临时实例
  • 临时实例采用心跳检测,每隔5s主动发送一次,nacos15s没有收到检测会标记不健康,30s没收到会直接剔除该服务
  • 非临时实例由nacos主动询问是否在线,如果有问题,不会剔除,而是标记不健康,等待上线

nacos消费者拉取到服务信息会缓存,如果有消息变更,nacos会主动推送到消费者

总结

Nacos

Eureka

服务注册

支持

支持

服务拉取

支持,且能缓存

支持

心跳检测

支持,临时实例5s间隔

支持,30s间隔

主动检测

nacos会主动向非临时实例检测状态

不支持

服务推送

服务变更时主动推送

不支持

集群模式

默认采用AP方式,当集群中采用非临时实例时,采用CP模式

采用AP方式


Nacos配置管理

配置统一管理

  1. 添加nacos配置管理

nacos上的权重配置 nacos权重路由_spring_04

其中的配置内容不是全部的yaml,而是有热更新需求的内容

  1. 添加依赖
<!--        nacos配置管理客户端依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
  1. 添加bootstrap.yaml文件

在nacos的管理中心的配置需要:

  • 文件名:userserver-dev.yaml
  • 文件格式:yaml
  • 文件内容:xxx

所以bootstrap.yaml中也需要这些

spring:
  application:
    name: userserver #服务名称
  profiles:
    active: dev #环境
  cloud:
    nacos:
      server-addr: localhost:8848 #nacos服务地址
      config:
        file-extension: yaml #文件后缀名

所以现在springboot在加载的时候,会先从bootstrap.yaml中获取文件内容,再通过application.yaml获取内容


配置热更新

有两种实现方式:

  1. 在需要注入的类上加上:@RefreshScope
@RefreshScope
public class UserController {

    @Autowired
    private UserService userService;
    @Value("${pattern.dateformat}")
    private String dateformat;

    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id) {
        System.out.println(dateformat);
        return userService.queryById(id);
    }
}
  1. 搞一个配置类,用springboot自动装配的特性,自己去yaml中找:pattern:dateformat
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
}
 
public class UserController {
	@Autowired
    private PatternProperties patternProperties;
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id) {
        System.out.println(patternProperties.getDateformat());
        return userService.queryById(id);
    }

多环境配置共享

nacos上的权重配置 nacos权重路由_java_05

如果不带dev说明没有环境限制,说明是多环境共享的。

多种配置的优先级:

nacos > 本地
环境配置 > 多环境配置
总结:
userserver-dev.yaml > userserver.yaml > idea:application.yaml

服务启动的时候会从nacos中读取两个文件:[服务名]-[环境].yaml 和 [服务名].yaml 例如:usersever-dev.yaml 和 userserver.yaml

如果不带dev说明没有环境限制,说明是多环境共享的。

多种配置的优先级:

nacos > 本地
环境配置 > 多环境配置
总结:
userserver-dev.yaml > userserver.yaml > idea:application.yaml

服务启动的时候会从nacos中读取两个文件:[服务名]-[环境].yaml 和 [服务名].yaml 例如:usersever-dev.yaml 和 userserver.yaml