写点什么

认识 Nacos 注册中心

用户头像
登风
关注
发布于: 2021 年 01 月 29 日

什么是 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


用户头像

登风

关注

每天进步一点点 2013.10.11 加入

保持学习

评论

发布
暂无评论
认识Nacos注册中心