• 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 官方网站

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

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

    二、Nacos 获取

    GitHub 项目地址:Nacos

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

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

    三、Nacos 启动

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

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

    2.linux 启动

    1. # ubuntu 使用 bash 启动
    2. 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 之间的关系,三者关系必须协调,否则无法使用,一定切记。详细版本关系参见:版本关系

    核心相关依赖:

    1. <dependency>
    2. <groupId>com.alibaba.cloudgroupId>
    3. <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    4. dependency>

    版本关系:

    1. <parent>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-parentartifactId>
    4. <version>2.4.2version>
    5. parent>
    6. <dependencyManagement>
    7. <dependencies>
    8. <dependency>
    9. <groupId>org.springframework.cloudgroupId>
    10. <artifactId>spring-cloud-dependenciesartifactId>
    11. <version>2020.0.1version>
    12. <type>pomtype>
    13. <scope>importscope>
    14. dependency>
    15. <dependency>
    16. <groupId>com.alibaba.cloudgroupId>
    17. <artifactId>spring-cloud-alibaba-dependenciesartifactId>
    18. <version>2021.1version>
    19. <type>pomtype>
    20. <scope>importscope>
    21. dependency>
    22. dependencies>
    23. dependencyManagement>

    配置:

    1. spring:
    2. cloud:
    3. nacos:
    4. discovery:
    5. server-addr: localhost:8848

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

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

    2.服务调用测试

    在nacos-client 配置一个接口:

    1. @RestController
    2. @RequestMapping("/test")
    3. public class TestController {
    4. @GetMapping(value = "/check")
    5. public String test(@RequestParam(value = "name", defaultValue = "来自 nacos-client...", required = false) String name) {
    6. return name;
    7. }
    8. }

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

    1. @RestController
    2. @RequestMapping("/test")
    3. public class TestController {
    4. @Autowired
    5. RestTemplate restTemplate;
    6. @GetMapping(value = "/check")
    7. public String test() {
    8. String servicePreName = "http://nacos-client";
    9. ResponseEntity result = restTemplate.getForEntity(servicePreName + "/test/check", String.class);
    10. log.info("result:{}", result);
    11. return result.getBody();
    12. }
    13. }

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

    1. <dependency>
    2. <groupId>org.springframework.cloudgroupId>
    3. <artifactId>spring-cloud-starter-loadbalancerartifactId>
    4. dependency>
    1. @Configuration
    2. public class RestConfig {
    3. @Bean
    4. @LoadBalanced
    5. public RestTemplate normal() {
    6. return new RestTemplate();
    7. }
    8. }

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

    五、Nacos 配置中心

    1.核心依赖

    1. <dependency>
    2. <groupId>com.alibaba.cloudgroupId>
    3. <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
    4. dependency>

    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 文件,所以这里还要再引入一个依赖:

    1. <dependency>
    2. <groupId>org.springframework.cloudgroupId>
    3. <artifactId>spring-cloud-starter-bootstrapartifactId>
    4. dependency>

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

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

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

    1. spring:
    2. cloud:
    3. nacos:
    4. discovery:
    5. server-addr: localhost:8848
    6. config:
    7. refresh-enabled: true # 该版本默认为 true,可不添加
    8. # file-extension: yaml # 该配置添加 yaml 配置文件支持,添加后就只支持 yaml 后缀的配置
    9. author:
    10. name: 清泉影月
    1. @RestController
    2. @RefreshScope
    3. @RequestMapping("/test")
    4. public class TestController {
    5. @Value("${author.name}")
    6. private String authorName;
    7. @GetMapping(value = "/getValue")
    8. public String getValue() {
    9. return authorName;
    10. }
    11. }

    配置文件默认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 界面添加配置: 

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

     六、最后

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

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

    3. GitHub 地址:Nacos github 地址

  • 相关阅读:
    win10 编译 FFmpeg (MSYS2 + MSVC 64 )
    iOS代码混淆教程
    【Linux】3.切换操作系统
    角速度变化时四元数和旋转矩阵微分方程的证明
    【故障诊断】用于轴承故障诊断的候选故障频率优化克改进包络频谱研究(Matlab代码实现)
    随机过程理论知识(三)
    电容元件符号与工作原理:电子电路中的电荷储存利器 | 百能云芯
    SignalR简介及实践指南
    【论文翻译】分布式数据库中的并发控制方法:回顾与比较
    企业IP地址跟踪
  • 原文地址:https://blog.csdn.net/qingquanyingyue/article/details/126201726