目录
创新互联从2013年创立,先为管城等服务建站,管城等地企业,进行企业商务咨询服务。为管城企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。一、什么是 Alibaba Nacos
二、Nacos的基本使用
1.Nacos的安装
2.Nacos服务注册发现相关API
3.Nacos 集成Spring Boot实现服务注册与发现
三、Dubbo 使用Nacos实现注册中心
四、Spring Cloud Alibaba Nacos Discovery
1.完成服务注册与发现功能
2.服务端开发
3.消费端开发
五、Nacos注册中心的实现原理
1.服务注册的功能主要体现:
2.原理步骤
六、Nacos配置中心的简单使用
1.简介
2.Nacos集成Spring Boot实现统一配置管理
七、Spring Cloud Alibaba Nacos Config
1.在Spring Cloud生态下Nacos Config的使用步骤
2.动态更新配置
3.基于Data ID配置YAML的文件扩展名
4.不同环境的配置切换
5.Nacos Config 自定义 Namespace 和 Group
Namespace
Group
八、Nacos Config实现原理
1.Nacos Config针对配置管理提供了4种操作
2.配置的存储
3.动态监听之Pull OR Push
Pull
Push
Nacos的监听机制
一、什么是 Alibaba Nacos
Nacos 致力于解决微服务中的统一配置、服务注册与发现等问题。它提供了一组简单易用的特性集,帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos的关键特性如下:
- 服务发现和服务健康监测:Nacos支持基于DNS和基于RPC的服务发现。服务提供者注册Service后,服务消费者可以使用DNS或HTTP&API查找和发现服务。 Nacos提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。
- 动态配置服务
- 动态DNS服务:支持权重路由,让开发者更容易实现中间层负载均衡
- 服务及元数据管理
Nacos支持三种部署模式:单机、集群、多集群;
需要注意:Nacos依赖Java环境,并且要求使用JDK1.8以上版本;
Nacos的安装方式有两种:源码安装、使用已编译好的安装包;
以下举例为源码安装:
- 在 https://github.com/alibaba/nacos/releases 上下载当前Nacos的最新版本(1.1.4)
- 解压进入根目录,执行 mvn -Prelease-nacos clean install -U 构建,构建后会创建一个distribution目录
- 执行 cd distribution/target/nacos-server-$version/nacos/bin
- 执行 sh startup.sh -m standalone,启动服务
- 服务启动后,可以通过http://127.0.0.1:8848/nacos 访问Nacos的控制台。控制台主要用于增强对服务列表、健康状态管理、服务治理、分布式配置管理等方面的管控能力
Nacos提供了SDK及Open API的方式来完成服务注册与发现等操作,SDK本质上是对HTTP请求的封装
- 注册实例:将服务地址信息注册到 Nacos Server
Open API: /nacos/v1/ns/instance (POST)
SDK:
void registerInstance(String serviceName,String ip,int port) throws NacosException;
void registerInstance(String serviceName,String ip,int port,String clusterName) throws NacosException;
void registerInstance(String serviceName,Instance instance) throws NacosException;
参数说明:
serviceName:服务名称
ip:服务实例IP
port:服务实例Port
clusterName:集群名称,表示该服务实例属于哪个集群
instance:实例属性,实际上就是把上面这些参数封装成一个对象
调用方式:
NamingService naming
=NamingFactory.createNamingService(System.getProperty("serveAddr"));
naming.registerInstance("nacos_test","192.168.1.1","8080","DEFAULT");
- 获取全部实例:根据服务名称从Nacos Server上获取所有服务实例
Open API:/nacos/v1/ns/instance/list (GET)
SDK:
List
getAllInstances(String serviceName) throws NacosException; List
getAllInstances(String serviceName,List clusters) throws NacosException; 参数说明:
serviceName:服务名称
cluster:集群列表,可以传递多个值
调用方式:
NamingService naming
=NamingFactory.createNamingService(System.getProperty("serveAddr"));
naming.getAllInstances("nacos_test",true);
- 监听服务:监听服务下的实例变化,监听服务机制可以让客户端及时感知服务提供者实例变化
3.Nacos 集成Spring Boot实现服务注册与发现Open API:/nacos/v1/ns/instance/list (GET)
SDK:
void subscribe (String serviceName,EventListener listener) throws NacosException;
void subscribe (String serviceName,List
clusters,EventListener listener) throws NacosException; 参数说明:
EventListener:当服务提供者实例发生上、下线时,会触发一个事件回调
服务监听有两种方式:
第一种是客户端调用/nacos/v1/ns/instance/list 定时轮询。
第二种是基于 DatagramSocket的UDP协议,实现服务端的主动推送。
通过Spring Boot集成Nacos实现一个简单的服务注册与发现功能
- 创建一个Spring Boot工程spring-boot-nacos-discovery
- 添加Maven依赖 (nacos-discovery-spring-boot-starter(0.2.4))
- 创建DiscoveryController类,通过@NacosInjected注入Nacos的NamingService,并提供discovery方法,可以根据服务名称获得注册到Nacos上的服务地址
- 在application.properties中添加Nacos服务地址的配置 (nacos.discovery.server-addr=127.0.0.1:8848)
- 启动启动类,调用curl http://127.0.0.1:8080/discovery?serviceName=example去Nacos服务器上查询服务名称为example所对应的地址信息,如果没有example的服务实例,返回一个空的JSON数组,如果有返回一个数组包含对象的信息。
- 创建一个普通Maven项目spring-boot-dubbo-nacos-sample,添加两个模块:nacos-sample-api和nacos-sample-provider(是一个Spring Boot工程)
- 在nacos-sample-api 中声明接口
- 在nacos-sample-provider中添加如下依赖
nacos-sample-api,接口定义类的依赖
nacos-discovery-spring-boot-starter,Nacos的Starter组件
dubbo-spring-boot-starter ,Dubbo的Starter组件,添加Dubbo依赖
- 创建类并实现api中的接口
- 修改application.properties配置,仅将dubbo.registry.address中配置的协议改成nacos://127.0.0.1:8848,基于nacos协议
dubbo.application.name=spring-boot-dubbo-nacos-sample
dubbo.registry.address=nacos://127.0.0.1:8848
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
- 运行Spring Boot启动类,在启动来上需要声明注解@DubboComponentScan
- 服务启动成功之后,访问Nacos控制台,进入服务管理-服务列表,可以看到所有注册在Nacos上的服务。
Nacos作为Spring Cloud Alibaba中服务注册与发现的核心组件,可以很好的帮助开发者将服务自动注册到Nacos服务端,并且能够动态感知和刷新某个服务实例的服务列表。
1.完成服务注册与发现功能将Spring Cloud Alibaba Nacos Discovery集成到Spring Cloud Alibaba Dubbo,代码如下
2.服务端开发- 创建一个普通的Maven项目spring-cloud-nacos-sample,在项目中添加两个模块
- spring-cloud-nacos-sample-api,暴露服务接口,作为服务提供者及服务消费者的接口契约
- spring-cloud-nacos-sample-provider,项目类型为Spring Cloud,它是接口的实现
- 在spring-cloud-nacos-sample-api中定义一个接口
- spring-cloud-nacos-sample-provider项目的pom.xml文件中添加相关依赖包,如下
spring-cloud-starter:Spring Cloud核心包
spring-cloud-starter-dubbo:引入Spring Cloud Alibaba Dubbo
spring-cloud-dubbo-sample-api:API的接口声明
spring-cloud-alibaba-nacos-discovery:基于Nacos的服务注册与发现
spring-cloud-context (2.1.1.RELEASE)
注意:spring-cloud-starter、spring-cloud-alibaba-nacos-discovery由于版本冲突,需要用exclusion标签排除掉spring-cloud-context子包,在pom文件中重新引回2.1.1版本的spring-cloud-context
- 在spring-cloud-nacos-sample-provider中创建接口的实现类,@Service是Dubbo服务的注解,表示当前服务会发布成一个远程服务
- 在application.properties中提供Dubbo及Nacos的配置,用于声明Dubbo服务暴露的网络端口和协议,以及服务注册的地址信息
spring.application.name=spring-cloud-nacos-sample
dubbo.scan.base-packages=com.gupaoedu.book.nacos.bootstrap 备注:功能等同于@DubboComponentScan,指定Dubbo服务实现类的扫描包路径
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.registry.address=spring-cloud://localhost 备注:Dubbo服务注册中心的配置地址,它的值spring-cloud://localhost表示挂载到Spring Cloud注册中心,不配置的话会提示没有配置注册中心的错误
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 备注:Nacos服务注册中心的地址
- 启动服务:进入Nacos控制台的服务管理-服务列表会看到服务注册上来
- 创建一个Spring Boot项目 spring-cloud-nacos-consumer
- 添加相关依赖如下
spring-boot-starter-web :演示需要就加不然不用加
spring-cloud-starter
spring-cloud-starter-dubbo
spring-cloud-nacos-sample-api
spring-cloud-alibaba-nacos-discovery
- 在application.properties中添加配置信息
dubbo.cloud.subscribed-services=spring-cloud-nacos-sample
dubbo.scan.base-packages=com.gupaoedu.book.nacos.bootstrap
spring.application.name=spring-cloud-nacos-consumer
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
- 定义Controller类,@Reference注解,将远程访问类引入进来
- 启动服务
- 服务实例在启动时注册到服务注册表,并在关闭时注销
- 服务消费者查询服务注册表,获得可用实例
- 服务注册中心需要调用服务实例的健康检查API来验证它是否能够处理请求
- 服务提供方使用Open API发起服务注册
- Nacos Server与服务提供方建立心跳机制,检查服务状态
- 服务消费者从Nacos Server查询服务提供方实例列表
- 服务消费者开启定时任务,每10秒从Nacos Server拉取一次数据
- 检测到服务提供者异常,Nacos Server基于UDP协议向服务消费者推送更新
- 服务消费者通过Dubbo 远程通信链接服务提供方
Nacos的架构图中有两个模块,分别是Config Server和Naming Server。Naming Server是实现注册中心的核心模块,Config Server是Nacos用于实现配置中心的核心模块,它实现了对配置的CRUD、版本管理、灰度管理、监听管理、推送轨迹、聚合数据等功能。
2.Nacos集成Spring Boot实现统一配置管理Nacos是一个独立组件,它可以独立部署和应用,在集成到Spring Cloud之前,可以结合Spring Boot来实现统一配置管理
- 创建一个Spring Boot工程spring-boot-nacos-config
- 添加Nacos Config的Jar包依赖 (nacos-config-spring-boot-starter)
- 在application.properties中添加Nacos Server地址 (nacos.config.server-addr=127.0.0.1:8848)
- 创建Controller类,可以从Nacos Server读取配置,用到以下两个注解
@NacosPropertySource(dataId="example",autoRefreshed=true)
注释:用于加载dataId为example的配置源,autoRefreshed表示开启自动更新
@NacosValue(value="${info:Local Hello World}",autoRefreshed=true)
注释:设置属性的值,其中info表示key,而Local Hello World代表默认值。也就是说如果key不存在,则使用默认值。
- 启动Nacos Server:进入 ${NACOS_HOME}\bin目录,执行sh startup.sh启动Nacos Server
- 创建配置:有两种方式 1.在Nacos控制台上创建 2.使用Open API方式创建
控制台创建方式:通过http://ip:8848/nacos控制台进入 配置管理-配置列表,单击创建按钮进入创建界面。Data ID:表示Nacos中某个配置集的ID;Group:表示配置所属的分组;配置格式:当前配置内容所遵循的格式。
注意:dataId和group必须与NacosPropertySource中配置保持一致,否则无法匹配到配置内容
- 启动Spring Boot项目的启动类,执行访问命令,就能获取到配置的内容
- 创建Spring Boot项目,添加spring-cloud-starter依赖
- 添加Jar包依赖 (spring-cloud-starter-alibaba-nacos-config)
- 创建bootstrap.properties文件,在其中添加Nacos Server的连接地址,如下
spring.application.name=spring-cloud-nacos-config-sample
spring.cloud.nacos.config.server-addr=127.0.0.1:8848 注释:设置Nacos配置中心地址
spring.cloud.nacos.config.prefix=example 注释:表示Nacos配置中心的Data ID的前缀
注:在Spring Boot中有两种上下文配置,一种是bootstrap,一种是application。bootstrap是父上下文,也就是说bootstrap加载优先于application。由于在加载远程配置之前,需要读取Nacos配置中心的服务地址信息,所以Nacos服务地址等属性配置需要放在bootstrap.properties文件中
- 在Nacos Console中创建如下配置
DataId:example
Group:DEFAULT_GROUP
配置内容:info=Nacos Server Data : Hello World
- 在启动类中,读取配置中心的数据
2.动态更新配置ConfigurableApplicationContext context=
SpringApplication.run(SpringCloudNacosConfigSampleApplication.class,args);
String info=context.getEnvironment().getProperty("info");
注:从Environment中读取配置,info为得到的配置数据
配置中心必然需要支持配置的动态更新,也就是在配置中心上修改配置的值之后,应用程序需要感知值的变化。
3.基于Data ID配置YAML的文件扩展名Spring Cloud Alibaba Nacos Config从Nacos Config Server中加载配置时,会匹配Data ID。
Data ID默认规则是:${prefix}-${spring.profile.active}.${file-extension}。
在实际应用中,如果用YAML格式的配置,Nacos Server也提供了YAML配置格式的支持,步骤如下:
- 在bootstrap.properties中声明spring.cloud.nacos.config.file-extension=yaml
- 在Nacos控制台上增加如下配置
Data ID:spring-cloud-nacos-config-sample.yaml
Group:DEFAULT_GROUP
配置格式:YAML
配置内容:info:yaml config type
- 运行启动后,就能获得到配置内容
在Spring Boot中,可以基于spring.profiles.active实现不同环境的配置切换。比如:开发环境、测试环境、预生产环境、生产环境。具体切换步骤如下:
- 在resources目录下根据不同环境创建不同的配置:application-dev.properties;application-test.properties;application-prod.properties
- 定义一个application.properties默认配置,在该配置中通过spring.profiles.active=${env}来指定当前使用哪个环境的配置,如果${env}的值为prod,表示使用application-prod.properties。也可以使用VM options=-Dspring.profiles.active=prod来指定使用的配置环境。
- 在bootstrap.properties中声明spring.profiles.active=prod。
- 在Nacos控制台上新增两个Data ID的配置项。
spring-cloud-nacos-config-sample-test.properties,配置内容为info-test
spring-cloud-nacos-config-sample-prod.properties,配置内容为info=prod env:Hello
- 运行启动方法,会得到prod下配置的内容
Nacos Config中默认的行为 Namespace:public;Group:DEFAULT_GROUP
Namespace用于解决多环境及多租户数据的隔离问题,比如在多套不同的环境下,可以根据指定的环境创建不同的Namespace,实现多环境隔离。或者多用户的场景中,每个用户可以维护自己的Namespace,实现每个用户的配置数据和注册数据的隔离。
需要注意的是:在不同的Namespace下,可以存在相同的Group和DataId
操作:
- 在Nacos控制台的命名空间下,创建一个命名空间。
- 在bootstrap.properties中添加配置:spring.cloud.nacos.namespace=ee6d2c78-003b-4151-9984-63b1b40111a0(命名空间ID,在Nacos界面可以获取)
是Nacos中用来实现Data ID分组管理的机制,它可以实现不同Service/DataId的隔离
操作:不需要提前创建,只需要在创建的时候指定
- 在Nacos控制台 新建配置界面中指定配置所属的Group
- 在bootstrap.properties中添加配置:spring.cloud.nacos.config.group=TEST_GROUP
- 获取配置:从Nacos Config Server中读取配置
SDK:public String getConfig(String dataId,String group,long timeoutMs)
throws NacosException;
API(GET): /nacos/v1/cs/configs
- 监听配置:订阅感兴趣的配置,当配置发生变化时可以收到一个事件
SDK:public void addListener(String dataId,String group,Listener listener);
API(POST):/nacos/v1/cs/configs/listener
- 发布配置:将配置保存到Nacos Config Server中
SDK:public boolean publishConfig(String dataId,String group,String content)
throws NacosException;
API(POST):/nacos/v1/cs/configs
- 删除配置:删除配置中心的指定配置
2.配置的存储SDK:public boolean removeConfig(String dataId,String group) throws NacosException;
API(DELETE):/nacos/v1/cs/configs
Nacos服务端的数据存储默认采用的是Deaby数据库,除此之外,还支持MySQL数据库。
3.动态监听之Pull OR Push Pull表示客户端从服务端主动拉取数据
优缺点:在Pull模式下,客户端需要定时从服务端拉取一次数据,由于定时任务会存在一定的时间间隔,所以不能保证数据的实时性,并且在服务端配置长时间不更新的情况下,客户端的定时任务会做一些无效的Pull
Push表示服务端主动把数据推送给客户端
优缺点:在Push模式下,服务端需要维持与客户端的长链接,如果客户端的数量比较多,那么服务端需要耗费大量的内存资源来保存每个连接,并且为了保证连接的有效性,还需要心跳机制来维持每个连接的状态。
Nacos的监听机制Nacos采用的是Pull模式,但不是简单的Pull模式,而是一种长轮询机制。客户端采用长轮询的方式定时发起Pull请求,去检查服务端配置信息是否发生了变化:
- 如果发生了变化,则客户端会根据变更的数据获取最新的配置;
- 如果服务端的配置和客户端的保持一致,那么服务端会先“Hold”住这个请求29.5秒,先不返回,如果这段时间内配置发生变化,服务端会把原来Hold住的这个请求返回;
- 如果时间到达29.5秒一直没有变更,也会自动触发一次检查机制,耗时0.5秒后,不管有没有变化都把结果返回给客户端。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网页名称:Nacos-创新互联
文章位置:http://scgulin.cn/article/hgcde.html