目录
什么是 Nacos
注册中心的选择
nacos 核心能力
扩展集成能力
实践
nacos 服务发现
配置动态更新
总结
什么是 Nacos
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您实现动态服务发现、服务配置管理、服务及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构(例如微服务范式、云原生范式)的服务基础设施
注册中心的选择
我们都知道以前提注册中心就想起 Zookeeper,一般会把注册中心和 zk 画上等号,但随着技术的发展和开源生态的丰富,我们发现可选择的注册中心不止 zk,而且可能更好用,使 zk 大火的是阿里的 dubbo,因为其加入了 spring 阵营,dubbo 成为服务发现/治理的一种选择,甚至一些中型公司都将把 dubbo 作为微服务的核心组件,但今天我们不谈 dubbo,谈谈 nacos。dubbo 可以将注册中心改为 nacos,同样是阿里生态,集成更加容易。
nacos 核心能力
服务发现、服务治理,这里暂且不表
配置中心最核心的能力就是配置的动态推送,常见的配置中心还有 Apollo 都实现了这样的能力,但 Apollo 没有服务发现和服务治理的能力,是纯配置中心,原理和 nacos 的配置服务类似,都能保证高可用和集群化
我们在开发过程中,一般会在配置文件中设置配置中心的变量,而具体详细的配置写在配置中心具体的配置中,nacos 中用 Data Id 来表示每一个唯一的配置,其中命名空间来区分不同环境的配置
扩展集成能力
nacos 除了有服务注册和服务发现、服务治理能力外,还可以和 Alibaba 其他开源组件集成,例如 Alibaba Sentinel 使用 nacos 持久化 限流配置,如果系统为大流量高并发的可以考虑这个方案作为限流手段,当然限流还有其他的手段,比如最好是在网关层(Kong 网关和业务服务分离)用 redis+lua 脚本来限流。
实践
nacos 服务发现
微服务 dubbo 生成者配置,注意 12 行的配置中心改为了 nacos
server:
port: 8861
dubbo:
# 配置服务信息
application:
name: dubbo-provider
# 禁用QOS同一台机器可能会有端口冲突现象
qos-enable: false
qos-accept-foreign-ip: false
# 配置注册中心
registry:
address: nacos://191.168.0.31:8848
# 设置协议-协议由提供方指定消费方被动接受
protocol:
name: dubbo
port: 20880
spring:
main:
# 解决Bean重复定义问题
allow-bean-definition-overriding: true
复制代码
服务启动类 ProviderApplication
@EnableNacos(globalProperties = @NacosProperties(serverAddr = "192.168.0.31:8848"))
@EnableDubbo //开启Dubbo的注解支持
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
复制代码
启动后在 nacos 服务列表中就能看到我们发布的 dubbo 提供者服务
服务消费者类似服务提供者,这里不再举例
配置动态更新
直接上代码,其中 autoRefreshed = true 表示支持配置动态更新,nacos 中的 dataId 配置修改会更新到服务的内存中,原理是通过长轮询的方式拉取
package com.test.nacos.conf;
import com.alibaba.nacos.api.annotation.NacosInjected;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>Description: nacos配置自动更新测试,修改nacos上配置,将自动读取到内存替换最新值</p>
*
* @author zhuyoulong
* @date 2020-12-25
*/
@RestController
@RequestMapping("/config")
@Slf4j
@NacosPropertySource(dataId = "nacos.cfg.dataId", autoRefreshed = true)
public class NacosConfigController {
@NacosInjected
private ConfigService configService;
/**
*在nacos配置服务中nacos.cfg.dataId的值要配置成:useLocalCache=false
*/
@NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)
private boolean useLocalCache;
/**
* 获取配置
* @return
*/
@GetMapping(value = "/get")
public String getConfig(){
log.info("useLocalCache={}",useLocalCache);
String dataId = "nacos.cfg.dataId";
String defaultGroup = "DEFAULT_GROUP";
long timeOutms = 1000;
try {
return configService.getConfig(dataId,defaultGroup,timeOutms);
} catch (NacosException e) {
log.error("获取配置异常",e);
}
return null;
}
}
复制代码
将配置中的变量从 true 改为 false,并发布,看看服务内存中该变量值的变化
我们看到服务控制台的日志打印变量的值为修改后的值 false
2021-01-29 14:46:58.991 INFO 15808 --- [nio-8863-exec-1] c.test.nacos.conf.NacosConfigController : useLocalCache=false
复制代码
配置监听
当nacos对应的dataId配置变更,程序能监听到数据的变化,这样我们可以做进一步的业务操作,比如根据获取的值比对通知下游服务进行状态变更等
@NacosConfigListener(dataId = "apk.version.cfg")
public void onMessage(String msg){
System.out.println("配置变动"+msg);
}
总结
1、本文介绍了 nacos 的服务发现,动态配置推送,实现准实时的配置更新
2、通过一个 demo 实践了服务发现和动态更新的演示
更多请参考 nacos 官方:https://nacos.io/zh-cn/docs/quick-start.html