• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

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

武飞扬头像
清泉影月
帮助1

前言:

        最早一批接触使用 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.cloud</groupId>
  3.  
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  4.  
    </dependency>

版本关系:

  1.  
    <parent>
  2.  
    <groupId>org.springframework.boot</groupId>
  3.  
    <artifactId>spring-boot-starter-parent</artifactId>
  4.  
    <version>2.4.2</version>
  5.  
    </parent>
  6.  
     
  7.  
    <dependencyManagement>
  8.  
    <dependencies>
  9.  
    <dependency>
  10.  
    <groupId>org.springframework.cloud</groupId>
  11.  
    <artifactId>spring-cloud-dependencies</artifactId>
  12.  
    <version>2020.0.1</version>
  13.  
    <type>pom</type>
  14.  
    <scope>import</scope>
  15.  
    </dependency>
  16.  
    <dependency>
  17.  
    <groupId>com.alibaba.cloud</groupId>
  18.  
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  19.  
    <version>2021.1</version>
  20.  
    <type>pom</type>
  21.  
    <scope>import</scope>
  22.  
    </dependency>
  23.  
    </dependencies>
  24.  
    </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.  
     
  5.  
    @GetMapping(value = "/check")
  6.  
    public String test(@RequestParam(value = "name", defaultValue = "来自 nacos-client...", required = false) String name) {
  7.  
    return name;
  8.  
    }
  9.  
    }

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

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

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

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

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

五、Nacos 配置中心

1.核心依赖

  1.  
    <dependency>
  2.  
    <groupId>com.alibaba.cloud</groupId>
  3.  
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  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.  
    <!--SpringBoot2.4.x之后默认不加载bootstrap.yml文件,需要在pom里加上依赖-->
  2.  
    <dependency>
  3.  
    <groupId>org.springframework.cloud</groupId>
  4.  
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
  5.  
    </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.  
     
  10.  
    author:
  11.  
    name: 清泉影月
  1.  
    @RestController
  2.  
    @RefreshScope
  3.  
    @RequestMapping("/test")
  4.  
    public class TestController {
  5.  
     
  6.  
    @Value("${author.name}")
  7.  
    private String authorName;
  8.  
     
  9.  
    @GetMapping(value = "/getValue")
  10.  
    public String getValue() {
  11.  
    return authorName;
  12.  
    }
  13.  
    }

配置文件默认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 地址

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgjhaah
系列文章
更多 icon
同类精品
更多 icon
继续加载