Nacos快速入门(2):整合Spring实现配置管理和服务发现

系列文章目录

Nacos快速入门(1):启动Nacos Server
Nacos快速入门(2):整合Spring
Nacos快速入门(3):整合SpringBoot
Nacos快速入门(4):整合SpringCloud
Nacos整合示例完整代码地址:https://github.com/mrKyleWang/nacos_demo

一、spring应用接入Nacos

<dependency>
	<groupId>com.alibaba.nacos</groupId>
	<artifactId>nacos-spring-context</artifactId>
	<version>RELEASE</version>
</dependency>

二、配置管理功能示例

示例场景:模拟用户服务获取配置中心的username属性,在getUser接口中返回

  1. 使用config类开启 Nacos Spring 的配置管理服务
    1. 添加 @EnableNacosConfig 注解启用 Nacos Spring 的配置管理服务,serverAddr配置nacos server地址
    2. 使用 @NacosPropertySource 加载了 dataId 为 example 的配置源,并启用自动刷新
@Configuration
@EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848"))
@NacosPropertySource(dataId = "example", autoRefreshed = true)
public class NacosConfiguration {
}
  1. 通过 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;
	}
}
  1. 请求getUser接口,返回null
curl -X GET "http://127.0.0.1:8082/user/getUser"
null
  1. 增加配置(两种方式示例)
    (1). Nacos管理界面添加配置
    Sample
    (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"
  1. 再次调用接口,测试发现配置已更新
curl -X GET "http://127.0.0.1:8082/user/getUser"
zhangsan

三、服务注册/服务发现示例

示例场景:模拟订单服务在getOrder接口中通过nacos服务发现调用user_server的getUser接口获取username,返回结果

  1. 创建config类,通过添加 @EnableNacosDiscovery 注解开启 Nacos Spring 的服务发现功能
@Configuration
@EnableNacosDiscovery(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848"))
public class NacosConfiguration {
}
  1. 使用 @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;
	}
}
  1. 通过调用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"
  1. Nacos管理界面可以看到新增的服务实例,说明注册成功
    Sample
    Sample
  2. 调用订单服务的getOrder接口,返回正确结果
curl -X GET "http://127.0.0.1:8081/order/getOrder"
{"money":100.0,"username":"zhangsan"}
发布了35 篇原创文章 · 获赞 104 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/wk52525/article/details/88098946