Nacos注册中心

Nacos是阿里巴巴的产品,选择是SpringCloud中的一个组件,比Eureka组件功能更加丰富

Nacos需要下载安装才能使用

GitHub的Release下载页:https://github.com/alibaba/nacos/releases

Nacos环境搭建

  1. 下载安装包
  2. 解压文件
  3. 在bin目录下,直接在地址栏输入cmd命令打开,输入startup.cmd -m standalone运行

项目搭建

  1. 在微服务的父工程中添加spring-cloud-alibaba的管理依赖
    <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>
  2. 在微服务的pom文件中添加nacos的客户端依赖

    <!-- nacos客户端依赖包 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    注意,如果使用nacos则需要把Eureka的依赖包注释掉

  3. 配置application.yml文件

    spring:
      cloud:
        nacos:
          server-addr: localhost:8848 #nacos服务地址

    这里也要注释掉eureka的配置信息

Nacos服务分解储存模型

        这个看见有个文章写的不错,就直接引用了Nacos服务分级存储模型、集群、负载均衡 - 一杯水M - 博客园

修改一下yml配置文件即可

a、修改服务端口server.port=8083
b、设置spring.cloud.nacos.discovery.cluster-name=HZ or SH 这里修改的是集群名称
c、启动服务,如:UserApplication.java

Nacos负载均衡策略

NacosRule负载均衡策略:优先选择本地集群,在本地集群采取随机方式访问的方式,如果本地集群服务器挂掉,再去访问其他地区的集群

配置,在yml文件中改一下负载均衡策略

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule  #负载均衡规则--优先选择本地集群,在本地集群采取随机方式访问

Nacos权重策略:服务器的权重越高,被访问的频率越高

在浏览器登录nacos,直接在nacos的控制台编辑,设置服务器权重

 Nacos环境隔离

Nacos中服务储存和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离

  • 每个namespace都有唯一的id
  • 不同的namespace下的服务不可见(也就是不能相互访问)

具体步骤

  1. 在nacos控制台新建命名空间
  2. , 在yml文件中配置,添加一个namespace,内容填写命名空间的id,配置完重启服务
    cloud:
        nacos:
          server-addr: localhost:8848 #nacos服务地址
          discovery:
            cluster-name: HZ #集群名称
            namespace: b6f39d45-2e10-483b-af01-f2ea27f09cdc  #命名空间的id  把该服务归类到另一个命名空间

    隔离后不同的命名空间不可再相互访问

临时实例

临时的实例,后期可以手动停掉该服务的实例

在yml文件中配置

cloud:
    nacos:
      server-addr: localhost:8848 #nacos服务地址
      discovery:
        cluster-name: HZ #集群名称
        namespace: b6f39d45-2e10-483b-af01-f2ea27f09cdc  #命名空间的id  把该服务归类到另一个命名空间
        ephemeral: true  #是否是临时实例

Nacos和Eureka的区别

 相同点

  1. 都支持服务注册和服务拉取
  2. 都支持服务提供者心跳方式做健康检测(由服务提供者定期主动发送请求告知注册中心)

区别

  1. Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式(该模式效应速度快,但是会增大Nacos中心的工作压力)
  2. 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
  3. Nacos支持服务列表变更的推送模式,服务列表更新更及时
  4. Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;eureka采用AP方式

Nacos配置管理

nacos除了拥有Eureka的注册发现之外,还有配置管理功能,可以实现配置的热更新

配置管理的添加:在nacos控制台添加配置列表里添加新的配置,Data Id由服务名-环境.配置文件后缀名 组成

 

添加好配置后,项目启动读取配置文件应该先读取我们新添加的配置文件,再加载application.yml文件,所以需要把application.yml中的nacos地址给提取到一个新的文件,即优先级更高的bootstrap.yml文件,顺序如下:

项目启动——读取nacos中的配置文件(新建bootstrap.yml文件)——读取本地配置文件application.yml——创建spring容器——加载Bean 

步骤如下:

  1. 引入Nacos的配置管理依赖
     <!--nacos的配置管理依赖-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            </dependency>
  2. 在项目resource目录添加一个bootstrap.yml文件,该文件优先级更高,优于application.yml文件先加载,配置如下内容

    spring:
      application:
        name: userservice #服务名称
      profiles:
        active: dev #环境
      cloud:
        nacos:
          server-addr: localhost:8848 #nacos地址
          config:
            file-extension: yaml #文件后缀名   服务名称+环境+文件后缀名决定了data id

    这里的配置信息和我们在nacos控制台添加的配置的data id名字相对应

通过上诉步骤即可完成nacos简单的配置管理功能

Nacos热更新

热更新即在修改了nacos控制台的配置文件信息后,无需重启服务即可实现配置更新

实现热更新有两种方式

  1. 直接在类上添加@RefreshScope注解,实现自动更新,这里以之前配置的dateformat为例
    @RequestMapping("/user")
    @RefreshScope //实现nacos热更新注解
    public class UserController {
    
        @Autowired
        private UserService userService;
    
        @Value("${pattern.dateformat}")
        private String dateformat;
    
    
        @GetMapping("now")
        public String now(){
            return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
           );
        }
    }
    
  2. 通过@ConfigurationProperties注入,自动刷新,新建一个PatternProperties类

    @Data
    @Component
    @ConfigurationProperties(prefix = "pattern") //prefix = "pattern"表示所有以pattern开头的内容都实现自动更新
    public class PatternProperties {
        private String dateformat;
       
    }

    在控制层注入该类,实现自动更新

    @Slf4j
    @RestController
    @RequestMapping("/user")
        public class UserController {
    
            @Autowired
            private UserService userService;
    
            @Autowired
            private PatternProperties patternProperties;//注入刚刚新建的类
    
            @Value("${pattern.dateformat}")
            private String dateformat;
    
    
            @GetMapping("now")
            public String now(){
                return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));
            }
    
          
            }
        }
    

多环境配置共享

把一些共有的配置放在共享环境里面,这样所有的环境都可以读到该配置

该配置的data id为 服务名称.后缀 例如:userservice.yaml  该配置不受环境限制,可以实现属性共享

 

@Data
@Component
@ConfigurationProperties(prefix = "pattern") //prefix = "pattern"表示所有以pattern开头的内容都实现自动更新
public class PatternProperties {
    private String dateformat;
    private String envSharedValue;//添加一个属性
}
@RestController
@RequestMapping("/user")
@RefreshScope //实现nacos热更新注解
    public class UserController {

        @Autowired
        private UserService userService;

        @Autowired
        private PatternProperties patternProperties;


        @GetMapping("prop")
        public PatternProperties patternProperties(){
            return patternProperties;
        }

多种配置的优先级:

服务名-环境.yaml>服务名.yaml>本地配置

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