欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringCloudAlibaba之Nacos

程序员文章站 2022-06-12 19:30:05
...


SpringCloud Alibaba出来也有一段时间了,Nacos版本目前已经更新到1.2.1,这次没事就来体验一下。
Nacos官方的说法是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。据前期的了解,是个类似于Eureka服务注册中心+配置中心。多说不益,上来玩玩再说。另外,本文配套了一个功能完整的Demo,请参见gitee地址: https://gitee.com/tearwind/SCAlibabaDemo

Nacos 初体验

Nacos的gitHub仓库地址: https://github.com/alibaba/Nacos,在Github的ReadME.md下面就有发布包的下载地址,有github和baidu网盘两个地址。直接下载1.2.1版本的压缩包就可以了。
注:也可以下源码编译,但是git仓库的源码版本不太稳定,毕竟一直在迭代过程中。所以还是建议下载发布包。
源码可以使用maven直接编译,编译指令如下,有兴趣可以自己试试。

cd D:\gitCode\nacos-develop
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U

解压后什么都不用干,直接跑起来看看效果。单机模式启动nacos:

    startup.cmd -m standalone

SpringCloudAlibaba之Nacos
启动完成就可以访问nacos控制台页面。http://localhost:8848/nacos/index.html 登录页的默认密码是nacos/nacos
SpringCloudAlibaba之Nacos
这样nacos的安装就完成了,体验简单至极。

元数据库安装

默认情况下,nacos是使用的derby管理的元数据,元数据无法联机,也不便于观察,建议使用mysql来管理元数据。
在conf目录下修改application.properties,指定db数据源:

#*************** Config Module Related Configurations ***************#
### If user MySQL as datasource:
# spring.datasource.platform=mysql

### Count of DB:
# db.num=1

### Connect URL of DB:
# db.url.0=jdbc:mysql://1.1.1.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
# db.user=user
# db.password=password

mysql的建表脚本也在bin目录下,有nacos-mysql.sql和schema.sql,mysql数据库就用nacos-mysql.sql就行了,其他数据库如Oracle可以参考schema.sql。
配置完成后,就可以到mysql里观察nacos的元数据了。

集群模式安装

集群模式的安装更简单,将conf目录下的cluster.conf.example文件复制一份为cluster.conf,修改配置文件,在文件中指定集群的各个主机就行。
SpringCloudAlibaba之Nacos
如果是linux,建议配一下集群免密。
然后启动时不指定 -m standalone,就可以直接启动nacos集群了。

nacos安装非常简单,然后可以关注下nacos与其他相关开源项目的使用说明,参见README.md文件中的这一部分说明。
SpringCloudAlibaba之Nacos

nacos配置中心

按照官方的示例,先增加第一个配置文件:

curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos-config-example.properties&group=DEFAULT_GROUP&content=user.id=1%0Auser.name=james%0Auser.age=17"

接口简单暴力的返回了一个true,配置添加完成。
SpringCloudAlibaba之Nacos
当然, 这跟在管理平台上配置效果是一样的。配置信息会保存到mysql的config_info表中。
然后创建一个SpringBoot应用来测试一下读取这个配置信息。–示例代码见gitee仓库:
这个示例中可以看到,对于SpringCloud应用,使用Nacos作为配置中心要注意的是以下几点:

  • 应用通过spring.application.name(对应dataId)和spring.cloud.nacos.config.group(对应group)两个属性一起去寻找nacos上对应的配置信息。另外,如果应用增加了环境配置(spring.profiles.active属性),那么,应用也会到nacos上寻找{dataId}-dev.properties文件,跟在本地配置一样。而{dataId}可以通过配置spring.cloud.nacos.config.prefix来修改。官方说明中,配置文件的后缀.properties也可以通过配置spring.cloud.nacos.config.file-extension来修改,但是目前版本只支持properties。
  • nacos提供了@RefreshScope注解,通过这个注解,就可以让应用及时获取到nacos的最新配置。当然,这中间是会有一定的延迟时间的。例如示例工程启动后,访问http://localhost:8001/user,可以读到age是17,而把nacos中的配置改为18后,再次访问,能够获取到最新的18,而不需要重启应用。
  • nacos的应用相关配置在引入spring-boot-starter-actuator依赖后,可以通过/actuator/nacos-config路径访问。
  • nacos的其他配置项:
配置项 key 默认值 说明
服务端地址 spring.cloud.nacos.config.server-addr
DataId前缀 spring.cloud.nacos.config.prefix spring.application.name
Group spring.cloud.nacos.config.group DEFAULT_GROUP
dataID后缀及内容文件格式 spring.cloud.nacos.config.file-extension properties dataId的后缀,同时也是配置内容的文件格式,目前只支持 properties
配置内容的编码方式 spring.cloud.nacos.config.encode UTF-8 配置的编码
获取配置的超时时间 spring.cloud.nacos.config.timeout 3000 单位为 ms
配置的命名空间 spring.cloud.nacos.config.namespace 常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源隔离等。
AccessKey spring.cloud.nacos.config.access-key
SecretKey spring.cloud.nacos.config.secret-key
相对路径 spring.cloud.nacos.config.context-path 服务端 API 的相对路径
接入点 spring.cloud.nacos.config.endpoint UTF-8 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
是否开启监听和自动刷新 spring.cloud.nacos.config.refresh-enabled true

