SpringCloud第二代实战系列:使用Nacos实现服务注册与发现
一、背景:SpringCloud 生态圈
在正式开始本篇文章之前我们先岔开来讲一下SpringCloud的生态圈。
SpringCloud大家都比较熟悉了,它制定了分布式系统的标准规范,做了高度抽象和封装,然后将业界公司比较成熟以及经得起实际考验的框架整合起来。通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。我们之前常用的一些SpringCloud组件大部分来自于Netflix公司,比如我们熟知的Eureka,Hystrix,Ribbon等等,然而随着Eureka不再维护且闭源,Hystrix不再开发新功能,Zuul的性能一般而2.0又迟迟出不来,Ribbon不支持webFlux的负载均衡等等 ,这些已经限制了SpringCloud的高速发展,于是大家开始把目光转向第二代组合——SpringCloud Alibaba。
1.1、Spring Cloud Alibaba概述
Spring Cloud Alibaba 于 2018年成为SpringCloud的孵化项目,2018年7月27日 在 Spring Cloud 孵化器仓库提交第一次代码,到 2019年8月1日 在 Alibaba 仓库发布第一个正式版本。
1.2、第一代和第二代部分常用组件对比
SringCloud 第一代 | SringCloud 第二代 | |
---|---|---|
网关 | Zuul(Netflix) | Gateway(SpringCloud) |
注册中心 | Eureka(Netflix),Consul、ZK | Nacos(阿里) |
配置中心 | SprigCloudConfig | Nacos(阿里),Apollo(携程)等 |
负载均衡 | Ribbon(Netflix) | Loadbalancer(SpringCloud) |
熔断器 | Hystrix(Netflix) | Resilience4J(spring-cloud-r4j),Sentinel (阿里) |
二、Nacos介绍及与Eureka的对比
-
- *
微服务项目,我们肯定绕不开服务注册接下来我们正式进入今天的正题,一起来认识一下Nacos。关键特性有:服务发现和服务健康监测,动态配置服务,动态 DNS 服务,服务及其元数据管理等等
- *
2.1 介绍
官方介绍:
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您实现动态服务发现、服务配置管理、服务及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos 是构建以“服务”为中心的现代应用架构(例如微服务范式、云原生范式)的服务基础设施。
2.2 Nacos对比Eureka
既然称之为第二代,那么Nacos对比Eureka,是否具有优势呢?我们来看一下对比
更多关于Naclos的介绍可参见官网:https://nacos.io/
三、Nacos安装与配置
-
- *
接下来我们来使用Nacos进行服务的注册与发现(Nacos还可以实现分布式配置管理,在后续章节再进行讲解)。开始之前需确保我们的环境符合要求:操作系统是64位,且本地已安装了JDK1.8+,Maven3.2.X。
- *
3.1 下载Nacos
下载地址:https://github.com/alibaba/nacos/releases
由于众所周知的原因,有的时候github访问非常的慢,我们可以访问国内的镜像仓库:https://gitee.com/mirrors/Nacos,下载后自己手动镜像编译即可。
3.2 解压启动
编写本篇文字时,Nocos1.2 处于Beta1阶段,所以我下载的是1.1.4Release版本。
我们将下载的安装包直接解压到本地,直接双击bin目录下的startup.cmd即可启动,非常地方便,
Nacos的默认端口是8848,访问地址:http://127.0.0.1:8848/nacos/index.html#/login ,界面如下:
用户名/密码: nacos/nacos,登录系统:
3.3 配置调整
如果需要修改端口号,或者修改contextPath等,只需要修改conf/application.properties文件即可
3.4 使用Mysql数据库
Nacos默认内置了一个Mysql数据库,为了便于管理,我们可以改为外置的数据库(尤其是在使用Nacos的分布式配置中心功能时,一定要改为外置的数据库,分布式配置中心功能后续会进行讲解),目前只支持Mysql,不支持其他数据库,
3.4.1 初始化数据库
我们找到conf目录下的nacos-mysql.sql,并进行初始化
3.4.2 添加数据库配置
修改conf/application.properties文件,追加以下数据库信息。
db.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=nacos_devtest db.password=youdontknow
配置完后,直接启动即可。
3.4.3 踩坑记录
我们在启动过程中,可能会遇到如下的错误:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'opsController' defined in URL [jar:file:/D:/Dev/nacos-server-1.1.4/target/nacos-server.jar!/BOOT-INF/lib/nacos-config-1.1.4.jar!/com/alibaba/nacos/config/server/controller/OpsController.class]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dumpService': Invocation of init method failed; nested exception is java.lang.RuntimeException: Nacos Server did not start because dumpservice bean construction failure : No DataSource set at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:769) at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:218) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1308)
参考了网上的部分资料,在Linux环境下可能是防火墙的问题,需要关闭防火墙,再进行启动。在我的环境中发现和防火墙没关系,是版本问题:Mysql当前不支持使用Mysql8,只支持Mysql5。如果需要使用Mysql8,稍微修改下代码即可。支持8.0的方法可参考:
https://www.cnblogs.com/gyli20170901/p/11245270.html
四、使用Nacos作为注册中心
-
- *
4.1 创建工程
我们新建一个member-service的 Gradle工程(Maven工程一样设置),添加jar包依赖,Gradle配置如下:
implementation group: 'com.alibaba.cloud', name: 'spring-cloud-starter-alibaba-nacos-discovery', version: '2.1.1.RELEASE'
4.2 添加配置
在我们的项目中新建一个application.yml文件,配置如下:
spring: application: name: order-service cloud: nacos: discovery: server-addr: 127.0.0.1:8848
注意:网上有的教程说只支持properties不支持yml,这个说明是错误的,是可以使用yml配置。还有的教程说需要新建一个bootstrap.properties文件,这个说法也是不准确的,在使用Nacos的配置中心功能时才需要。如果仅仅是作为服务注册中心,这个也是没有必要的。关于Nacos配置中心的用法,后续章节会进行讲解。
4.3 注册成功
项目启动后,我们访问【服务管理】-【服务列表】页面,可以看到我们的服务已经注册上去了,非常地方便。
五、集群配置
-
- *
产线实际使用时,为了确保服务的高可能,正常会配置至少3台,所以我们需要进行集群的配置。
- *
5.1 集群配置
在conf目录下,新建一个cluster.conf,配置集群机器的地址即可。建议至少配置三台
172.22.204.10:8848 172.22.204.10:8849 172.22.204.10:8850
5.2 依次启动
依次启动3台机器,访问【集群管理】-【节点列表】,我们发现已经配置成功。并且自动选举出了一台作为Leader。
Nacos使用的是Raft算法,将Server划分为3种状态或者也可以称作角色:
- Leader:负责Client交互和log复制,同一时刻系统中最多存在1个。
- Follower:被动响应请求RPC,从不主动发起请求RPC。
- Candidate:一种临时的角色,只存在于leader的选举阶段,某个节点想要变成leader,那么就发起投票请求,同时自己变成candidate。如果选举成功,则变为candidate,否则退回为follower
5.3 踩坑记录
- 坑1: 我们本地测试的时候,如果设置ip为127.0.0.1或者localhost会发现服务无法访问,一定要配置成我们本机的真实的IP。
这个对于我们本机做集群测试时非常地不方便,比如在公司配置了一个地址后,到家ip发生了变化,又得修改cluster配置文件。 - 坑2: window环境下默认是单机模式启动,需要修改为集群模式。
查看bin/startup.cmd
set MODE="standalone" set FUNCTION_MODE="all" set SERVER=nacos-server set MODE_INDEX=-1 set FUNCTION_MODE_INDEX=-1 set SERVER_INDEX=-1
将Mode由standalone改为cluster即可(在startup.sh脚本中,默认是集群的方式)修改后重新启动:
六、谁在使用
-
- *
按照官方的说法,1.0之后的版本大家完全可以放心大胆地在产线上使用。目前使用nacos的企业已经有很多,包括阿里自身,以及工商银行,平安、爱奇艺、虎牙直播、汽车之家等等。
- *
七、参考资料
-
- *
- SpringCloudAlibaba地址:https://github.com/alibaba/spring-cloud-alibaba
- Nacos官方网站:https://nacos.io/
- Nacos数据持久化 mysql8.0https://www.cnblogs.com/gyli20170901/p/11245270.html
- http://springcloud.cn/view/415
- https://www.jianshu.com/p/afd7776a64c6
微信公众号:码大叔
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
浅谈对微服务中熔断和降级的理解
一.前言 在股票市场,熔断这个词大家都不陌生,是指当股指波幅达到某个点后,交易所为控制风险采取的暂停交易措施。相应的,服务熔断一般是指软件系统中,由于某些原因使得服务出现了过载现象,为防止造成整个系统故障,从而采用的一种保护措施,所以很多地方把熔断亦称为过载保护。大家都见过女生旅行吧,大号的旅行箱是必备物,平常走走近处绰绰有余,但一旦出个远门,再大的箱子都白搭了,怎么办呢?常见的情景就是把物品拿出来分分堆,比了又比,最后一些非必需品的就忍痛放下了,等到下次箱子够用了,再带上用一用。而服务降级,就是这么回事,整体资源快不够了,忍痛将某些服务先关掉,待渡过难关,再开启回来。 二.熔断 当下游的服务因为某种原因突然变得不可用或响应过慢,上游服务为了保证自己整体服务的可用性,不再继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。需要说明的是熔断其实是一个框架级的处理,那么这套熔断机制的设计,基本上业内用的是断路器模式,如Martin Fowler提供的状态转换图如下所示 最开始处于closed状态,一旦检测到错误到达一定阈值,便转为open状态; 这时候会有个 rese...
- 下一篇
支撑阿里 99% 数据开发的 DataWorks 在技术架构变革方面的实践
DataWorks 是阿里巴巴自主研发,支撑阿里巴巴经济体 99% 数据业务建设和治理,每天数万名数据开发和算法开发工程师在使用。 从 2010 年起步到目前的版本,经历了多次技术变革和架构升级,也遗留了大量的历史包袱。技术的创新和业务的发展,相辅相成但也互为掣肘。存在需求接入慢,代码牵一发而动全身,环境复杂等问题,沉疴已久。历次迭代均未从根基上升级 DataWorks ,仅仅是一些性能提升、工程结构的优化,减少了重复代码等,并未促成根本性的技术革命。 本文将探讨如何通过当前大热的微服务架构,来改变 DataWorks 平台的现实问题,从繁杂的工程中探索出一条切实可行的技术架构变革之路。 痛点 让我们先来谈谈 DataWorks 当前遇到了哪些痛点,这些痛点是倒逼着我们进行技术变革的源动力。 沉重的历史包袱 首先要提的就是历史原因遗留的各种问题, DataWorks 历史上多个版本同步开发,前后端技术栈多次变革,应用一旦上线就很难废弃,一个对外暴露的 API ,很可能是 5 年前开发的,但依然有业务在依赖,通常情况下连这些古老业务的负责人都找不到了。当我们的服务正常运行的时候,无人搭理...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS8编译安装MySQL8.0.19