微服务系列:nacos注册中心实战

柔光的暖阳◎ 2022-11-11 13:13 366阅读 0赞

文章目录

  • 前言
  • 一、官方文档
  • 二、原理说明
  • 三、实战演示
    • 服务提供者bank1
    • 服务消费者者bank2
  • 四、效果测试
  • 总结

前言

上一篇文章介绍了nacos作为配置中心如何在spring cloud中使用。今天介绍nacos作为注册中心在在spring cloud中使用


一、官方文档

官方文档:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

二、原理说明

在这里插入图片描述

三、实战演示

上一篇中建立了bank1工程演示nacos作为配置中心的使用,在本章中新建bank2工程,然后通过ServicID来请求bank1中的接口。

服务提供者bank1

1、添加依赖

  1. <!-- nacos注册中心-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  5. <version>2.2.1.RELEASE</version>
  6. </dependency>

2、新增注册中心配置

  1. spring.application.name=bank2
  2. server.port=8020
  3. spring.profiles.active=dev
  4. spring.cloud.nacos.username=nacos_bank1
  5. spring.cloud.nacos.password=123456
  6. spring.cloud.nacos.config.server-addr=localhost:8848
  7. spring.cloud.nacos.config.namespace=a284481e-b623-4c7d-a65a-e9009cba5f57
  8. spring.cloud.nacos.discovery.server-addr=localhost:8848
  9. spring.cloud.nacos.discovery.namespace=a284481e-b623-4c7d-a65a-e9009cba5f57

3、@EnableDiscoveryClient 开启服务发现

  1. @Slf4j
  2. @EnableDiscoveryClient
  3. @SpringBootApplication
  4. @RefreshScope
  5. public class Bank1Application {
  6. public static void main(String[] args) {
  7. SpringApplication.run(Bank1Application.class, args);
  8. log.info("bank1服务启动成功");
  9. }
  10. }

服务消费者者bank2

1、添加依赖
下面是我maven依赖配置。同样需要注意版本的对应关系。

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.2.5.RELEASE</version>
  5. <relativePath/> <!-- lookup parent from repository -->
  6. </parent>
  7. <groupId>com.laowan</groupId>
  8. <artifactId>spring-cloud</artifactId>
  9. <version>0.0.1-SNAPSHOT</version>
  10. <name>bank2</name>
  11. <description>bank2工程</description>
  12. <properties>
  13. <java.version>1.8</java.version>
  14. <skipTests>true</skipTests>
  15. </properties>
  16. <dependencies>
  17. <!--nacos配置中心-->
  18. <dependency>
  19. <groupId>com.alibaba.cloud</groupId>
  20. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  21. <version>2.2.1.RELEASE</version>
  22. </dependency>
  23. <!-- nacos注册中心-->
  24. <dependency>
  25. <groupId>com.alibaba.cloud</groupId>
  26. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  27. <version>2.2.1.RELEASE</version>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter</artifactId>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.springframework.boot</groupId>
  35. <artifactId>spring-boot-starter-web</artifactId>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.projectlombok</groupId>
  39. <artifactId>lombok</artifactId>
  40. <optional>true</optional>
  41. </dependency>
  42. <dependency>
  43. <groupId>org.springframework.boot</groupId>
  44. <artifactId>spring-boot-starter-test</artifactId>
  45. <scope>test</scope>
  46. </dependency>
  47. </dependencies>

2、添加注册中心属性

  1. spring.application.name=bank2
  2. server.port=8020
  3. spring.profiles.active=dev
  4. spring.cloud.nacos.username=nacos_bank1
  5. spring.cloud.nacos.password=123456
  6. spring.cloud.nacos.config.server-addr=localhost:8848
  7. spring.cloud.nacos.config.namespace=a284481e-b623-4c7d-a65a-e9009cba5f57
  8. spring.cloud.nacos.discovery.server-addr=localhost:8848
  9. spring.cloud.nacos.discovery.namespace=a284481e-b623-4c7d-a65a-e9009cba5f57

说明:
这里采用和bank1中相同的用户nacos_bank1,配置的用户需要对对应的注册中心的命名空间具有读写权限。且注册中心配置成和bank1中相同值,因为经测试发现只有相同命名空间的服务之间,才能通过ServiceID进行识别。

3、@EnableDiscoveryClient 开启服务发现
通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能:

  1. @Slf4j
  2. @EnableDiscoveryClient
  3. @SpringBootApplication
  4. @RefreshScope
  5. public class Bank2Application {
  6. @LoadBalanced
  7. @Bean
  8. public RestTemplate restTemplate() {
  9. return new RestTemplate();
  10. }
  11. public static void main(String[] args) {
  12. SpringApplication.run(Bank2Application.class, args);
  13. log.info("bank2服务启动成功");
  14. }
  15. }

配置服务消费者,从而服务消费者可以通过 Nacos 的服务注册发现功能从 Nacos server 上获取到它要调用的服务。

声明了RestTemplate对象,并添加了@LoadBalanced注解。

4、调用bank1接口

  1. @RestController
  2. @RequestMapping("/config")
  3. @RefreshScope
  4. public class ConfigController {
  5. @Value("${bank.name}")
  6. private String bankName;
  7. @Autowired
  8. private RestTemplate restTemplate;
  9. @RequestMapping("/get")
  10. public String get() {
  11. return bankName;
  12. }
  13. @GetMapping(value = "/getBank1")
  14. public String getBank1() {
  15. return restTemplate.getForObject("http://bank1/config/get" , String.class);
  16. }
  17. }

四、效果测试

1、启动bank1和bank2
在nacos控制台的服务列表中的bank1命名空间中,查看到服务名为bank1和bank2的2个服务。说明服务注册成功
在这里插入图片描述

2、通过ServcieID请求
请求bank2中的接口,调用bank1中/config/get接口来获取bank.name的属性。
请求链接:http://localhost:8020/config/getBank1
成功获取到bank1的属性。说明ServiceID为bank1的服务可以被bank2服务识别。
在这里插入图片描述
3、服务上线和下线
在bank1服务的详情界面,控制bank1服务下线。
在这里插入图片描述
再次请求http://localhost:8020/config/getBank1
这里需要注意:bank2服务从注册中心拉去的服务状态列表的list会有一定的时间的缓存。每隔一段时间重新拉取服务列表后,才会刷新bank1服务的本地状态,从而不能调用。所以测试的时候会发现虽然进行了bank1服务的下线操作,但是开始一段时间接口还是可以调用成功,稍等一会,bank1服务才会调用失败。

在这里插入图片描述
当控制服务bank1上线后,重新请求接口又能正常访问。

总结

采用nacos作为注册中心结合spring cloud使用非常简单。
主要有以下几步:
1、首先正确引入对应的maven依赖,需要注意jar包版本的对应关系。
2、配置nacos注册中心的相关属性,需要注意命名空间保持一致且配置的用户具有命名空间的读写权限。
3、启动类上添加@EnableDiscoveryClient开启服务发现
微服务之间的调用,本例中采用的是restTemplate。实际项目中更推荐采用Feign调用,由于非常简单,这里就不做演示。

需要注意的是,服务提供者和服务消费者配置的nacos命名空间一定要是同一个,否则尽管配置的用户具有多个命名空间的读写权限也不能识别,即不同命名空间的服务是不能相互识别的。

发表评论

表情:
评论列表 (有 0 条评论,366人围观)

还没有评论,来说两句吧...

相关阅读