Spring|Spring Cloud体系中Eureka闭源,作用Consul做注册中心到底爽不爽()
1、SpringCloud技术栈
【Spring|Spring Cloud体系中Eureka闭源,作用Consul做注册中心到底爽不爽()】开发分布式系统可能具有挑战性,复杂性已从应用程序层转移到网络层,并要求服务之间进行更多的交互。将代码设为“cloud-native”就需要解决12-factor,例如外部配置,服务无状态,日志记录以及连接到备份服务之类的问题,Spring Cloud项目套件包含使您的应用程序在云中运行所需的许多服务。
12-factor(云原生应用程序的12要素):
文章图片
SpringCloud架构:
文章图片
1.1 SpringCloud技术栈
文章图片
SpringCloud技术栈非常丰富,这也是SpringCloud为什么在微服务领域中如此受欢迎的原因之一,技术栈如上图,在服务注册与配置、服务调用、微服务网关、消息组件、链路追踪、配置中心、安全控制、将极限流等诸多方面技术栈都比较完善,而且阿里巴巴也出了一套SpringCloud Alibaba版本,主要集成了Alibaba中主流的技术栈。
1.2 SpringCloud经典技术介绍
微服务项目近几年非常火爆,推出来的相关技术解决方案热度也非常活跃,但SpringCloud技术栈中也有一部分技术组件在逐步被淘汰或者闭源,但都有更优秀的技术方案替代。在不久的将来,那些闭源或者将被淘汰的技术有很大概率将不在项目中使用,所以我们学习的时候可以直接学习更优秀的替代技术方案。
Eureka闭源:
文章图片
上面英文大概意思是:Eureka 2.0
的开源工作已经停止,依赖于开源库里面的 Eureka 2.x
分支构建的项目或者相关代码,风险自负。
Eureka在微服务项目中主要承担服务注册与发现工作,可以替代的技术方案比较多,而且很多方案都比Eureka优秀,比如Consul、Nacos等。
Hystrix停止更新:
文章图片
Hystrix在项目中主要做服务熔断、降级,但官方宣布将不在开发,目前处于维护状态,但官方表示 1.5.18 版本的 Hystrix 已经足够稳定,可以满足 Netflix 现有应用的需求。
关于Hystrix可替代的产品也比较多,比如官方推荐的resilience4j
,resilience4j
是一个轻量级熔断框架,但resilience4j
目前在国内使用频率还不高,功能也不够强,我们更推荐使用功能更加强悍的SpringCloud Alibaba Sentinel
。
Zuul过时:
Zuul
是一个微服务网关技术,但Zuul1.x
使用的是阻塞式的API,不支持长连接,没有提供异步,高并发场景下性能低。SpringCloud
官网推出了全新的微服务网关技术SpringCloud Gateway
,比Zuul
性能更强悍、功能更丰富、且支持异步等多种特性。
SpringCloud Config实用性差:
SpringCloud Config
主要用于管理项目的配置文件,每次要使用SpringCloud Config
的时候,总得经过一波操作和配置的折腾,才可以使用SpringCloud Config
实现配置管理,而且单独使用无法支持配置实时刷新,在项目中用起来,真比较头疼的。
当前有很多技术可以取代SpringCloud Config
,比如携程的Apollo
、SpringCloud Alibaba Nacos
,功能都比SpringCloud Config
强,并且支持实时刷新配置。
SpringCloud Bus实用性差:
SpringCloud Bus是服务消息总线,主要实现通知多个服务执行某个任务,一般和SpringCloud Config一起使用。这个功能其实不太使用,因为很多任务组件基本都具备消息通知功能,比如Nacos、Apollo都能实现所有服务订阅执行相关操作。
1.3 SpringCloud项目场景
文章图片
微服务技术目前已经在很多国内外大厂中都在广泛使用,那么在项目中该如何使用微服务技术呢?我们以滴滴快车业务未来,来讲解一下微服务技术结合业务应用讲解一下。
文章图片
打车业务如上图:
1:打车的时候会选择车型,选择车型我们调用过程是:Gateway->Driver(加载司机列表)
2:选择车型后确认打车,相当于要下单了,调用过程是:Gateway->Order(下单)->Driver(司机状态更改)
3:打车结束后,用户进入支付,调用过程是:Gateway->Pay(支付)->Driver(更新司机状态)
->Order(更新订单状态)
2、SpringCloud Consul 我们知道
Eureka 2.X
遇到困难停止开发了,所以我们需要寻找其他的替代技术替代Eureka,这一小节我们就讲解一个新的组件Consul。2.1 Consul介绍
Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其它分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其它工具(比如 ZooKeeper 等)。使用起来也较 为简单。Consul 使用 Go 语言编写,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。
我们来对比下当前服务注册与发现的主流技术:
对比项 | euerka | Consul | zookeeper | etcd |
---|---|---|---|---|
服务健康检查 | 可配支持 | 服务状态,内存,硬盘等 | (弱)长连接,keepalive | 连接心跳 |
多数据中心 | — | 支持 | — | — |
kv 存储服务 | — | 支持 | 支持 | 支持 |
一致性 | — | raft | paxos | raft |
cap | ap | cp | cp | cp |
使用接口(多语言能力) | http | 支持 http 和 dns | 客户端 | http/grpc |
watch 支持 | 支持 long polling/大部分增量 | 全量/支持long polling | 支持 | 支持 long polling |
自身监控 | metrics | metrics | — | metrics |
安全 | — | acl /https | acl | https 支持(弱) |
spring cloud 集成 | 已支持 | 已支持 | 已支持 | 已支持 |
- 服务发现
- 健康检查
- Key/Value 存储
- 多数据中心
- 社区活跃
- 使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft。
- 支持多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟, 分片等情况等。 zookeeper 和 etcd 均不提供多数据中心功能的支持。
- 支持健康检查。 etcd 不提供此功能。
- 支持 http 和 dns 协议接口。 zookeeper 的集成较为复杂, etcd 只支持 http 协议。
- 官方提供 web 管理界面, etcd 无此功能。
- 综合比较, Consul 作为服务注册和配置管理的新星, 比较值得关注和研究。
- 提供了rest api 便于集成:https://www.consul.io/api-doc...
- client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群。
- server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其它数据中心通讯。 每个数据中心的 server 数量推荐为 3 个或是 5 个。
2.2 Consul 基础架构
Glossary:术语 见官方文档:https://www.consul.io/docs/in...
- agent
- server 节点
- client 节点
- 数据中心
另外:
server 自行选举一个 leader。虽然 Consul 可以运行在一台 server ,但是建议使用 3 到 5 台来避免失败情况下数据的丢失。每个数据中心建议配置一个 server 集群。
在基础设施中需要发现其他服务的组件可以查询任何一个 Consul 的 server 或者agent,Agent 会自动转发请求到 server。
每个数据中心运行了一个 Consul server 集群。当一个跨数据中心的服务发现和配置请求创建时,本地 Consul Server 转发请求到远程的数据中心并返回结果。
文章图片
如何实现服务注册和发现
文章图片
Consul在项目中发挥服务注册与发现的功能,我们讲解下它的工作原理:
1:当Producer启动的时候,会向Consul发送一个post请求,并向Consul传输自己的IP和Port。
2:Consul 接收到Producer的注册后,每隔10s(默认)会向Producer发送一个健康检查的请求,检验Producer是否健康。
3:当Consumer以Http的方式向Producer发起请求,会先从Consul中拿到一个存储服务IP和Port的临时表,从表中拿到Producer的IP和Port后再发送请求。
4:该临时表每隔10s会更新,只包含有通过了健康检查的Producer。
2.2 Consul安装
Consul 不同于 Eureka, 需要单独安装,访问Consul 官网下载 Consul 的最新版本,当前最新版本是
1.9.0
,我们使用consul_1.9.0_windows_amd64
版本。下载 下载地址:https://www.consul.io/downloa...;linux上如何下载可点击对应标签页查看。
历史版本下载地址:https://releases.hashicorp.co...
文章图片
下载后的文件是
consul_1.9.0_windows_amd64.zip
,我们解压这个文件,里面有个文件consul.exe
,我们将该文件所在目录添加到环境变量path中。安装启动 1、以consul server运行,参考如下命令:
consul agent -server -bootstrap-expect 1 -data-dir /root/consul/data-node=n1 -ui -client=0.0.0.0 -bind=192.168.200.129
- -server 定义 agent 运行在 server 模式
- -bootstrap-expect 1 在一个 datacenter 中期望提供的 server 节点数目,当该值提供的时候,consul一直等到达到指定 sever 数目的时候才会引导整个集群。这里我们为了方便演示只启动一个服务端
- -data-dir 参数设置 Consul 自己的维护的数据存储路径
- -node=n1 节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名
- -bind=127.0.0.1 该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是 0.0.0.0
- -datacenter=dc1 指定当前数据中心名字,该参数可以不设置
- -ui 指定可以以 UI 的方式呈现,当前的 UI 访问地址是:http://本机 IP:8500
- -client=0.0.0.0 consul 服务侦听地址,这个地址提供 HTTP、DNS、RPC 等服务,默认是127.0.0.1所以不对外提供服务,如果你要对外提供服务改成 0.0.0.0,我们当前配置为外提供地址。
启动后访问控制台UI: http://localhost:8500/
文章图片
Services
:服务信息。Nodes
:节点信息,Consul支持集群。Key/Value
:存储的动态配置信息。ACL
:权限信息。Intentions
:通过命令的方式对consul进行管理。2、以consul client运行,参考命令如下:
consul agent -data-dir C:\developer\consul_1.9.6_windows_amd64\data\client -node=n2 -ui -client=0.0.0.0 -bind=192.168.200.10 -join 192.168.200.129
通过以上两部操作,就启动了一个完整的数据中心。
3、如果为了方便使用,可以使用如下命令启动一个agent server,
consul agent -dev
2.3 项目中使用Consul
项目中要想使用Consul作为服务注册中心,只需要引入如下依赖包,在启动类上添加
@EnableDiscoveryClient
注解,并在application.yml
中添加Consul服务地址即可:1)添加依赖
在项目
hailtaxi-gateway
添加依赖包:
org.springframework.cloud
spring-cloud-starter-consul-discovery
2.2.1.RELEASE
org.springframework.boot
spring-boot-starter-actuator
2.2.10.RELEASE
2)添加
@EnableDiscoveryClient
注解在
hailtaxi-gateway
启动类GatewayApplication
上添加@EnableDiscoveryClient
注解:3)配置Consul服务信息
在
application.yml
中添加Consul服务信息:文章图片
配置如下:
spring:
application:
name: hailtaxi-gateway
cloud:
#Consul配置
consul:
host: 127.0.0.1
port: 8500
discovery:
#注册到Consul中的服务名字
service-name: ${spring.application.name}
#注册的服务的实例 Id,最好不要重复,这里参考官网建议的方式 带随机数 默认:应用名:port
#instance-id: ${spring.application.name}:${vcap.application.instance_id:${spring.application.i nstance_id:${random.value}}}
# 自定义实例id为:应用名:ip:port
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
prefer-ip-address: true
# 开启服务注册
register: true
# 开启服务发现
enabled: true
#2 分钟之后健康检查未通过取消注册
health-check-critical-timeout: 2m
#consul 健康检查的轮询周期
health-check-interval: 10s
4)Consul服务数据
文章图片
本文由传智教育博学谷 - 狂野架构师教研团队发布,转载请注明出处!
如果本文对您有帮助,欢迎关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力
推荐阅读
- CloudBees CI使用Velero进行灾备(DR)概念验证
- Spring Cloud OpenFeign文档
- 大数据Clouder认证(使用DataV制作实时销售数据可视化大屏)
- SpringBoot快速整合通用Mapper
- spring-boot-starter原理及实现方法
- Spring学习笔记(4)Spring|Spring学习笔记(4)Spring 事件原理及其应用
- SpringBoot开发|SpringBoot开发 - 什么是热部署和热加载(devtool的原理是什么?)
- SpringMVC|SpringMVC @GetMapping注解路径冲突问题解决
- SpringMVC数据页响应ModelAndView实现页面跳转
- SpringCloudGateway微服务网关实战与源码分析|SpringCloudGateway微服务网关实战与源码分析 - 中