从 2017 年末 Java 开发领域使用最广的 RPC 框架 Dubbo 开启从新更新维护之路开始,阿里巴巴为打造 Dubbo 微服务生态持续开源了 Sentinel,Nacos,Seata 等微服务中间件框架,而且推出了 Spring Cloud Alibaba 来提供微服务开发的一站式解决方案,阿里巴巴在 Java 社区持续活跃起来,也为 Java 微服务开发注入了新的活力。html
本篇文章将重点学习微服务组件 Nacos 做为注册中心的功能和用法,Nacos 是阿里巴巴于 2018 年 7 月份新开源的项目。java
关于 Nacos 名字:前四个字母分别为 Naming 和 Configuration 的前两个字母,最后的
s
为Service。mysql
本文主要内容涉及以下:git
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。github
上面这句话摘自 Nacos 官方首页,是对 Nacos 总体功能的总结。spring
简单来讲 Nacos 就是注册中心 + 配置中心的组合,提供简单易用的特性集,帮助咱们解决微服务开发必会涉及到的服务注册与发现,服务配置,服务管理等问题。Nacos 仍是 Spring Cloud Alibaba 组件之一,负责服务注册与发现。sql
首先来看下官方对 Nacos 的特性描述:数据库
能够发现全部特性都离不开服务这一词,服务 (Service) 是 Nacos 世界中的一等公民,说明了服务是 Nacos 中最主要的角色。浏览器
如今的微服务生态中,已经有不少服务注册与发现的开源组件,如 Eurka,ZooKeeper,Consul,为何还要用 Nacos 呢,咱们看下这些框架的简单对比:微信
服务注册与发现框架 | CAP 模型 | 控制台管理 | 社区活跃度 |
---|---|---|---|
Eureka | AP | 支持 | 低 (2.x 版本闭源) |
Zookeeper | CP | 不支持 | 中 |
Consul | CP | 支持 | 高 |
Nacos | AP | 支持 | 高 |
听说 Nacos 在阿里巴巴内部有超过 10 万的实例运行,已通过了相似双十一等各类大型流量的考验。
相比之下,目前的 Nacos 不管是部署,仍是使用上都简单上手,更重要的是文档资料齐全,社区活跃度高。
而且 Nacos 与目前主流的开源生态都提供了很好的支持:
除此以外,阿里巴巴正在经过 Dubbo + Nacos 以及一系列开源项目打造服务发现、服务及流量管理、服务共享平台,将来还在不断地发展和演进,相信将来会有更多的地方上使用 Nacos。
Nacos 依赖 Java 环境来运行,而且须要对 Nacos 代码构建生成可执行程序时,还要有 Maven 环境,因此部署前须要保证环境要求:
当前最新的 Nacos 版本为 1.0.1,Maven 方式打包后会在当前目录 distribution/target
下生成两个压缩包 nacos-server-1.0.1.tar.gz
和 nacos-server-1.0.1.zip
,任意解压一个使用便可。
这里 Nacos 单机部署方式使用命令 -m standalone
,若是是 Windows 命令,能够直接双击 startup.cmd
文件便可。
当控制台出现 Nacos 字母,而且出现 Nacos started successfully in stand alone mode
提示时就说明了 Nacos 服务端启动成功,控制台上也直接给出了当前可访问的 Nacos 控制台地址 http://{ip}:8848/nacos/index.html
,点击就进入了 Nacos 的可视化管理界面,须要帐号密码登陆访问,默认都为 nacos
。
登陆以后就能在网站侧边栏上看到 Nacos 的主要功能菜单:配置管理,服务管理,集群管理,命名空间。对于服务注册与发现功能来讲,咱们只要看关注服务管理便可。
服务管理下目前只有一个名为服务列表的子菜单,展现的内容也比较简单,包含服务名称,组别,集群数目,总的实例数,运行中的实例数。
当有新的服务经过 Nacos 客户端注册到 Nacos 上时列表项就会增长,咱们还能够经过操做栏的按钮进行对服务的详情查看和编辑。
相比 Nacos 简单的单机部署,集群部署方式稍微麻烦一些,跟着官方文档走仍是有点小坑,还须要本身额外的调整。 为了用于生产环境,必须确保 Nacos 的高可用,因此仍是有必要实践下集群部署的操做。
准备环境跟单机部署相同,额外的要求就是 Nacos 须要 3 个或 3 个以上 Nacos 节点构成集群,而且使用 MySQL 做为数据源,主要用于服务配置的数据持久化。
咱们先看下官方推荐的集群部署架构图,经过域名方式反向代理如 Nginx 来负载多个 Nacos 节点 IP,外部客户端直接经过域名访问就可,不只可读性好,并且更换 IP 方便,最为推荐采用。
在每一个 Nacos 节点的conf
目录下,添加配置文件 cluster.conf
,能够参考相同目录下的 cluster.conf.example
文件,每行配置一个节点的 IP 和端口,如 ip:port
注意:配置文件中不能使用
127.0.0.1
或者localhost
,须要真实 IP 或者域名,不然启动后服务没法注册到该集群节点上, 详见NACOS ISSUE #1189 。
Nacos 推荐生产环境中数据库使用建议至少主备模式,或者采用高可用数据库。
这里为了简化只采用了一个数据库。首先新建一个名为 nacos_config
的数据库,使用提供的 sql 语句源文件 导入初始数据。
而后在每一个 Nacos 节点的配置文件 conf/application.properties
里添加数据库链接配置:
最后以集群模式分别启动每一个节点,而且默认为后台启动,启动信息须要从 logs/logs/start.out
日志文件中获取。
当日志文件最后出现 Nacos started successfully in cluster mode.
一行时,即说明集群模式下 Nacos 启动成功。这时,咱们也能够经过登陆任一个 Nacos 控制台的集群管理界面看到节点的信息。
能够从上面看到,集群下的 Nacos 节点状态分为 FOLLOWER
,LEADER
两种,跟咱们熟悉的主从架构类似。
到这里,咱们集群方式的搭建也完成了。接下咱们就来看下如何使用 Nacos 进行服务注册和发现吧。
建立一个子项目工程名为 rest-provider
的服务提供者项目,pom.xml
配置以下:
注意这里的 spring-cloud-starter-alibaba-nacos-discovery
版本为 0.9.0,采用的是 Nacos 1.0.0 版本的客户端,而对应 Spring Boot 版本须要为 2.1.x.RELEASE 版本, 更多版本对应关系参考:版本说明 Wiki
所以咱们使用 Spring Cloud Alibaba 最新版本 0.9.0.RELEASE
,对应 Spring Cloud Greenwich 版本,父 Maven 项目 POM 配置须要添加以下依赖管理:
依赖添加以后,在引导类中实现一个 Rest 请求方法 /echo
,而且经过 @EnableDiscoveryClient
注解代表是一个 Nacos 客户端,而该注解是 Spring Cloud 提供的原生注解,就算切换成 Eureka 做为注册中心也是用这个注解。
修改子项目配置文件 application.properties
spring.application.name
声明了服务名称spring.cloud.nacos.discovery.server-addr
指定了 Nacos 注册中心地址Nacos Starter 更多配置项信息能够参考 Spring Cloud Alibaba Nacos Discovery
而后经过引导类 RestProviderApplication
运行项目,登陆 Nacos Server 控制台,查看服务列表便可看到服务提供者 rest-provider
已经注册成功。
一样的方式咱们建立一个服务消费者项目 rest-consumer
,pom.xml
依赖和 application.properties
配置与 provider-consumer
同样, 这里咱们显式地使用 LoadBalanceClient API 和 RestTemplate 结合的方式来消费服务。
首先在引导类中添加 @EnableDiscoveryClient
注解
再建立一个名为 RestConsumerConfiguration
的 Java 配置类,注入 RestTemplate
。
建立一个名为 RestConsumerController
测试用的 Controller,提供一个请求方法 echo
, 以下:
启动 rest-cosumer
工程后,就能够在 Nacos Server 控制台的服务列表里看到多了一个名为 rest-consumer
的服务,而且直接在浏览器访问 http://localhost:8082/echo
,就会看到:
使用上看是否是很简单呢,其实和 Eureka 没有太大差异,除了这种方式消费 Rest 服务外,Nacos 也支持 Feign 方式,咱们来看下这又是如何使用的吧。
首先须要引入 Feign 客户端依赖:
而后引导类添加注解 @EnableFeignClients
启用 Feign 组件功能,编写一个 EchoService
接口,用于调用远程服务:
Get 请求方式的接口方法参数不能必须使用
@RequestParam
参数指定请求参数名称,不然 Feign 都会经过 POST 方式调用,获得状态码 405 的错误。
注解 @FeignClient
指明了调用的服务提供方名称,echo
方法经过 Spring MVC 提供的注解就能够跟服务提供者的 Rest 接口关联,执行时就会调用对应请求方法。
最后咱们只须要编写一个注入 EchoService
控制器 RestConsumerFeignController
类,提供一个接口调用接口。
一样启动后,直接打开 http://localhost:8082/echo/hi
,就会获得浏览器以下输出:
接下来,咱们看下 Dubbo 怎么使用 Nacos 做为服务注册中心,进行注册与发现的,其实只要用过 ZooKeeper 方式的就会发现很简单。
首先咱们建立一个子工程 dubbo-serivce
,POM 文件添加依赖以下:
dubbo-registry-nacos
是 Dubbo 使用 Nacos 做为注册中心的关键依赖,当前版本为 0.0.1。接着定义服务接口 DemoService
:
仍是服务生产者先来,添加一个类 DemoServiceImpl
实现服务接口
而后以 XML 配置方式配置 Dubbo,只须要在 dubbo:registry
元素上配置 Nacos 服务端地址便可。
最后用简单类BasicProvider
的 main
方法直接启动服务生产者,保持进程常驻。
正常启动后咱们直接在 Nacos 控制台的服务列表里就能够,Dubbo 生产者服务已经成功注册到 Nacos 上了,能够经过详情看到服务的具体数据,好比服务端口,方法之类。
有了服务生产者,就来看下怎么去经过 Nacos 调用 Dubbo 服务。
首先,经过 XML 配置方式注入用 Dubbo 服务对象 DemoService
, 在 dubbo:registry
元素上配置 Nacos 服务端地址。
而后编写简单类 BasicConsumer
,在 main
方法中加载 Spring 容器,获取 DemoService
对象,直接进行 RCP 调用。
运行以后,咱们能够从 IDE 控制台上看到不断有日志输出,说明了经过 Nacos 注册中心的Dubbo 服务调用成功了。
本文主要学习了解 Nacos,以及使用 Nacos 的服务注册与发现功能,如何与 Rest 服务,Dubbo 服务进行集成使用,总体上简单易用,有兴趣的朋友也尝试用下吧。后续我将继续深刻研究 Spring Cloud Alibaba 微服务生态的组件,欢迎感兴趣的小伙伴能够关注个人微信公众号,每周一更。
本文所涉及全部代码片断均在下面仓库中,欢迎感兴趣的小伙伴参考学习:
nacos-actions:github.com/wrcj12138aa…
环境支持: