微服务治理:CloudConsul 和 ZooKeeper
服务注册:在一个微服务架构中,通常会提供一个注册中心,每一个微服务实例都会注册到注册中心。
服务发现:在服务通信中,每个微服务实例都通过注册中心发现其他微服务实例,通过向注册中心拉取其他微服务实例的信息(包括 host、端口等),实现服务间的相互访问。
在 Spring Cloud 大家庭中,除了 Eureka,我们还可以使用 Spring Cloud Consul 和 Spring CloudZooKeeper 来实现服务治理。接下来,我将分别对其进行介绍。
Spring Cloud Consul 的使用
======================
Spring Cloud Consul 是一个服务发现与配置管理工具,它是一款分布式、高可用、扩展性极强的框架。
Spring Cloud Consul 提供了以下功能。
服务发现:Consul 通过 DNS 或 HTTP 接口使注册自己和发现其他服务变得简单,它也支持注册外部服务,如 SaaS 提供商。
健康检查:健康检查可以使 Consul 快速通知操作者集群中发现的问题,与服务发现的集成可以防止将通信路由到不健康的主机,并启用服务级别的断路器。
Key-Value 存储:灵活的 Key-Value 存储允许存储动态配置、功能标记、协调、领导人选择等,简单的 HTTPAPI 使它在任何地方都能很容易地被使用。
多数据中心:Consul 是为数据中心而构建的,可以支持任意数量的区域,而不需要复杂的配置。
服务细分:Consul Connect 允许使用自动 TLS 加密和基于身份的授权进行安全的服务到服务通信。
本节中,将详细介绍 Consul 的集成。
Consul 的安装与部署
Consul 的安装比较简单,从官网https://www.consul.io/downloads.html下载对应操作系统版本即可,它是一个 ZIP 格式的压缩包。下载完成后,解压该压缩包,你将获得一个可执行文件 consul.exe,打开 cmd 命令行,进入 consul.exe 所在目录,执行以下命令:
consul agent -dev
可以启动 consul,如图 13-1 所示。
图中命令 agent 为启动一个 consul 代理,可通过 consul agent -h 查看 agent 命令的所有参数含义,表 13-1 列举了其包含的部分参数列表:
启动完成后,浏览器访问 localhost:8500,可以看到图 13-2 所示的界面。
Spring Cloud 集成 Consul
Consul 和 Eureka 不同,Eureka 需要我们自己实现注册中心,而 Consul 本身就是一个注册中心,上节启动的 consul agent 就是一个注册中心,因此,我们只需要在客户端集成 Consul 即可。
(1)新建一个工程,命名为 spring-cloud-consul,在 pom.xml 新增以下依赖:
<dependency>
<groupId>org.springframework.cloud</ groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</ artifactId></dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</ artifactId>
</dependency>
其中,spring-cloud-starter-consul-discovery 为 Spring Cloud Consul 的服务发现模块。由于这个工程也会进行健康检查,所以也需要引入 actuator 模块,而 spring-boot-starter-web 模块必须引入,否则可能无法启动工程。
(2)新增配置文件 application.yml,并编写以下内容:
spring:
application:
name: consul-clientcloud :
consul:
host: 127.8.8.1port: 8508
discovery:
serviceName: ${spring.application.name}healthCheckPath: /actuator/health
healthCheckInterval: 5s
instanceId: {vcap.application.instance_id;
{spring.application.instance_id: {random.value}}}
server:
port: 8080
在上述配置中,spring.cloud.consul 就是 Consul 的基本配置,其中,host 和 port 指定 Consul 注册中心的 P 和端口,即 13.2.1 节浏览器访问的地址; serviceName 为客户端服务名; healthCheckPath 为健康检查地址,本示例采用的是 Actuator,因此指定为/actuator/health 端点; healthCheckInterval 为健康检查间隔时间,本示例为 5 秒,即每隔 5 秒会调用健康检查端点; instanceId 为实例服务,它是唯一的,服务发现都是通过 instanceId 来进行的。
(3)新建启动类(该类和前面介绍的启动类代码一致,此处略)。
(4)启动工程并访问 localhost:8500,可以看到客户端被注册到 Consul 了,且每隔 5 秒会进行一次健康检查,如图 13-3 所示。
Spring Cloud ZooKeeper 的使用
=========================
ZooKeeper 是一个分布式的应用程序协调服务,是 Apache Hadoop 的一个子项目,最初主要是用于提供 Hadoop 和 HBase 的调度服务,能够解决 Hadoop 中统一命名、配置维护、同步服务等问题。
在微服务流行以后,ZooKeeper 开始被人们重视,大家发现通过 ZooKeeper 也可以解决微服务中的服务治理问题。在比较流行的微服务框架中,Dubbo 和 Spring Cloud 都可以用 ZooKeepr 作为服务治理框架,尤其是 Dubbo,一般都是通过 ZooKeeper 实现服务治理的。
ZooKeeper 的安装和部署
ZooKeeper 的安装和部署也比较简单,首先从官网https://www-eu.apache.org/distzookeeper/stable中下载 ZooKeeper 的稳定版,然后解压进入 ZooKeeper 根目录的 conf 文件夹,可以看到一个名叫 zoo_sample.cfg 的文件,将其命名为 zoo.cfg 并返回上一级目录,最后进入 bin 文件夹,双击 zkServer.cmd 文件,就可启动 ZooKeeper。
ZooKeeper 的默认启动端口为 2181,我们可以通过修改 zoo.cfg 来修改启动端口,在 zoo.cfg 修改下面配置即可:
clientPort=2182
当然,除了修改默认端口外,我们还可以其他参数,表 13-2 列举了 ZooKeeper 的主要参数配置。
Spring Cloud 集成 ZooKeeper
Spring Cloud 集成 ZooKeeper 的步骤如下。
(1)新建一个项目,命名为 spring-cloud-zookeeper,在其 pom.xml 文件中添加如下代码:
<parent>
<groupId>org.springframework.boot</grou
pId>
<artifactId>spring-boot-starter-parent< / artifactId><version>2.日.3.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version>
<lombok .version>1.18.B</ lombok . version></properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId><version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope></ dependency>
</ dependencies></dependencyManagement><dependencies>
<dependency>
评论