写点什么

Nacos 实践

发布于: 2021 年 04 月 17 日
Nacos实践

系列文章:

微服务架构:网关概念与 zuul

微服务网关:Spring Cloud Gateway —— Zuul

微服务网关:Spring Cloud Config- 配置中心

微服务网关方案:Kong & Nacos


一 摘要

前面介绍了网关的相关方案,对 Zuul、Spring Cloud Config 配置中心进行了部分源码分析;并在上一篇介绍了 Kong 和 Nacos 的架构。本篇将基于 nacos 的 git 源码,拉取到本地后通过 example 来了解基本的使用方式。

二 nacos 环境

2.1 本地环境

采用的是源码方式,

git clone https://github.com/alibaba/nacos.git
复制代码

默认分支为 develop 分支。

2.2 目录结构

目录中共包含 17 个 module,另外四个目录,doc 中只有 nacos 图标;resources 中是 copyright 文本;style 中不是样式文件,而是 code style,也就是代码风格的说明;consule-ui 是控制台 ui 的前端代码。


这里我们先重点关注 nacos-example,通过跑通 example,可以快速掌握 nacos 的使用方式,并可以由此渗透到运行过程中涉及的源码。

三 nacos-example

示例包括 Naming 服务、配置中心 Config 和 App 应用。

3.1 NamingExample

1)如下代码所示,创建 NamingService,重点是两个参数:serverAddr 和 namespace,即服务地址和命名空间;

Properties properties = new Properties();properties.setProperty("serverAddr", System.getProperty("serverAddr"));properties.setProperty("namespace", System.getProperty("namespace"));
NamingService naming = NamingFactory.createNamingService(properties);
复制代码

2)命名服务创建完成后,即可注册实例:

naming.registerInstance("nacos.test.3", "11.11.11.11", 8888, "TEST1");
naming.registerInstance("nacos.test.3", "2.2.2.2", 9999, "DEFAULT");//也可以取消注册naming.deregisterInstance("nacos.test.3", "2.2.2.2", 9999, "DEFAULT");
复制代码

3)可以自定义线程池,订阅 nameservice 的某个实例,当事件发生时,触发自定义的 Listener 处理预期的处理逻辑:

Executor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(),        new ThreadFactory() {            @Override            public Thread newThread(Runnable r) {                Thread thread = new Thread(r);                thread.setName("test-thread");                return thread;            }        });
naming.subscribe("nacos.test.3", new AbstractEventListener() {
//EventListener onEvent is sync to handle, If process too low in onEvent, maybe block other onEvent callback. //So you can override getExecutor() to async handle event. @Override public Executor getExecutor() { return executor; }
@Override public void onEvent(Event event) { System.out.println(((NamingEvent) event).getServiceName()); System.out.println(((NamingEvent) event).getInstances()); }});
复制代码


3.2 ConfigExample

1)nacos 的配置中心与 Spring Cloud Config 类似,通过服务地址、数据 id、分组来定位一个配置文件,而后通过 configService 的 getConfig 方法来获取配置内容:

String serverAddr = "localhost";String dataId = "test";String group = "DEFAULT_GROUP";Properties properties = new Properties();properties.put("serverAddr", serverAddr);ConfigService configService = NacosFactory.createConfigService(properties);String content = configService.getConfig(dataId, group, 5000);System.out.println(content);
复制代码

2)与 NamingService 类似,ConfigService 也支持定义事件监听,不过监听的内容是 dataId 和 分组(group):

configService.addListener(dataId, group, new Listener() {    @Override    public void receiveConfigInfo(String configInfo) {        System.out.println("receive:" + configInfo);    }
@Override public Executor getExecutor() { return null; }});
boolean isPublishOk = configService.publishConfig(dataId, group, "content");System.out.println(isPublishOk);
Thread.sleep(3000);content = configService.getConfig(dataId, group, 5000);System.out.println(content);
boolean isRemoveOk = configService.removeConfig(dataId, group);System.out.println(isRemoveOk);Thread.sleep(3000);
content = configService.getConfig(dataId, group, 5000);System.out.println(content);Thread.sleep(300000);
复制代码


3.3 App

实际上就是 NamingExample 的一个子集,包含 3.1 中创建 NamingService、注册实例、获取实例列表的部分功能。

Properties properties = new Properties();properties.setProperty("serverAddr", "21.34.53.5:8848,21.34.53.6:8848");properties.setProperty("namespace", "quickStart");NamingService naming = NamingFactory.createNamingService(properties);naming.registerInstance("nacos.test.3", "11.11.11.11", 8888, "TEST1");naming.registerInstance("nacos.test.3", "2.2.2.2", 9999, "DEFAULT");System.out.println(naming.getAllInstances("nacos.test.3"));
复制代码


发布于: 2021 年 04 月 17 日阅读数: 32
用户头像

磨炼中成长,痛苦中前行 2017.10.22 加入

微信公众号【程序员架构进阶】。多年项目实践,架构设计经验。曲折中向前,分享经验和教训

评论

发布
暂无评论
Nacos实践