SpringCloud集成Nacos 做注册中心和配置中心

前言:

        最早一批接触使用 spring cloud 的同学都晓得官方出品的 eureka。当年被寄予厚望,不过很可惜在 2018 年的时候 Netflix 团队放弃了 eureka 的维护,并且今年(2022 年)初 Netflix 又放弃了 Ribbon 的维护,这也就导致 openfeign 的某些功能也受到了影响(spring-cloud-loadbalancer 为其替代)。目前市面上存在比较多的注册中心就三个,zookeeper,eureka,nacos;zookeeper 用的范围最广,稳定性也是经过长时间考验,但给 springcloud 当注册中心说实话我没见过,也可可能是我孤陋寡闻;eureka 存在的应该会比nacos多,毕竟是 spring cloud 官方指定初代注册中心,虽说在 18 年停止维护,但是当年用的人很多啊,项目也都沉淀下来了。一般情况下,当一个比较流行的组件停止维护后还能活跃至少 3-5 年,5年后就要考虑替换了;像我们这边,老项目用的就是 eureka,去年的新项目换成了 nacos,至于老项目为啥不换,懂的都懂......

一、nacos 简介

推荐查阅官网文档:Nacos 官方网站

里面有一个可以用来吹牛皮的图:

SpringCloud集成Nacos 做注册中心和配置中心_第1张图片

对于程序员来说,我们能用到的就是右上角的红框圈出来的两个:服务发现+配置管理。

二、Nacos 获取

GitHub 项目地址:Nacos

历史稳定版本地址:Nacos稳定版本

可以从上述获取源码自己打包,也可以直接获取打包好的工程。

三、Nacos 启动

下面只说单机启动,如果集群部署请参考官方文档。

1.切换到 /nacos/bin 目录下

2.linux 启动

# ubuntu 使用 bash 启动
sh startup.sh -m standalone

3.windows 启动

startup.cmd -m standalone

备注:如果不喜欢加启动参数启动,可以打开脚本,把 MODE 参数值赋予 standalone,这样 windows 下双击启动脚本即可。

启动后可以在 http://ip:8848/nacos/index.html 界面打开Nacos(默认账号:nacos/nacos)

四、Nacos 服务发现

1. 依赖和配置

使用 nacos 之前必须要确定 Spring Cloud Alibaba、Spring Cloud、Spring Boot 之间的关系,三者关系必须协调,否则无法使用,一定切记。详细版本关系参见:版本关系

核心相关依赖:

        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        

版本关系:

    
        org.springframework.boot
        spring-boot-starter-parent
        2.4.2
    

    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                2020.0.1
                pom
                import
            
            
                com.alibaba.cloud
                spring-cloud-alibaba-dependencies
                2021.1
                pom
                import
            
        
    

配置:

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

主程序需要添加 @EnableDiscoveryClient 注解(其实当前版本不添加也行,添加主要是为了方便维护)

按照上述启动两个服务 nacos-client,nacos-client-1,启动后可以在nacos看到两个服务,如下:

SpringCloud集成Nacos 做注册中心和配置中心_第2张图片

2.服务调用测试

在nacos-client 配置一个接口:

@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping(value = "/check")
    public String test(@RequestParam(value = "name", defaultValue = "来自 nacos-client...", required = false) String name) {
        return name;
    }
}

 nacos-client-1 配置另一个接口来调用上述接口:

@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    RestTemplate restTemplate;

    @GetMapping(value = "/check")
    public String test() {
        String servicePreName = "http://nacos-client";
        ResponseEntity result = restTemplate.getForEntity(servicePreName + "/test/check", String.class);
        log.info("result:{}", result);
        return result.getBody();
    }
}

nacos-client-1 直接调用 /test/check 会报 【java.net.UnknownHostException: nacos-client 】错;这跟负载均衡有关,需要在 nacos-client-1 引入一个依赖并对 RestTemplate 增加负载均衡注解,如下:

        
            org.springframework.cloud
            spring-cloud-starter-loadbalancer
        
@Configuration
public class RestConfig {

    @Bean
    @LoadBalanced
    public RestTemplate normal() {
        return new RestTemplate();
    }
}

备注:远程调用建议使用 openfeign,有消费降级,效果会好一些。

五、Nacos 配置中心

1.核心依赖

        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-config
        

2.配置文件改造

原来的 application.yml、application-xx.yml 都替换成 bootstrap.yml、bootstrap-xx.yml,springcloud 的配置仍然参照上节配置。

如果直接启动就会发现报错【java.lang.IllegalArgumentException: Param 'serviceName' is illegal, serviceName is blank】,报错原因是2.4以后工程默认不会读取 bootstrap 文件,所以这里还要再引入一个依赖:

        
        
            org.springframework.cloud
            spring-cloud-starter-bootstrap
        

3.测试修改配置是否生效

配置文件添加下述配置,Controller 层使用 @Value 注解获取该值

注意:使用 @Value 注解获取配置值时需要在类上加 @RefreshScope 注解,【@ConfigurationProperties 这种配置方式不需要加】

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        refresh-enabled: true    # 该版本默认为 true,可不添加
#       file-extension: yaml     # 该配置添加 yaml 配置文件支持,添加后就只支持 yaml 后缀的配置

author:
  name: 清泉影月
@RestController
@RefreshScope
@RequestMapping("/test")
public class TestController {

    @Value("${author.name}")
    private String authorName;

    @GetMapping(value = "/getValue")
    public String getValue() {
        return authorName;
    }
}

配置文件默认Data Id如下:

dataID={prefix}-{spring.profiles.active}.{spring.cloud.nacos.config.file-extension}
  1. prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  2. prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  3. spring.profiles.active 即为当前环境对应的 profile,当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  4. file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

Nacos 界面添加配置: 

SpringCloud集成Nacos 做注册中心和配置中心_第3张图片

SpringCloud集成Nacos 做注册中心和配置中心_第4张图片

默认情况下该配置只支持 properties 格式,点击发布后可从接口获取新值:

SpringCloud集成Nacos 做注册中心和配置中心_第5张图片

 六、最后

1. springboot 2.4.x 的版本跟之前相比变动较大,相对应的 springcloud,和springcloud alibaba 做的改变也较大,推荐可以使用低版本或者等版本稳定后使用更高版本。

2. 有问题参考官方文档:Nacos 中文手册

3. GitHub 地址:Nacos github 地址

你可能感兴趣的:(微服务,java,spring,cloud,Nacos,配置中心,注册中心)