什么是 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
复制代码
总结
1、本文介绍了 nacos 的服务发现,动态配置推送,实现准实时的配置更新
2、通过一个 demo 实践了服务发现和动态更新的演示
更多请参考 nacos 官方:https://nacos.io/zh-cn/docs/quick-start.html
评论