一、前言
在spring boot项目开发过程中,为了进行微服务之间的调用,我们一般会使用注册中心,比如Nacos
。假设我们有一个业务需求,应用A需要从Nacos
注册中心上获取服务信息进行分析,需要怎么实现呢?
二、开发步骤
1.搭建Nacos注册中心
Nacos注册中心的搭建,可以参考我之前的文章:nacos安装手册
2. 新建测试服务
我们新建一个Spring Boot项目作为测试服务,该服务没有任何业务逻辑,只是注册到Nacos注册中心上。
-
导入Nacos相关依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2021.0.5.0</version> </dependency>
-
增加Nacos相关配置
spring: application: name: testdemo cloud: nacos: discovery: enabled: true namespace: public username: nacos password: nacos server-addr: 127.0.0.1:8848
-
启动项目,通过注册查看是否注册成功
可以看到此时测试应用已经成功注册到nacos注册中心了。
3.新建获取服务列表的应用
新建一个应用,用于获取注册中心上的服务列表,新建一个spring boot项目。
-
导入Nacos相关依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2021.0.5.0</version> </dependency>
-
增加Nacos相关配置
spring: application: name: getInstanceDemo cloud: nacos: discovery: enabled: true namespace: public username: nacos password: nacos register-enabled: false # 注意:该服务无需注册到注册中心上,只用于获取注册中心上的服务信息就行了 server-addr: 127.0.0.1:8848
-
编写获取服务的测试逻辑
import com.alibaba.cloud.nacos.NacosDiscoveryProperties; import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.api.naming.pojo.Instance; import com.alibaba.nacos.client.naming.NacosNamingService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.PostConstruct; import java.util.HashMap; import java.util.List; import java.util.Map; @RestController public class InstanceController { /** * 获取nacos属性配置信息 */ @Autowired private NacosDiscoveryProperties nacosDiscoveryProperties; NacosNamingService nacosNamingService = null; @PostConstruct public void init() throws NacosException { /** * 构建获取nacos服务信息 */ nacosNamingService = new NacosNamingService(nacosDiscoveryProperties.getNacosProperties()); } @RequestMapping("/getInstance") public Map<String, Object> getInstance() { Map<String, Object> resultMap = new HashMap<>(); try { /** * 获取服务名称为testdemo的服务列表信息 */ List<Instance> instances = nacosNamingService.getAllInstances("testdemo"); resultMap.put("200", instances); } catch (NacosException e) { e.printStackTrace(); resultMap.put("500", e.getMessage()); } return resultMap; } }
正常启动服务。
4.测试
- 等服务都启动好以后,访问测试接口
可以看到,服务列表信息获取成功了。
-
本地停止测试注册服务testdemo,重新访问测试接口
此时获取的服务列表为空了。
更多nacos使用方法可以参考nacos官方手册:https://nacos.io/docs/latest/what-is-nacos/