Spring Cloud体系中Eureka闭源,作用Consul做注册中心到底爽不爽?

1、SpringCloud技术栈

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

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

file

SpringCloud架构:

file

1.1 SpringCloud技术栈

file

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

1.2 SpringCloud经典技术介绍

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

Eureka闭源:

file

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

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

Hystrix停止更新:

file

Hystrix在项目中主要做服务熔断、降级,但官方宣布将不在开发,目前处于维护状态,但官方表示 1.5.18 版本的 Hystrix 已经足够稳定,可以满足 Netflix 现有应用的需求。

关于Hystrix可替代的产品也比较多,比如官方推荐的resilience4jresilience4j是一个轻量级熔断框架,但resilience4j目前在国内使用频率还不高,功能也不够强,我们更推荐使用功能更加强悍的SpringCloud Alibaba Sentinel

Zuul过时:

Zuul是一个微服务网关技术,但Zuul1.x使用的是阻塞式的API,不支持长连接,没有提供异步,高并发场景下性能低。SpringCloud官网推出了全新的微服务网关技术SpringCloud Gateway,比Zuul性能更强悍、功能更丰富、且支持异步等多种特性。

SpringCloud Config实用性差:

SpringCloud Config主要用于管理项目的配置文件,每次要使用SpringCloud Config的时候,总得经过一波操作和配置的折腾,才可以使用SpringCloud Config实现配置管理,而且单独使用无法支持配置实时刷新,在项目中用起来,真比较头疼的。

当前有很多技术可以取代SpringCloud Config,比如携程的ApolloSpringCloud Alibaba Nacos,功能都比SpringCloud Config强,并且支持实时刷新配置。

SpringCloud Bus实用性差:

SpringCloud Bus是服务消息总线,主要实现通知多个服务执行某个任务,一般和SpringCloud Config一起使用。这个功能其实不太使用,因为很多任务组件基本都具备消息通知功能,比如Nacos、Apollo都能实现所有服务订阅执行相关操作。

1.3 SpringCloud项目场景

file

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

file

打车业务如上图:

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 等轻量级容器可无缝配合。

我们来对比下当前服务注册与发现的主流技术:

对比项euerkaConsulzookeeperetcd
服务健康检查可配支持服务状态,内存,硬盘等(弱)长连接,keepalive连接心跳
多数据中心支持
kv 存储服务支持支持支持
一致性raftpaxosraft
capapcpcpcp
使用接口(多语言能力)http支持 http 和 dns客户端http/grpc
watch 支持支持 long polling/大部分增量全量/支持long polling支持支持 long polling
自身监控metricsmetricsmetrics
安全acl /httpsaclhttps 支持(弱)
spring cloud 集成已支持已支持已支持已支持

特性:

  • 服务发现
  • 健康检查
  • Key/Value 存储
  • 多数据中心
  • 社区活跃

Consul 的优势:

  • 使用 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...

Consul 角色

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

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

2.2 Consul 基础架构

Glossary:术语

见官方文档:https://www.consul.io/docs/in...

  • 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 转发请求到远程的数据中心并返回结果。

file

如何实现服务注册和发现

file

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...

file

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

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

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

file

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服务信息:

file

配置如下:

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

file

本文由传智教育博学谷 - 狂野架构师教研团队发布,转载请注明出处!

如果本文对您有帮助,欢迎关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力

分享java技术干货,努力进阶架构师。

31 声望
6 粉丝
0 条评论
推荐阅读
Java里面为什么搞了双重检查锁,写完这篇文章终于真相大白了
在 java 程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出现问题...

紧张的羊肉串aa阅读 119

刨根问底 Redis, 面试过程真好使
充满寒气的互联网如何在面试中脱颖而出,平时积累很重要,八股文更不能少!下面带来的这篇 Redis 问答希望能够在你的 offer 上增添一把🔥。

菜农曰17阅读 946

封面图
PHP转Go实践:xjson解析神器「开源工具集」
我和劲仔都是PHP转Go,身边越来越多做PHP的朋友也逐渐在用Go进行重构,重构过程中,会发现php的json解析操作(系列化与反序列化)是真的香,弱类型语言的各种隐式类型转换,很大程度的减低了程序的复杂度。

王中阳Go10阅读 1.9k评论 2

封面图
万字详解,吃透 MongoDB!
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常...

JavaGuide5阅读 789

封面图
计算机网络连环炮40问
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~

程序员大彬8阅读 1.1k

与RabbitMQ有关的一些知识
工作中用过一段时间的Kafka,不过主要还是RabbitMQ用的多一些。今天主要来讲讲与RabbitMQ相关的一些知识。一些基本概念,以及实际使用场景及一些注意事项。

lpe2348阅读 1.9k

封面图
Git操作不规范,战友提刀来相见!
年终奖都没了,还要扣我绩效,门都没有,哈哈。这波骚Git操作我也是第一次用,担心闪了腰,所以不仅做了备份,也做了笔记,分享给大家。问题描述小A和我在同时开发一个功能模块,他在优化之前的代码逻辑,我在开...

王中阳Go5阅读 2.3k评论 2

封面图

分享java技术干货,努力进阶架构师。

31 声望
6 粉丝
宣传栏