大家好,我是雷小??帅!之前一直有读者想学习Nacos,这次学习教程终于来了。相信看完这篇文章你就能上手,再也不怕听不懂架构师之间的对话了!什么是NacosNacos是阿里巴巴开源的一款优秀的中间件,广泛应用于分布式微服务场景。Nacos的英文全称是NamingandConfigurationService,其中Na是命名、注册中心的缩写;co是configuration的缩写,配置中心;无论是配置中心还是注册中心,本质上都是以服务(微服务)为核心,用官方的话说就是:服务在Nacos中是一等公民。Nacos分为server和client,这个不能含糊。NacosServerNacosServer使用Java语言编写,提供服务注册发现和服务配置功能;对外提供SDK接入和HTTPRESTful开放接口,SDK接入和RESTful接口功能一致。NacosClientNacos提供了官方SDK,可惜只有Java版本,官方SDK可以很方便的和一些主流框架集成,比如:SpringCloud、Dubbo等。NacosClient的主要功能是订阅获取服务实例信息和配置信息。Nacos中最重要的数据模型是服务。为了便于管理,还引入了数据模型的概念。数据模型主要分为命名空间、集群和服务。数据模型的主要作用是对服务进行分类,方便维护和管理。如果觉得抽象,我举个简单的例子:如果你叫张三,住在武汉,国籍是中国,其他城市或省份也有张三。NacosRegistryCenter原理服务注册成功后,为了向NacosServer汇报自己的健康状态,客户端每5秒向NacosServer发送一次心跳。心跳携带服务名称、服务ip、服务端口等信息。当然,Nacos服务端也会主动向客户端发起健康检查,支持tcp/http检查。如果15秒内没有心跳,健康检查失败,实例将被标记为不健康,如果30秒内健康检查再次失败,实例将被直接移除。服务消费者订阅成功后,如果服务提供者的实例不健康或被移除,NacosServer会发送变更通知。小测:Nacos服务注册发现功能体验对理论知识有了一点了解后,我们就可以用我们的小手真正使用Nacos了。搭建并运行NacosServer(一)下载NacosServer安装包,启动NacosServer,进入GithubNacos下载主页:主页链接:https://github.com/alibaba/nacos/releases最新稳定版本为2.0.4,直接下载zip包或者tar.gz包就可以了,windows和linux都可以运行。解压后,如果是linux系统,执行如下命令单机运行:shstartup.sh-mstandalone如果是windows系统,执行以下命令:startup.cmd-mstandalone(2)使用Docker启动NacosServer如果你的电脑已经安装了Docker,建议直接使用Docker运行。先拉取最新镜像:dockerpullnacos/nacos-server拉取成功后启动实例:dockerrun--namenacos-demo-eMODE=standalone-p8848:8848-p9848:9848-dnacos/nacos-server这里有陷阱需要注意。8848是NacosServer的主端口,需要暴露。如果安装的是Nacos2.0,还需要暴露9848端口。这里,泪流满面调试了一下午才发现,哭晕了。。。为什么需要9848端口?因为Nacos2.0版本之后,默认使用这个端口作为grpc的通信端口。官方ClientSDK使用grpc与NacosServer通信,包括服务实例注册、心跳检测等功能。这里需要说明一下:grpc的端口=主端口+偏移量1000,如果你的主端口是8848,加上偏移量就是9848。熟悉NacosServer控制台界面NacosServer运行成功后,我们就可以打开后台管理了界面可以查看其运行状态和管理信息。本地访问地址:http://127.0.0.1:8848/nacos。第一次打开默认进入后台登录界面。默认的用户名和密码都是:nacos。登录成功后,可以看到左侧的菜单栏。主要功能有:配置管理、服务管理、权限管理、命名空间、集群管理。(1)服务管理Nacos的主要功能分为配置管理和服务管理两部分。这次主要讲解服务管理。展开菜单后,有两部分:服务列表和订阅者列表。服务列表会显示所有注册到NacosServer的服务,包括实例数、实例健康状态等信息。订阅者列表会显示有哪些客户端订阅了某项服务,包括客户端版本信息等。(2)权限控制权限控制的主要功能是对后台系统的用户角色和权限进行维护和管理。一般系统都有这个功能,这里不再赘述。(3)命名空间命名空间比较容易理解。例如,研发环境、集成测试环境、生产环境可能部署同一个服务ServiceA。如何区分它们?命名空间可以起到这个作用。在下图中,我新建了几个命名空间来逻辑隔离服务的注册和订阅信息。(4)集群管理NacosServer可以集群部署,也可以单机部署。实际生产环境为了防止单点故障,部署一个节点是肯定不行的。为了方便测试演示,我在本地只启动了一个节点。下图中可以看到这个节点的ip、status等信息。学习使用NacosClientSDK目前官网只推出Java版SDK,其他语言版本暂时由社区贡献。下面以Java版SDK为例进行说明。新建一个JavaMaven项目,引入nacos-client依赖:com.alibaba.nacosnacos-client2.0.3/依赖>上面说到Nacos主要分为两大功能:配置中心和注册中心。为了方便,Nacos-client提供了三个工厂类:NacosFactory、ConfigFactory、NamingFactory。使用这些工厂类很容易生成相应的实例对象。NacosFactory包含了ConfigFactory和NamingFactory的所有功能。如果要创建注册表函数的实例,可以使用:NacosFactory.createNamingService()或者使用NamingFactory.createNamingFactory()。使用NacosClient注册实例。NacosClientSDK代码非常简单,一眼就能学会使用。下面直接贴代码,能运行的那种代码。importcom.alibaba.nacos.api.exception.NacosException;importcom.alibaba.nacos.api.naming.NamingFactory;importcom.alibaba.nacos.api.naming.NamingService;/***模拟服务提供者注册服务实例*/publicclassApp{publicstaticvoidmain(String[]args)throwsNacosException{//使用工厂类创建registry对象,构造参数为NacosServer的ip地址,连接Nacos服务器NamingService命名=NamingFactory.createNamingService("127.0.0.1:8848");//打印NacosServer的运行状态System.out.println("serverstatus:"+naming.getServerStatus());//模拟注册当前服务实例,传入参数:服务名称、ip地址、端口naming.registerInstance("com.leixiaoshuai.rpc.provider","11.11.11.11",8888);//模拟当前进程,不退出while(true){}}}看完demo,有没有同学很好奇,NacosClient和NacosServer通过什么协议通信?简单看源码就可以得到答案:Googlegrpc。这里需要特别说明一下:在Nacos1.x时代,使用HTTPRESTful接口与NacosServer进行交互。后来在2.x中,为了提高效率,改为grpc。使用NacosClient消费实例。如果服务A需要调用服务B的接口,首先要知道服务B实例的ip和端口。在这种情况下,服务A是服务消费者。通过简单的代码很容易获取服务实例信息。为了方便感知服务实例的变化,Nacos还提供了事件通知的能力。导入com.alibaba.nacos.api.exception.NacosException;导入com.alibaba.nacos.api.naming.NamingFactory;导入com.alibaba.nacos.api.naming.NamingService;导入com.alibaba.nacos.api.naming。listener.Event;importcom.alibaba.nacos.api.naming.listener.EventListener;importcom.alibaba.nacos.api.naming.listener.NamingEvent;/***模拟服务消费者订阅服务实例*/publicclassApp{publicstaticvoidmain(String[]args)throwsNacosException{//使用工厂类创建注册表对象,构造参数为NacosServer的ip地址,连接Nacos服务器NamingServicenaming=NamingFactory.createNamingService(“127.0.0.1:8848”);//打印NacosServer的运行状态System.out.printf("serverstatus:%s",naming.getServerStatus());//获取指定服务的所有实例列表System.out.println(naming.getAllInstances("com.leixiaoshuai.rpc.provider"));//订阅指定服务并注册回调接口naming.subscribe("com.leixiaoshuai.rpc.provider",newEventListener(){@OverridepublicvoidonEvent(Eventevent){//当服务实例发生变化时,会自动收到通知System.out.println("~~eventstart");System.out.println(((NamingEvent)事件).getServiceName());System.out.println(((NamingEvent)事件).getInstances());System.out.println("~~活动结束");}});//模拟当前进程不退出while(true){}}}总结Nacos是阿里巴巴开源的Nacos是一个常用于分布式微服务场景的中间件。它的主要功能包括两大部分:服务注册发现和服务配置。Nacos分为服务端和客户端。可以从官网下载安装包,在本地运行。运行成功后,可以使用后台管理界面管理维护NacosServer;客户端接入方式有SDK和HTTPRESTful,功能相同。