前言
上一篇文章介绍了nacos作为配置中心如何在spring cloud中使用。今天介绍nacos作为注册中心在在spring cloud中使用
一、官方文档
官方文档:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
二、原理说明
三、实战演示
上一篇中建立了bank1工程演示nacos作为配置中心的使用,在本章中新建bank2工程,然后通过ServicID来请求bank1中的接口。
服务提供者bank1
1、添加依赖
<!-- nacos注册中心--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.2.1.RELEASE</version> </dependency>
2、新增注册中心配置
spring.application.name=bank2 server.port=8020 spring.profiles.active=dev spring.cloud.nacos.username=nacos_bank1 spring.cloud.nacos.password=123456 spring.cloud.nacos.config.server-addr=localhost:8848 spring.cloud.nacos.config.namespace=a284481e-b623-4c7d-a65a-e9009cba5f57 spring.cloud.nacos.discovery.server-addr=localhost:8848 spring.cloud.nacos.discovery.namespace=a284481e-b623-4c7d-a65a-e9009cba5f57
3、@EnableDiscoveryClient 开启服务发现
@Slf4j @EnableDiscoveryClient @SpringBootApplication @RefreshScope public class Bank1Application { public static void main(String[] args) { SpringApplication.run(Bank1Application.class, args); log.info("bank1服务启动成功"); } }
服务消费者者bank2
1、添加依赖
下面是我maven依赖配置。同样需要注意版本的对应关系。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.laowan</groupId> <artifactId>spring-cloud</artifactId> <version>0.0.1-SNAPSHOT</version> <name>bank2</name> <description>bank2工程</description> <properties> <java.version>1.8</java.version> <skipTests>true</skipTests> </properties> <dependencies> <!--nacos配置中心--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2.2.1.RELEASE</version> </dependency> <!-- nacos注册中心--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.2.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
2、添加注册中心属性
spring.application.name=bank2 server.port=8020 spring.profiles.active=dev spring.cloud.nacos.username=nacos_bank1 spring.cloud.nacos.password=123456 spring.cloud.nacos.config.server-addr=localhost:8848 spring.cloud.nacos.config.namespace=a284481e-b623-4c7d-a65a-e9009cba5f57 spring.cloud.nacos.discovery.server-addr=localhost:8848 spring.cloud.nacos.discovery.namespace=a284481e-b623-4c7d-a65a-e9009cba5f57
说明:
这里采用和bank1中相同的用户nacos_bank1,配置的用户需要对对应的注册中心的命名空间具有读写权限。且注册中心配置成和bank1中相同值,因为经测试发现只有相同命名空间的服务之间,才能通过ServiceID进行识别。
3、@EnableDiscoveryClient 开启服务发现
通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能:
@Slf4j @EnableDiscoveryClient @SpringBootApplication @RefreshScope public class Bank2Application { @LoadBalanced @Bean public RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(Bank2Application.class, args); log.info("bank2服务启动成功"); } }
配置服务消费者,从而服务消费者可以通过 Nacos 的服务注册发现功能从 Nacos server 上获取到它要调用的服务。
声明了RestTemplate对象,并添加了@LoadBalanced注解。
4、调用bank1接口
@RestController @RequestMapping("/config") @RefreshScope public class ConfigController { @Value("${bank.name}") private String bankName; @Autowired private RestTemplate restTemplate; @RequestMapping("/get") public String get() { return bankName; } @GetMapping(value = "/getBank1") public String getBank1() { return restTemplate.getForObject("http://bank1/config/get" , String.class); } }
四、效果测试
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命名空间一定要是同一个,否则尽管配置的用户具有多个命名空间的读写权限也不能识别,即不同命名空间的服务是不能相互识别的。