系列文章:
微服务架构:网关概念与 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"));
复制代码
评论