分布式动态配置后浪推前浪 -- Nacos

互联网全栈架构

共 3971字,需浏览 8分钟

 · 2021-06-13

Spring Boot 作为主流微服务框架,拥有非常多的开发者。为了提升大家工作效率

整理个《专辑系列》,快速集成各大主流中间件框架

如:Mybatis、druid、Data JPA、Redis、Sharding-sphere、Guava、Caffeine、Ehcache、ElasticSearch、Kafka、Pulsar、Apollo、Nacos、OkHttp、HttpClient、gRPC、Dubbo、Seata 等等,

感兴趣请关注公众号 ---《微观技术》

🌴 前言

Nacos 是阿里巴巴的开源的项目,全称 Naming Configuration Service ,专注于服务发现和配置管理领域。

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

客户端语言方面目前支持 Java,go 、python、 C# 和 C++等主流语言

开源地址:https://github.com/alibaba/nacos


目前 Github上已经有近 18K 的 start,又有阿里巴巴复杂的业务做背书,在开源市场非常受欢迎。最近一次 commits 时间在2021年5月6日,社区维护投入力度很大,一些bug也能及时修复。

🌴 核心功能

1、动态配置服务

动态配置服务让您能够以中心化、外部化和动态化的方式管理所有环境的配置。动态配置消除了配置变更时重新部署应用和服务的需要。配置中心化管理让实现无状态服务更简单,也让按需弹性扩展服务更容易。


2、服务发现及管理

动态服务发现对以服务为中心的(例如微服务和云原生)应用架构方式非常关键。Nacos支持DNS-Based和RPC-Based(Dubbo、gRPC)模式的服务发现。Nacos也提供实时健康检查,以防止将请求发往不健康的主机或服务实例。借助Nacos,您可以更容易地为您的服务实现断路器。


3、动态DNS服务

通过支持权重路由,动态DNS服务能让您轻松实现中间层负载均衡、更灵活的路由策略、流量控制以及简单数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以DNS协议为基础的服务发现,以消除耦合到厂商私有服务发现API上的风险。

🌴 Nacos 2.x 优点

在Nacos 1.X 基础上,对通讯层做了优化,目前采用了gRPC实现了长连接和配置推动,使用长链接的好处大幅度减少了 1.x 轮询心跳频繁导致 JVM Full GC。

1、客户端不再需要定时发送实例心跳,只需要有一个维持连接可用 keepalive 消息即可。重复 TPS 可以大幅降低。

2、TCP 连接断开可以被快速感知到,提升反应速度。

3、长连接的流式推送,比 UDP 更加可靠;nio 的机制具有更高的吞吐量,而且由于可靠推送,可以加长客户端用于对账服务列表的时间,甚至删除相关的请求。重复的无效 QPS 可以大幅降低。

4、长连接避免频繁连接开销,可以大幅缓解 TIME_WAIT 问题。

5、真实的长连接,解决配置模块 GC 问题。

6、更细粒度的同步内容,减少服务节点间的通信压力。

🌴 Show me the code

外部依赖:

Spring Boot 已经为 Nacos 封装了starter组件,只需在 pom.xml 文件中添加jar版本依赖即可:

<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>nacos-config-spring-boot-starter</artifactId>
    <version>0.2.1</version>
</dependency>
<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>nacos-config-spring-boot-actuator</artifactId>
    <version>0.2.1</version>
</dependency>

配置文件:

在配置文件 application.yaml 中配置 Nacos 的相关参数,具体内容如下:

nacos:
  config:
    server-addr: 127.0.0.1:8848

就像Maven用groupIdartifactIdversion三者来定位一个jar包在仓库中的位置一样。Nacos也提供了 Namespace (命名空间) 、Data ID (配置集ID)、 Group (组) 来确定一个配置文件。

StartApplication 启动类,添加dataId:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,
        DataSourceTransactionManagerAutoConfiguration.class})
@NacosPropertySource(dataId = "bulking-nacos-example", autoRefreshed = true)
public class StartApplication {

    public static void main(String[] args) {
        SpringApplication.run(StartApplication.class, args);
    }
}

nacos提供了注解方式,实时动态获取配置项最新值

@Controller
@RequestMapping("config")
public class ConfigController {

    @NacosValue(value = "${useLocalCache}", autoRefreshed = true)
    private boolean useLocalCache;

    @RequestMapping(value = "/get", method = GET)
    @ResponseBody
    public boolean get() {
        return useLocalCache;
    }
}

🌴 操作演示

管理后台:

Nacos是一个用Java语言编写的web项目,Tomcat默认端口是8848,访问8848端口可以打开Nacos管理台。访问地址:http://localhost:8848/nacos/#/login

用户名和密码:nacos/nacos

新增动态配置

当应用启动时,会将当前节点注册到nacos中

首次访问:http://localhost:9071/config/get

返回结果:

true

将nacos中 Data Idbulking-nacos-example 中的 useLocalCache 设置成false

演示工程在不重启的情况下,能实时感知配置项的变化。

🌴 工程代码

https://github.com/aalansehaiyang/spring-boot-bulking  


模块:spring-boot-bulking-naco


推荐阅读:
亿级系统的Redis缓存如何设计
学会这10个设计原则,离架构师又进一步
知乎高赞:为什么Kafka需要Leader而Redis不需要
由浅入深逐步讲解Java并发的半壁江山AQS
再有人问你MySQL索引原理,就把这篇文章甩给他!

互联网全栈架构

浏览 41
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报