背景
前段时间有新闻报道,国外HashiCorp在官网宣布:不允许中国境内使用、部署和安装该企业旗下的企业版产品和软件。
其中Consul是Java的spring cloud开发者非常熟悉的一个服务发现和配置中心的中间件,很多人担心是否Consul会受到影响,目前来看HashiCorp只是对商业版进行了禁止使用,还没有对开源版本进行限制,所以使用Consul的小伙伴不用担心。但是随着时间的发展,不同地区的对抗会不断的升级,说不定有一天开源的版本会被也会被宣布禁用,所以我们需要知道如何去替代Consul。
在2008年的时候,那个时候zk还没出来,阿里巴巴当时内部需要做服务发现,于是自研了ConfigServer,过了十年,在2018年7月的时候,阿里发布了Nacos(ConfigServer开源实现)0.1.0版本,到现在快两年了已经到了1.3.0版本,现在已经可以支持很多功能了:
服务注册和发现:nacos和很多rpc框架已经做了集成,比如dubbo,SpringCloud等,方便我们拿来即用,同时也开放了比较简易的api方便我们对自己的rpc进行定制。
配置管理:类似apllo的一个配置管理中心,让我们不用把配置写在文件中了,在后台进行统一的管理。
地址服务器: 方便我们对不同环境不同隔离场景的nacos进行寻址。
安全与稳定性: 性能监控,加密传输,权限控制管理等等。
对于nacos的来说,最大的核心功能就是服务注册和配置管理,我的文章主要也是介绍这两大模块,这篇文章主要是介绍Nacos服务发现-注册相关的一些使用,原理以及对比其他的一些优化。
基本概念
首先我们来看看再Nacos中服务发现-注册的一些基本概念:
命名空间(namespace):命名空间属于Nacos顶层的结构,用于进行租户级别的隔离,我们最常用的就是不同环境比如测试环境,线上环境进行隔离。
服务(Service):服务的概念就和我们平常的微服务一一对应,比如订单服务,物流服务等等。一个命名空间下可以有多个Service,不同的命名空间可以有相同的Service,比如测试环境和线上环境都可以有订单服务。
虚拟集群:一个服务下所有的机器组成一个集群,在Nacos中还可以对集群根据需要进行进一步划分成虚拟集群。
实例:粗略一点理解就是一台机器或者一个虚拟机就是一个实例,细粒一点理解就是一个或多个服务的具有可访问网络地址(IP:Port)的进程。
上面是Nacos官网文档中给出的服务领域模型图,从图上我们可以知道层级关系的属于是:服务-集群-实例,同时在服务,集群和实例中都会保存一些数据用作其他的需求。
其实一说到服务注册很多人首先会想到Zookeeper,其实ZK并没有直接提供服务注册订阅的功能,在ZK中要实现这些功能,你必须要自己一个一个的去划分文件目录,非常不方便,并且ZK的Api也特别难用,对于Nacos来说服务注册的Api使用如下:
Properties properties = new Properties();
properties.setProperty("serverAddr", System.getProperty("serverAddr"));
properties.setProperty("namespace", System.getProperty("namespace"));
NamingService naming = NamingFactory.createNamingService(properties);
naming.registerInstance("microservice-mmp-marketing", "11.11.11.11", 8888, "TEST1");
naming.subscribe("microservice-mmp-marketing", new EventListener() {