Java微服务新生代之Nacos

前言

从 2017 年底 Java 开发领域使用最广的 RPC 框架 Dubbo 开启重新更新维护之路开始,阿里巴巴为打造 Dubbo 微服务生态持续开源了 SentinelNacosSeata 等微服务中间件框架,并且推出了 Spring Cloud Alibaba 来提供微服务开发的一站式解决方案,阿里巴巴在 Java 社区持续活跃起来,也为 Java 微服务开发注入了新的活力。

本篇文章将重点学习微服务组件 Nacos 作为注册中心的功能和用法,Nacos 是阿里巴巴于 2018 年 7 月份新开源的项目。

关于 Nacos 名字:前四个字母分别为 Naming 和 Configuration 的前两个字母,最后的 s 为Service。

本文主要内容涉及如下:

  • Nacos 基本介绍
  • 为什么使用 Nacos
  • 最新版本 Nacos 与 Rest/Dubbo 服务的注册与发现集成

关于 Nacos /nɑ:kəʊs/

一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

上面这句话摘自 Nacos 官方首页,是对 Nacos 整体功能的总结。

简单来说 Nacos 就是注册中心 + 配置中心的组合,提供简单易用的特性集,帮助我们解决微服务开发必会涉及到的服务注册与发现,服务配置,服务管理等问题。Nacos 还是 Spring Cloud Alibaba 组件之一,负责服务注册与发现

首先来看下官方对 Nacos 的特性描述:

  • 服务发现和服务健康监测
  • 动态配置服务
  • 动态 DNS 服务
  • 服务及其元数据管理
  • 不断新增...

可以发现所有特性都离不开服务这一词,服务 (Service) 是 Nacos 世界中的一等公民,说明了服务是 Nacos 中最主要的角色。

为什么是 Nacos

现在的微服务生态中,已经有很多服务注册与发现的开源组件,如 Eurka,ZooKeeper,Consul,为什么还要用 Nacos 呢,我们看下这些框架的简单对比:

服务注册与发现框架 CAP 模型 控制台管理 社区活跃度
Eureka AP 支持 低 (2.x 版本闭源)
Zookeeper CP 不支持
Consul CP 支持
Nacos AP 支持

据说 Nacos 在阿里巴巴内部有超过 10 万的实例运行,已经过了类似双十一等各种大型流量的考验。

相比之下,目前的 Nacos 无论是部署,还是使用上都简单上手,更重要的是文档资料齐全,社区活跃度高。

并且 Nacos 与目前主流的开源生态都提供了很好的支持:

  • Nacos 是专为 Dubbo 而生的注册中心与配置中心
  • Nacos 会完全兼容 Spring Cloud
  • Nacos 支持 Service Mesh 集成,Kubernetes 集成

除此之外,阿里巴巴正在通过 Dubbo + Nacos 以及一系列开源项目打造服务发现、服务及流量管理、服务共享平台,未来还在不断地发展和演进,相信未来会有更多的地方上使用 Nacos。

Nacos 实战

单机部署

准备环境

Nacos 依赖 Java 环境来运行,并且需要对 Nacos 代码构建生成可执行程序时,还要有 Maven 环境,所以部署前需要保证环境要求:

  • 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
  • 64 bit JDK 1.8+
  • Maven 3.2.x+

下载安装

下载

当前最新的 Nacos 版本为 1.0.1,Maven 方式打包后会在当前目录 distribution/target 下生成两个压缩包 nacos-server-1.0.1.tar.gznacos-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

image-20190616001254325

登录之后就能在网站侧边栏上看到 Nacos 的主要功能菜单:配置管理,服务管理,集群管理,命名空间。对于服务注册与发现功能来说,我们只要看关注服务管理即可。

image-20190616001603599

服务管理下目前只有一个名为服务列表的子菜单,展示的内容也比较简单,包含服务名称,组别,集群数目,总的实例数,运行中的实例数。

image-20190616001806599

当有新的服务通过 Nacos 客户端注册到 Nacos 上时列表项就会增加,我们还可以通过操作栏的按钮进行对服务的详情查看和编辑。

集群部署

相比 Nacos 简单的单机部署,集群部署方式稍微麻烦一些,跟着官方文档走还是有点小坑,还需要自己额外的调整。 为了用于生产环境,必须确保 Nacos 的高可用,所以还是有必要实践下集群部署的操作。

