1、SpringCloud技术栈

开发分布式系统可能具有挑战性,复杂性已从应用程序层转移到网络层,并要求服务之间进行更多的交互。将代码设为“cloud-native”就需要解决12-factor,例如外部配置,服务无状态,日志记录以及连接到备份服务之类的问题,Spring Cloud项目套件包含使您的应用程序在云中运行所需的许多服务。

12-factor(云原生应用程序的12要素):

Eureka闭源,Consul作为注册中心实战_微服务

SpringCloud架构:

Eureka闭源,Consul作为注册中心实战_spring_02

1.1 SpringCloud技术栈

Eureka闭源,Consul作为注册中心实战_数据中心_03

SpringCloud技术栈非常丰富,这也是SpringCloud为什么在微服务领域中如此受欢迎的原因之一,技术栈如上图,在服务注册与配置、服务调用、微服务网关、消息组件、链路追踪、配置中心、安全控制、将极限流等诸多方面技术栈都比较完善,而且阿里巴巴也出了一套SpringCloud Alibaba版本,主要集成了Alibaba中主流的技术栈。

1.2 SpringCloud经典技术介绍

微服务项目近几年非常火爆,推出来的相关技术解决方案热度也非常活跃,但SpringCloud技术栈中也有一部分技术组件在逐步被淘汰或者闭源,但都有更优秀的技术方案替代。在不久的将来,那些闭源或者将被淘汰的技术有很大概率将不在项目中使用,所以我们学习的时候可以直接学习更优秀的替代技术方案。

Eureka闭源:

Eureka闭源,Consul作为注册中心实战_Spring Cloud_04

上面英文大概意思是:​​Eureka 2.0​​​ 的开源工作已经停止,依赖于开源库里面的 ​​Eureka 2.x​​ 分支构建的项目或者相关代码,风险自负。

Eureka在微服务项目中主要承担服务注册与发现工作,可以替代的技术方案比较多,而且很多方案都比Eureka优秀,比如Consul、Nacos等。

Hystrix停止更新:

Eureka闭源,Consul作为注册中心实战_spring_05

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项目场景

Eureka闭源,Consul作为注册中心实战_数据中心_06

微服务技术目前已经在很多国内外大厂中都在广泛使用,那么在项目中该如何使用微服务技术呢?我们以滴滴快车业务未来,来讲解一下微服务技术结合业务应用讲解一下。

Eureka闭源,Consul作为注册中心实战_spring_07

打车业务如上图:

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 存储
  • 多数据中心
  • 社区活跃

Consul 的优势:

  • 使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft。
  • 支持多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟, 分片等情况等。 zookeeper 和 etcd 均不提供多数据中心功能的支持。
  • 支持健康检查。 etcd 不提供此功能。
  • 支持 http 和 dns 协议接口。 zookeeper 的集成较为复杂, etcd 只支持 http 协议。
  • 官方提供 web 管理界面, etcd 无此功能。
  • 综合比较, Consul 作为服务注册和配置管理的新星, 比较值得关注和研究。
  • 提供了rest api 便于集成:​​www.consul.io/api-docs/in…​​

Consul 角色

  • client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群。
  • server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其它数据中心通讯。 每个数据中心的 server 数量推荐为 3 个或是 5 个。

Consul 客户端、服务端还支持夸中心的使用,更加提高了它的高可用性。

2.2 Consul 基础架构

Glossary:术语

见官方文档:​​www.consul.io/docs/instal…​​

  • agent

组成 consul 集群的每个成员上都要运行一个 agent,可以通过 consul agent 命令来启动。agent可以运行在 server 状态或者 client 状态。自然的,运行在 server 状态的节点被称为 server 节点;运行在 client 状态的节点被称为 client 节点。

  • server 节点

负责组成 cluster 的复杂工作(选举server 自行选举一个 leader、状态维护、转发请求到 lead),以及 consul 提供的服务(响应RPC 请求),以及存放和复制数据。考虑到容错和收敛,一般部署 3 ~ 5 个比较合适。

  • client 节点

负责转发所有的 RPC 到 server 节点。本身无状态,且轻量级,因此,可以部署大量的client 节点。

  • 数据中心

虽然数据中心的定义似乎很明显,但仍有一些细微的细节必须考虑。我们将一个数据中心定义为一个私有、低延迟和高带宽的网络环境。这不包括通过公共互联网的通信,但是为了我们的目的,单个EC2 区域内的多个可用区域将被视为单个数据中心的一部分。

另外:

server 自行选举一个 leader。虽然 Consul 可以运行在一台 server ,但是建议使用 3 到 5 台来避免失败情况下数据的丢失。每个数据中心建议配置一个 server 集群。

在基础设施中需要发现其他服务的组件可以查询任何一个 Consul 的 server 或者agent,Agent 会自动转发请求到 server。

每个数据中心运行了一个 Consul server 集群。当一个跨数据中心的服务发现和配置请求创建时,本地 Consul Server 转发请求到远程的数据中心并返回结果。

Eureka闭源,Consul作为注册中心实战_Java_08

如何实现服务注册和发现

Eureka闭源,Consul作为注册中心实战_微服务_09

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​​版本。

下载

下载地址:​​www.consul.io/downloads.h…​​

历史版本下载地址:​​releases.hashicorp.com/consul/​​

Eureka闭源,Consul作为注册中心实战_微服务_10

下载后的文件是​​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,我们当前配置为外提供地址。

完整启动选项参数见官方文档:​​www.consul.io/docs/agent/…​​

启动后访问控制台UI: ​​http://localhost:8500/​​

Eureka闭源,Consul作为注册中心实战_Spring Cloud_11

​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​​添加依赖包:

<!--consul-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.2.10.RELEASE</version>
</dependency>

2)添加​​@EnableDiscoveryClient​​注解

在​​hailtaxi-gateway​​​启动类​​GatewayApplication​​​上添加​​@EnableDiscoveryClient​​注解:

3)配置Consul服务信息

在​​application.yml​​中添加Consul服务信息:

Eureka闭源,Consul作为注册中心实战_Java_12

配置如下:

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服务数据

Eureka闭源,Consul作为注册中心实战_Java_13

好了,这篇就先到这里吧,如果你觉得学的不过瘾的话,下面是往期干货,绝对让你沉迷学习无法自拔。