微服务系列:nacos注册中心实战
文章目录
- 前言
- 一、官方文档
- 二、原理说明
- 三、实战演示
- 服务提供者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、添加依赖
<!-- 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命名空间一定要是同一个,否则尽管配置的用户具有多个命名空间的读写权限也不能识别,即不同命名空间的服务是不能相互识别的。
还没有评论,来说两句吧...