准备环境跟单机部署相同,额外的要求就是 Nacos 需要 3 个或 3 个以上 Nacos 节点构成集群,并且使用 MySQL 作为数据源,主要用于服务配置的数据持久化。

我们先看下官方推荐的集群部署架构图,通过域名方式反向代理如 Nginx 来负载多个 Nacos 节点 IP,外部客户端直接通过域名访问就可,不仅可读性好,而且更换 IP 方便,最为推荐采用。

deployDnsVipMode.jpg

添加集群配置文件

在每个 Nacos 节点的conf目录下,添加配置文件 cluster.conf,可以参考相同目录下的 cluster.conf.example 文件,每行配置一个节点的 IP 和端口,如 ip:port

image

注意:配置文件中不能使用 127.0.0.1 或者localhost ,需要真实 IP 或者域名,否则启动后服务无法注册到该集群节点上, 详见NACOS ISSUE #1189

配置 MySQL 数据库

Nacos 推荐生产环境中数据库使用建议至少主备模式,或者采用高可用数据库。

这里为了简化只采用了一个数据库。首先新建一个名为 nacos_config 的数据库,使用提供的 sql 语句源文件 导入初始数据。

image-20190616003609656

然后在每个 Nacos 节点的配置文件 conf/application.properties 里添加数据库连接配置:

application

最后以集群模式分别启动每个节点,并且默认为后台启动,启动信息需要从 logs/logs/start.out日志文件中获取。

start.out

当日志文件最后出现 Nacos started successfully in cluster mode. 一行时,即说明集群模式下 Nacos 启动成功。这时,我们也可以通过登录任一个 Nacos 控制台的集群管理界面看到节点的信息。

image-20190616015114761

可以从上面看到,集群下的 Nacos 节点状态分为 FOLLOWERLEADER 两种,跟我们熟悉的主从架构相似。

到这里,我们集群方式的搭建也完成了。接下我们就来看下如何使用 Nacos 进行服务注册和发现吧。

实现服务的注册与发现

Rest 服务的注册与发现

服务提供者创建

创建一个子项目工程名为 rest-provider 的服务提供者项目,pom.xml 配置如下:

rest-provider

注意这里的 spring-cloud-starter-alibaba-nacos-discovery 版本为 0.9.0,采用的是 Nacos 1.0.0 版本的客户端,而对应 Spring Boot 版本需要为 2.1.x.RELEASE 版本, 更多版本对应关系参考:版本说明 Wiki

image-20190616105233354

因此我们使用 Spring Cloud Alibaba 最新版本 0.9.0.RELEASE,对应 Spring Cloud Greenwich 版本,父 Maven 项目 POM 配置需要添加如下依赖管理:

pom

依赖添加之后,在引导类中实现一个 Rest 请求方法 /echo,并且通过 @EnableDiscoveryClient 注解表明是一个 Nacos 客户端,而该注解是 Spring Cloud 提供的原生注解,就算切换成 Eureka 作为注册中心也是用这个注解。

引导类

修改子项目配置文件 application.properties

application
  • spring.application.name 声明了服务名称
  • spring.cloud.nacos.discovery.server-addr 指定了 Nacos 注册中心地址

Nacos Starter 更多配置项信息可以参考 Spring Cloud Alibaba Nacos Discovery

然后通过引导类 RestProviderApplication 运行项目,登录 Nacos Server 控制台,查看服务列表即可看到服务提供者 rest-provider 已经注册成功。

image-20190616110759521
服务消费者创建

同样的方式我们创建一个服务消费者项目 rest-consumerpom.xml 依赖和 application.properties 配置与 provider-consumer 一样, 这里我们显式地使用 LoadBalanceClient API 和 RestTemplate 结合的方式来消费服务。

  1. 首先在引导类中添加 @EnableDiscoveryClient 注解

    引导类

  2. 再创建一个名为 RestConsumerConfiguration 的 Java 配置类,注入 RestTemplate

    RestConsumerConfiguration.java

  3. 创建一个名为 RestConsumerController 测试用的 Controller,提供一个请求方法 echo, 如下:

    RestConsumerController.java

  4. 启动 rest-cosumer 工程后,就可以在 Nacos Server 控制台的服务列表里看到多了一个名为 rest-consumer 的服务,并且直接在浏览器访问 http://localhost:8082/echo,就会看到:

    image-20190616113423983

使用上看是不是很简单呢,其实和 Eureka 没有太大差别,除了这种方式消费 Rest 服务外,Nacos 也支持 Feign 方式,我们来看下这又是如何使用的吧。

