SpringCloudAlibaba之Nacos

238

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

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

Nacos启动
启动完成就可以访问nacos控制台页面。http://localhost:8848/nacos/index.html 登录页的默认密码是nacos/nacos
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,修改配置文件,在文件中指定集群的各个主机就行。
Nacos集群配置
如果是linux,建议配一下集群免密。
然后启动时不指定 -m standalone,就可以直接启动nacos集群了。

nacos安装非常简单,然后可以关注下nacos与其他相关开源项目的使用说明,参见README.md文件中的这一部分说明。 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,配置添加完成。
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.prefixspring.application.name
Groupspring.cloud.nacos.config.groupDEFAULT_GROUP
dataID后缀及内容文件格式spring.cloud.nacos.config.file-extensionpropertiesdataId的后缀,同时也是配置内容的文件格式,目前只支持 properties
配置内容的编码方式spring.cloud.nacos.config.encodeUTF-8配置的编码
获取配置的超时时间spring.cloud.nacos.config.timeout3000单位为 ms
配置的命名空间spring.cloud.nacos.config.namespace常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源隔离等。
AccessKeyspring.cloud.nacos.config.access-key
SecretKeyspring.cloud.nacos.config.secret-key
相对路径spring.cloud.nacos.config.context-path服务端 API 的相对路径
接入点spring.cloud.nacos.config.endpointUTF-8地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
是否开启监听和自动刷新spring.cloud.nacos.config.refresh-enabledtrue

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增加了一个保护阈值的配置。这个保护阈值是干什么的呢?这里就没有多做测试,官网上找了些资料,有兴趣可以测试一下。
Nacos服务列表
这个保护阈值应该是0~1之间的一个值,代表健康实例数占据整个实例数的比例。这个值是为了防止整个集群在大流量冲击下的雪崩效应。分布式场景下有一个问题,当部分实例不健康时,流量会被分配到健康的实例中,但是这样,就很容易造成原本健康的实例被大流量冲击,也变得不健康,最后造成整个服务崩溃。而这个保护阈值,就是当健康实例数占据总实例数的比例小于阈值时,nacos就认为整个集群的所有实例都是健康的,请求流量依然会分布在整个集群实例中,这样,虽然部分的请求流量会被发到不健康的实例中,造成不正常响应,但是其他剩余实例还是可以正常访问,整个服务不至于崩溃。
然后关于这个实例的正常情况,还是通过类似zookeeper的心跳检测来判断的。停掉一个服务实例后,可以看到,nacos的服务列表中,该项服务的触发保护阈值会先变为true,整行记录变红,然后再过段时间,服务列表才会消失。
Nacos服务不正常
而从SpringBoot中引入nacos作为Dubbo服务注册中心,需要做的变动其实也不太大。spring-cloud-starter-alibaba-nacos-discovery依赖提供了对dubbo服务发现的完整封装。依然是通过@Service注解注册服务,@Reference注解调用服务。在服务列表可以看到注册到nacos上的服务提供者和消费者。
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目前版本用起来确实挺舒服的,但是配置方面有些东西还没用起来,比如配置和服务的归属应用,期待后面的新功能。