nacos注册中心

nacos作为服务注册中心,是可以同时支持Dubbo和SpringCloud的,关键依赖是com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery。那先从Dubbo开始把。

nacos作为Dubbo服务注册中心

Dubbo后面会再详细讲解,这里只是简单使用,代码还是可以查看gitee上的Demo,NacosProviders为服务提供端,NacosConsumers为服务消费端。其中有从xml启动Dubbo和Spring启动Dubbo的示例。
从xml启动的过程中可以看到,将Dubbo注册中心由Zookeeper迁移到nacos,只需要将Dubbo的注册地址修改为nacos://127.0.0.1:8848,其他地方跟以前使用zookeeper基本没什么区别。分别启动provider和consumer,然后可以观察下nacos的服务列表页面,跟以前的DubboAdmin比较一下,最明显的是,nacos增加了一个保护阈值的配置。这个保护阈值是干什么的呢?这里就没有多做测试,官网上找了些资料,有兴趣可以测试一下。
SpringCloudAlibaba之Nacos
这个保护阈值应该是0~1之间的一个值,代表健康实例数占据整个实例数的比例。这个值是为了防止整个集群在大流量冲击下的雪崩效应。分布式场景下有一个问题,当部分实例不健康时,流量会被分配到健康的实例中,但是这样,就很容易造成原本健康的实例被大流量冲击,也变得不健康,最后造成整个服务崩溃。而这个保护阈值,就是当健康实例数占据总实例数的比例小于阈值时,nacos就认为整个集群的所有实例都是健康的,请求流量依然会分布在整个集群实例中,这样,虽然部分的请求流量会被发到不健康的实例中,造成不正常响应,但是其他剩余实例还是可以正常访问,整个服务不至于崩溃。
然后关于这个实例的正常情况,还是通过类似zookeeper的心跳检测来判断的。停掉一个服务实例后,可以看到,nacos的服务列表中,该项服务的触发保护阈值会先变为true,整行记录变红,然后再过段时间,服务列表才会消失。
SpringCloudAlibaba之Nacos
而从SpringBoot中引入nacos作为Dubbo服务注册中心,需要做的变动其实也不太大。spring-cloud-starter-alibaba-nacos-discovery依赖提供了对dubbo服务发现的完整封装。依然是通过@Service注解注册服务,@Reference注解调用服务。在服务列表可以看到注册到nacos上的服务提供者和消费者。
SpringCloudAlibaba之Nacos

nacos作为SpringCloud的服务注册中心

示例中同样提供了基于Ribbon的服务接口调用,可以看到,从Eureka迁移到nacos,整个过程也是相当平滑,代码基本没差别,只要修改下配置注册地就行。spring-cloud-starter-alibaba-nacos-discovery依赖中,集成了ribbon和feign。注册nacos时,应用会将自己应用名作为一个服务实例注册到nacos中,然后就可以通过这个实例来进行跳转。
nacos控制台中,服务管理下还一个订阅者列表,在注册服务者和消费者同时,也会同时注册一些订阅者,这个暂时还不知道是干什么的。
另外,增加了一个配置属性dubbo.cloud.subscribed-services,这个属性用于消费者订阅提供方的应用名称列表,官方建议会要自行指定关于的应用,而不用默认的*,日志中会有警告提示。
然后,官方案例中,nacos还兼容spring-cloud-starter-gateway包,进行路由转发。可以像eureka一样,通过应用名,将请求转发到实例。但是不知道为什么,阿里的maven仓库里没有这个包,暂时就没有测了。

ConfigService和NamingService

Nacos的客户端目前主要是提供了两个maven依赖,一个是主要支持Spring的com.alibaba.nacos:nacos-spring-context ,另一个是主要支持SpringCloud的 com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config 和 com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery。而这两个东东是Nacos客户端的两个核心对象,其中ConfigService主要用来操作Nacos的配置信息,NamingService用来操作Nacos的服务发现。

ConfigService

在nacos的客户端jar包中,可以通过ConfigService对象管理Nacos的配置信息,可以管理配置、监听配置修改事件,管理监听等,也可以通过NamingService来管理Nacos的服务注册信息。具体示例可以参见Demo。
注:如果引入com.alibaba.nacos:nacos-spring-context依赖,应用需要配置@EnableNacos注解(这个@EnableNacos注解相当于同时配置@EnableNacosConfig和@EnableNacosDiscovery两个注解),然后就可以用@NacosInjected注解注入ConfigService和NamingService了。但是,如果引用的是com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config这个springCloud的集成依赖,那就可以使用@Resource注解注入NacosConfigManager,然后通过这个NacosConfigManager去获取ConfigService。

NamingService

其他

Nacos目前版本用起来确实挺舒服的,但是配置方面有些东西还没用起来,比如配置和服务的归属应用,期待后面的新功能。