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
sh startup.sh -m standalone
sh shutdown.sh
|
Windows:
1 2 3 4 5 6
| cd nacos/bin
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;
public class ServerResigter { 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);
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);
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;
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){
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>
|