Spring Cloud与Alibaba Nacos整合

Java框架

浏览数:75

2019-8-21

2019年1月22号nacos-server发布了0.8.0版本,注册中心和配置中心整合在了一起,对Spring Cloud F版的支持比较稳定,目前网上这两者的整合教程比较少,所以结合之前的项目经历,以及这段时间对Nacos的学习总结,用一个非常简单的用户微服务来对Spring Cloud与Nacos进行整合,仅做学习交流。用户微服务采用了领域模型设计,使用了BeanValidation、Jodd、MapStruct等技术栈,由于持久化层采用Mongodb做数据存储,因此封装了一套用于操作Mongodb的代码以及整个微服务架构中的所有业务类和模型类会公用的代码,如状态码、业务码、分页类等(可到https://oss.sonatype.org查询groupid为com.github.mujun0312对应的两个maven依赖查看源码),用户微服务以及Zuul网关源码参见文末的Github地址。

安装Nacos

配置数据持久化

Nacos默认采用的是嵌入式的数据库来做数据存储,单机Nacos仅适合我们学习和测试环境,对于生产环境显然是不合适,生产环境必然会搭建Nacos集群来实现高可用,这样就带来了数据一致性的问题,为了解决这个问题,Nacos采用了集中存储的方式来支持集群化部署,目前只支持MySql的持久化存储。
要做到Nacos配置数据持久化,只需要下面两步:

  • MySql数据库的初始化:执行Nacos安装后的数据初始化文件nacos-mysql.sql,在安装后的conf目录下。注意MySql数据库的版本:5.6.5+

如果数据库的版本是8.x,仅做数据库的初始化和修改application.properties是不够的,本地运行console模块会报错,是因为0.8.0版本引入的MySql驱动不支持8.x,需要手动修改源码中的驱动版本,以及对应的驱动名,具体的修改地址可参见console模块运行后的报错信息提供的类信息。

  • 修改conf/application.properties:官方给出了文件修改的样例:
db.num=2
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.url.1=jdbc:mysql://11.163.152.9:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=nacos

配置数据持久化参考:https://nacos.io/zh-cn/docs/what-is-nacos.html

安装配置后,启动Nacos,访问:http://localhost:8848/nacos/,即可进入nacos的服务管理界面,其中配置管理和服务管理分别代表了配置中心和注册中心:

nacos服务管理界面

在命名空间分别新建dev和prod两个namespace,用来区分不同的环境,同时到application.properties文件中配置的MySql数据库下的tenant_info表中查看,能看到Nacos的配置信息保存到MySql数据中,实现了配置数据的持久化。


命名空间.png


配置数据持久化.PNG

用户微服务接入Nacos注册中心

如果使用Eureka做注册中心,只需在项目的配置文件中指定好注册中心的地址,并在启动类添加@EnableEurekaClient注解开启服务发现与注册功能即可。

使用Eureka注册中心的配置.PNG

而如果使用Nacos做服务发现注册,服务首先需要手动引入spring cloud alibaba的依赖以及Nacos的服务发现与注册模块,这里的版本使用的是0.2.1.RELEASE,同时将Eureka的相关依赖注释掉:


spring cloud alibaba依赖.PNG


Nacos服务发现与注册模块.PNG

将启动类上的
@EnableEurekaClient注解替换为
@EnableDiscoveryClient注解。

接下来对用户微服务的配置项作修改:

  • 将配置的Eureka注册中心地址注释掉,改为Nacos的注册中心地址

    添加Nacos注册中心配置信息.PNG

  • 启动用户微服务,在Nacos的服务列表页面查看服务列表,可以看到服务名为myapp-uc的服务已经注册到了Nacos,点击详情按钮,可以看到当前服务的集群状态、端口信息以及健康状态等:

    Nacos服务注册.PNG
    服务详情.PNG

Zuul网关接入Nacos

在Nacos配置管理的配置列表页面,找到之前已经创建好的的dev命名空间,分别创建两个配置项:myApp-dev.properties,用GROUP进行区分,通常GROUP用来在相同的环境做不同业务的区分(namespace通常用来区分不同的环境,如开发环境、测试环境、生产环境…),对应的详情信息如下,稍后会通过Zuul网关的配置来验证最终使用了下面两个配置中的哪一个配置:


创建配置信息-1.PNG


创建配置信息-2.PNG


创建配置信息-3.PNG

可能有些人对Nacos配置信息中的Data Id包括GROUP的具体含义还不是很清晰,这里做一个简单的解释。
Data Id:Data Id在Nacos中,我们把它理解为是一个Spring Cloud应用的配置文件名,默认情况下,Data Id的名称格式是:${spring.application.name}.properties,参考如上配置的Data Id,如果使用默认配置,这里就应该配置Zuul网关的spring.application.name=myApp-dev,当然在Nacos的配置信息中,你也可以手动的通过spring.cloud.nacos.config.prefix来配置更符合实际业务场景的Data Id。
.properties:在Nacos的配置信息中,可以通过spring.cloud.nacos.config.file-extension来配置Data Id的后缀,在0.2.1.RELEASE版本中可以看到,当前后缀仅支持properties:


spring-cloud-nacos-config-file-extension.PNG

实际上Nacos配置最通用的规则是:${spring-cloud-nacos-prefix}-${spring-profile-active}.${spring-cloud-nacos-config-file-extension}
接下来对Zuul网关的配置项作修改:

  • 与上面用户微服务接入Nacos注册中心一样,首先手动引入spring cloud alibaba依赖以及Nacos的服务发现与注册模块,因为整合了配置信息,所以还要另外引入Nacos的配置模块:

    Zuul网关整合Nacos需引入模块.PNG

  • 新建bootstrap.yml配置文件,添加Nacos配置信息,包括配置中心地址、使用的环境、Data Id前后缀以及使用的GROUP信息等:

    Zuul网关添加配置信息.PNG

这里通过Nacos的配置规则自定义了Data Id,没有使用默认规则用spring.application.name,同时还需要注意:这里必须使用bootstrap.properties(.yml)

  • 启动类添加@EnableDiscovreyClient注解
  • 启动Zuul网关,在console的后台启动信息里可以看到,这里应用程序从Nacos的配置列表中加载的Data Id和GROUP信息,验证了最终加载的是GROUP名为UC_GROUP的配置项:
    应用程序加载Nacos配置项.PNG
    到Nacos的服务列表里,我们可以看到用户微服务和Zuul网关都作为服务实例注册进了Nacos:
    Nacos服务列表.PNG
    到这里Spring Cloud与Alibaba Nacos的一个简单整合基本上就结束了。
    因为项目中还整合到了Swagger2,因此对Zuul网关还做了一些其他的配置信息,最终访问http://localhost:10020/swagger-ui.html,可以看到网关信息如下(个人还是比较喜欢使用Swagger来做后台接口文档,因此也是非常推荐spring中文社区的swagger2,一些注释的含义都是中文,用起来也是非常方便):
    Swagger文档信息.PNG

总结

Nacos目前最新的版本还是0.8.0,在与Spring Cloud做整合的过程中也是发现了很多问题,包括配置数据持久化时的MySql版本不兼容问题以及Data Id后缀仅支持properties格式等,但相比Spring Cloud全家桶的一些中间件来说,它的前端控制台更加人性化,而且注册中心和配置中心整合在了一起,实际上生产的过程省略掉了注册中心和配置中心这两个中间件(代码层面),何乐而不为呢,耐心的等待Nacos 1.x版本的发布吧。

参考资料

Nacos官方文档

代码示例

作者:mujun_