Feign 方式消费 Rest 服务

首先需要引入 Feign 客户端依赖:

Feign POM

然后引导类添加注解 @EnableFeignClients 启用 Feign 组件功能,编写一个 EchoService 接口,用于调用远程服务:

EchoService

Get 请求方式的接口方法参数不能必须使用 @RequestParam 参数指定请求参数名称,否则 Feign 都会通过 POST 方式调用,得到状态码 405 的错误。

注解 @FeignClient 指明了调用的服务提供方名称,echo 方法通过 Spring MVC 提供的注解就可以跟服务提供者的 Rest 接口关联,执行时就会调用对应请求方法。

最后我们只需要编写一个注入 EchoService 控制器 RestConsumerFeignController 类,提供一个接口调用接口。

RestConsumerFeignController

同样启动后,直接打开 http://localhost:8082/echo/hi,就会得到浏览器如下输出:

image-20190616142413540

Dubbo 服务的注册与发现

接下来,我们看下 Dubbo 怎么使用 Nacos 作为服务注册中心,进行注册与发现的,其实只要用过 ZooKeeper 方式的就会发现很简单。

首先我们创建一个子工程 dubbo-serivce,POM 文件添加依赖如下:

POM
  • 这里我们按照官方推荐使用 2.6.5 版本的 Dubbo 集成 Nacos。
  • dubbo-registry-nacos 是 Dubbo 使用 Nacos 作为注册中心的关键依赖,当前版本为 0.0.1。

接着定义服务接口 DemoService

DemoService
服务生产者

还是服务生产者先来,添加一个类 DemoServiceImpl 实现服务接口

DemoServiceImpl

然后以 XML 配置方式配置 Dubbo,只需要在 dubbo:registry元素上配置 Nacos 服务端地址即可。

XML

最后用简单类BasicProvidermain 方法直接启动服务生产者,保持进程常驻。

BasicProvider

正常启动后我们直接在 Nacos 控制台的服务列表里就可以,Dubbo 生产者服务已经成功注册到 Nacos 上了,可以通过详情看到服务的具体数据,比如服务端口,方法之类。

image-20190616144317355
服务消费者

有了服务生产者,就来看下怎么去通过 Nacos 调用 Dubbo 服务。

首先,通过 XML 配置方式注入用 Dubbo 服务对象 DemoService, 在 dubbo:registry元素上配置 Nacos 服务端地址。

XML

然后编写简单类 BasicConsumer ,在 main 方法中加载 Spring 容器,获取 DemoService 对象,直接进行 RCP 调用。

BasicConsumer

运行之后,我们可以从 IDE 控制台上看到不断有日志输出,说明了通过 Nacos 注册中心的Dubbo 服务调用成功了。

IDE 控制台

结语

本文主要学习了解 Nacos,以及使用 Nacos 的服务注册与发现功能,如何与 Rest 服务,Dubbo 服务进行集成使用,整体上简单易用,有兴趣的朋友也尝试用下吧。后续我将继续深入研究 Spring Cloud Alibaba 微服务生态的组件,欢迎感兴趣的小伙伴可以关注我的微信公众号,每周一更。

公众号

代码示例

本文所涉及所有代码片段均在下面仓库中,欢迎感兴趣的小伙伴参考学习:

nacos-actionshttps://github.com/wrcj12138aaa/nacos-actions

环境支持:

  • JDK 8
  • Spring Boot 2.1.0
  • Maven 3.6.0

参考

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容

  • 上个月最后一天的凌晨,Spring Cloud Alibaba 正式入驻了 Spring Cloud 官方孵化器,...
    方志朋阅读 5,476评论 0 16
  • 0 准备 安装注册中心:Zookeeper、Dubbox自带的dubbo-registry-simple;安装Du...
    七寸知架构阅读 13,955评论 0 88
  • 问题: 在Spring Boot的Controller中接收日期类型,格式是yyyy-MM-dd HH:mm:ss...
    else05阅读 3,383评论 0 1
  • 从村里回来,不忙时,会绕苏坑河走一圈。在拐弯处,有三两簇竹林。人未近,鸟鸣声已将你围住。啾啾啾,听不出是哪种鸟。不...
    小畴阅读 308评论 0 3
  • 我背对着她离开的方向 长久地站立 环绕我的是不知谁家的点点灯火, 这是一个开满繁花的冬天 落花的时候飞向天际 我看...
    留子尧阅读 178评论 1 11