Nacos教程

Nacos简介


Nacos 是阿里巴巴团队开源的一款动态服务发现、配置和管理平台。
项目源码地址:https://github.com/alibaba/nacos

三大注册中心对比:

名称 配置中心 注册中心 依赖 访问协议 版本迭代 集成支持 上手程度
Eureka 不支持 支持 不依赖其他组件 HTTP 无版本升级 SpringCloud集成 容易,英文界面
Consul 支持 支持 不依赖其他组件 HTTP/DNS 版本迭代中 SpringCloud、K8S 容易,英文界面
Nacos 支持 支持 不依赖其他组件 HTTP/动态DNS/UDP 版本迭代中 Dubbo、SpringCloud、K8S 容易、中文社区文档

主要特性
特性:

  • 服务发现:支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的 Agent TODO 注册 Service 后,服务消费者可以使用 DNS TODO 或 HTTP&API 查找和发现服务。
  • 服务健康监测:提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。
  • 动态配置服务:动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
  • 动态 DNS 服务:动态 DNS 服务支持权重路由,使用者更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。
  • 服务及其元数据管理:Nacos 能让使用者从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

Nacos的安装

可以通过源码和发行包两种方式来安装Nacos

方式一:源码安装

1
2
3
4
5
6
7
git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
ls -al distribution/target/

// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin

方式二:下载编译后的压缩包

1
2
unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
cd nacos/bin

服务启动停止

Linux/Unix/Mac:

1
2
3
4
5
6
cd nacos/bin
# 启动:standalone代表单机非集群模式运行
sh startup.sh -m standalone

# 停止
sh shutdown.sh

Windows:

1
2
3
4
5
6
cd nacos/bin
# standalone代表单机非集群模式运行
startup.cmd -m standalone

# 停止
shutdown.cmd

服务启动后可以通过 : http://localhost:8848/nacos/ 来访问,默认账号密码: nacos nacos

服务配置

1
2
3
4
5
6
7
8
9
10
11
# 服务注册
curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'

# 服务发现
curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'

# 发布配置
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"

# 获取配置
curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"

Nacos 服务注册实例

启动Nacos server,到控制台添加一个命名空间

服务注册:分别注册两个服务,服务1有两个实例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package cn.geekhall.main;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;

import java.io.IOException;
import java.util.List;
import java.util.Properties;

/**
* ServerResigter.java
*
* @author yiny
*/
public class ServerResigter {
public static void main(String[] args) throws NacosException, IOException {
Properties properties = new Properties();
properties.setProperty("serverAddr", "http://localhost:8848");
// 这里使用服务控制台里的命名空间ID。
properties.setProperty("namespace", "42b7fa25-199f-4ba6-b683-b67edcb07526");
NamingService namingService = NacosFactory.createNamingService(properties);

// 同一个服务注册两个实例
namingService.registerInstance("serverProvider_1", "127.0.0.1", 8881);
namingService.registerInstance("serverProvider_2", "127.0.0.1", 8882);
namingService.registerInstance("serverProvider_2", "127.0.0.1", 8883);

// 获取服务名为serverProvider_1 的实例信息
List<Instance> serverProvider = namingService.getAllInstances("serverProvider_1");
System.out.println(JSONArray.toJSONString(serverProvider, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteDateUseDateFormat));
System.in.read();

}
}

执行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
nacos-config-spring-boot-autoconfigure-0.2.7.jar:/Users/yiny/.m2/repository/com/alibaba/boot/nacos-spring-boot-base/0.2.7/nacos-spring-boot-base-0.2.7.jar cn.geekhall.main.ServerResigter
[
{
"clusterName":"DEFAULT",
"enabled":true,
"ephemeral":true,
"healthy":true,
"instanceHeartBeatInterval":5000,
"instanceHeartBeatTimeOut":15000,
"instanceId":"127.0.0.1#8881#DEFAULT#DEFAULT_GROUP@@serverProvider_1",
"instanceIdGenerator":"simple",
"ip":"127.0.0.1",
"ipDeleteTimeout":30000,
"metadata":{},
"port":8881,
"serviceName":"DEFAULT_GROUP@@serverProvider_1",
"weight":1.0
}
]

执行后可以在Nacos控制台看到服务注册结果:

服务订阅:获取所有服务提供者,然后进行订阅,并添加一个事件用于监听订阅成功后的实例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package cn.geekhall.main;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.listener.Event;
import com.alibaba.nacos.api.naming.listener.EventListener;

import javax.naming.event.NamingEvent;
import java.io.IOException;
import java.util.List;
import java.util.Properties;

/**
* ServerCustomer.java
*
* @author yiny
*/
public class ServerCustomer {
public static void main(String[] args) throws NacosException, IOException {
Properties properties = new Properties();
properties.setProperty("serverAddr", "http://localhost:8848");
properties.setProperty("namespace", "42b7fa25-199f-4ba6-b683-b67edcb07526");
NamingService namingService = NacosFactory.createNamingService(properties);
List<String> serverList = namingService.getServicesOfServer(1, Integer.MAX_VALUE).getData();
System.out.println("得到服务提供者列表:" + JSONArray.toJSONString(serverList));
for (String server : serverList){

// 订阅serverProvider服务 并添加一个监听器用来监听服务状态
namingService.subscribe(server, new EventListener() {
public void onEvent(Event event) {
NamingEvent namingEvent = (NamingEvent) event;
System.out.println(JSONObject.toJSONString(namingEvent, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteDateUseDateFormat));
}
});
}
System.in.read();

}
}

执行结果:

1
2
3
nacos-config-spring-boot-autoconfigure-0.2.7.jar:/Users/yiny/.m2/repository/com/alibaba/boot/nacos-spring-boot-base/0.2.7/nacos-spring-boot-base-0.2.7.jar cn.geekhall.main.ServerCustomer
得到服务提供者列表:["serverProvider_1","serverProvider_2"]

服务停止后:

Nacos SpringBoot

新建一个SpringBoot项目:

并添加依赖。

1
2
3
4
5
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.7</version>
</dependency>