什么是 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: 8861dubbo: # 配置服务信息 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: 20880spring: main: # 解决Bean重复定义问题 allow-bean-definition-overriding: true
复制代码
服务启动类 ProviderApplication
@EnableNacos(globalProperties = @NacosProperties(serverAddr = "192.168.0.31:8848"))@EnableDubbo //开启Dubbo的注解支持@SpringBootApplicationpublic 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
复制代码
总结
1、本文介绍了 nacos 的服务发现,动态配置推送,实现准实时的配置更新
2、通过一个 demo 实践了服务发现和动态更新的演示
更多请参考 nacos 官方:https://nacos.io/zh-cn/docs/quick-start.html
评论