系列文章目录
Nacos快速入门(1):启动Nacos Server
Nacos快速入门(2):整合Spring
Nacos快速入门(3):整合SpringBoot
Nacos快速入门(4):整合SpringCloud
Nacos整合示例完整代码地址:https://github.com/mrKyleWang/nacos_demo
一、spring应用接入Nacos
- 启动Nacos Server,参见
Nacos快速入门(1):启动Nacos Server - 项目中需要添加依赖
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-spring-context</artifactId>
<version>RELEASE</version>
</dependency>
二、配置管理功能示例
示例场景:模拟用户服务获取配置中心的username属性,在getUser接口中返回
- 使用config类开启 Nacos Spring 的配置管理服务
- 添加 @EnableNacosConfig 注解启用 Nacos Spring 的配置管理服务,serverAddr配置nacos server地址
- 使用 @NacosPropertySource 加载了 dataId 为 example 的配置源,并启用自动刷新
@Configuration
@EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848"))
@NacosPropertySource(dataId = "example", autoRefreshed = true)
public class NacosConfiguration {
}
- 通过 Nacos 的 @NacosValue 注解设置属性值。
如下所示,加载配置中username的值,如果没有则为”null”,启动自动刷新
@Controller
public class UserController {
@NacosValue(value = "${username:null}", autoRefreshed = true)
private String username;
@RequestMapping(value = "/getUser")
@ResponseBody
public String getUser() {
return username;
}
}
- 请求getUser接口,返回null
curl -X GET "http://127.0.0.1:8082/user/getUser"
null
- 增加配置(两种方式示例)
(1). Nacos管理界面添加配置
(2). 调用open api添加配置(注意使用Post方法请求)
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=example&group=DEFAULT_GROUP&content=username=zhangsan"
- 再次调用接口,测试发现配置已更新
curl -X GET "http://127.0.0.1:8082/user/getUser"
zhangsan
三、服务注册/服务发现示例
示例场景:模拟订单服务在getOrder接口中通过nacos服务发现调用user_server的getUser接口获取username,返回结果
- 创建config类,通过添加 @EnableNacosDiscovery 注解开启 Nacos Spring 的服务发现功能
@Configuration
@EnableNacosDiscovery(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848"))
public class NacosConfiguration {
}
- 使用 @NacosInjected 注入 Nacos 的 NamingService 实例,并使用namingService获取提供”user_service”服务的实例,通过restTemplate调用其getUser接口
@Controller
public class OrderController {
private static final Logger logger = LoggerFactory.getLogger(OrderController.class);
@NacosInjected
private NamingService namingService;
private RestTemplate restTemplate = new RestTemplate();
@RequestMapping(value = "/getOrder")
@ResponseBody
public Map<String, Object> getOrder() {
Map<String, Object> order = new HashMap<>();
order.put("username", queryUserName());
order.put("money", 100.00);
return order;
}
private String queryUserName() {
try {
if (namingService != null) {
// 选择user_service服务的一个健康的实例(可配置负载均衡策略)
Instance instance = namingService.selectOneHealthyInstance("user_service");
// 拼接请求接口url并请求选取的实例
String url = "http://" + instance.getIp() + ":" + instance.getPort() + "/user/getUser";
ResponseEntity<String> entity = restTemplate.getForEntity(url, String.class);
return entity.getBody();
}
} catch (Exception e) {
logger.error("query user error", e);
}
return null;
}
}
- 通过调用nacos接口(注意使用put请求),手动注册user_service实例,将第一个示例中的用户服务地址注册到nacos
curl -X PUT "http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=user_service&ip=127.0.0.1&port=8082"
- Nacos管理界面可以看到新增的服务实例,说明注册成功
- 调用订单服务的getOrder接口,返回正确结果
curl -X GET "http://127.0.0.1:8081/order/getOrder"
{"money":100.0,"username":"zhangsan"}