Nacos

目录

一、什么是 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的基本使用

1.Nacos的安装

Nacos支持三种部署模式:单机、集群、多集群;

需要注意:Nacos依赖Java环境,并且要求使用JDK1.8以上版本;

Nacos的安装方式有两种:源码安装、使用已编译好的安装包;

以下举例为源码安装:

  1. 在 https://github.com/alibaba/nacos/releases 上下载当前Nacos的最新版本(1.1.4)
  2. 解压进入根目录,执行 mvn -Prelease-nacos clean install -U 构建,构建后会创建一个distribution目录
  3. 执行 cd distribution/target/nacos-server-$version/nacos/bin
  4. 执行 sh startup.sh -m standalone,启动服务
  5. 服务启动后,可以通过http://127.0.0.1:8848/nacos 访问Nacos的控制台。控制台主要用于增强对服务列表、健康状态管理、服务治理、分布式配置管理等方面的管控能力 

2.Nacos服务注册发现相关API

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<Instance> getAllInstances(String serviceName) throws NacosException;

List<Instance> getAllInstances(String serviceName,List<String> clusters) throws NacosException;

参数说明:

serviceName:服务名称

cluster:集群列表,可以传递多个值

调用方式:

NamingService  naming

=NamingFactory.createNamingService(System.getProperty("serveAddr"));

naming.getAllInstances("nacos_test",true);

  • 监听服务:监听服务下的实例变化,监听服务机制可以让客户端及时感知服务提供者实例变化

Open API:/nacos/v1/ns/instance/list (GET)

SDK:

void subscribe (String serviceName,EventListener listener) throws NacosException;

void subscribe (String serviceName,List<String> clusters,EventListener listener) throws NacosException;

参数说明:

EventListener:当服务提供者实例发生上、下线时,会触发一个事件回调

服务监听有两种方式:

第一种是客户端调用/nacos/v1/ns/instance/list 定时轮询。

第二种是基于 DatagramSocket的UDP协议,实现服务端的主动推送。

3.Nacos 集成Spring Boot实现服务注册与发现

通过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数组,如果有返回一个数组包含对象的信息。

三、Dubbo 使用Nacos实现注册中心

  • 创建一个普通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上的服务。

四、Spring Cloud Alibaba Nacos Discovery

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控制台的服务管理-服务列表会看到服务注册上来

3.消费端开发

  • 创建一个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注解,将远程访问类引入进来
  • 启动服务

五、Nacos注册中心的实现原理

1.服务注册的功能主要体现:

  • 服务实例在启动时注册到服务注册表,并在关闭时注销
  • 服务消费者查询服务注册表,获得可用实例
  • 服务注册中心需要调用服务实例的健康检查API来验证它是否能够处理请求

2.原理步骤

  1. 服务提供方使用Open API发起服务注册
  2. Nacos Server与服务提供方建立心跳机制,检查服务状态
  3. 服务消费者从Nacos Server查询服务提供方实例列表
  4. 服务消费者开启定时任务,每10秒从Nacos Server拉取一次数据
  5. 检测到服务提供者异常,Nacos Server基于UDP协议向服务消费者推送更新
  6. 服务消费者通过Dubbo 远程通信链接服务提供方

六、Nacos配置中心的简单使用

1.简介

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 Cloud Alibaba Nacos Config

1.在Spring Cloud生态下Nacos Config的使用步骤

  • 创建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

  • 在启动类中,读取配置中心的数据

ConfigurableApplicationContext context=

           SpringApplication.run(SpringCloudNacosConfigSampleApplication.class,args);

String info=context.getEnvironment().getProperty("info");

注:从Environment中读取配置,info为得到的配置数据

2.动态更新配置

配置中心必然需要支持配置的动态更新,也就是在配置中心上修改配置的值之后,应用程序需要感知值的变化。

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

  • 运行启动后,就能获得到配置内容

4.不同环境的配置切换

在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下配置的内容

5.Nacos Config 自定义 Namespace 和 Group

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界面可以获取)

Group

是Nacos中用来实现Data ID分组管理的机制,它可以实现不同Service/DataId的隔离

操作:不需要提前创建,只需要在创建的时候指定

  • 在Nacos控制台 新建配置界面中指定配置所属的Group
  • 在bootstrap.properties中添加配置:spring.cloud.nacos.config.group=TEST_GROUP

八、Nacos Config实现原理

1.Nacos Config针对配置管理提供了4种操作

  • 获取配置:从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

  • 删除配置:删除配置中心的指定配置

SDK:public boolean removeConfig(String dataId,String group) throws NacosException;

API(DELETE):/nacos/v1/cs/configs

2.配置的存储

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秒后,不管有没有变化都把结果返回给客户端。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值