在前面的章节中,读者已经接触到了SpringCloud默认集成的服务治理框架Spring Cloud NetflixEureka。
在本章,我们将接触到新的服务治理框架,以便读者在实际应用中有多种选择。
服务治理简介
服务治理是微服务架构的核心思想,用于实现各微服务实例的发现与注册。我们常说的服务的注册与发现其实分为两部分:
- 服务注册:在一个微服务架构中,通常会提供一个注册中心,每一个微服务实例都会注册到注册中心。
- 服务发现:在服务通信中,每个微服务实例都通过注册中心发现其他微服务实例,通过向注册中心拉取其他微服务实例的信息(包括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所在目录,执行以下命令:
代码语言:javascript复制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新增以下依赖:
代码语言:javascript复制<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,并编写以下内容:
代码语言:javascript复制spring:
application:
name: consul-clientcloud :
consul:
host: 127.8.8.1port: 8508
discovery:
serviceName: ${spring.application.name}healthCheckPath: /actuator/health
healthCheckInterval: 5s
instanceId: ${spring.application.name}:${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修改下面配置即可:
代码语言:javascript复制clientPort=2182
当然,除了修改默认端口外,我们还可以其他参数,表13-2列举了ZooKeeper的主要参数配置。
Spring Cloud集成ZooKeeper
Spring Cloud集成ZooKeeper的步骤如下。
(1)新建一个项目,命名为 spring-cloud-zookeeper,在其 pom.xml文件中添加如下代码:
代码语言:javascript复制<parent>
<groupId>org.springframework.boot</groupId>
<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>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-all</artifactId><exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId><artifactId>zookeeper< / artifactId>
</exclusion>
</exclusions></ dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId><artifactId>zookeeper< / artifactId>
<version>3.4.12</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j- log4j12</ artifactId></exclusion>
</exclusions>< / 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-web</ artifactId></dependency>
</dependencies>
其中, spring-cloud-starter-zookeeper-all为ZooKeeper服务的注册与发现依赖,我们可以发现,其内部通过<exclusions>标签将ZooKeeper依赖包去掉,在后面又通过<dependency>标签添加ZooKeeper依赖。看似有点矛盾,其实不然,Spring Cloud 官方默认依赖的ZooKeeper版本是3.5.x,该版本目前为 beta@版本,而 3.4.x版本为稳定版,可以用于生产环境,因此我们需要手动添加3.4.x版本的ZooKeeper。
(2)创建应用入口类并编写启动代码。(具体代码可以参照前面Application类,本节不再列出。)
(3)新建配置文件application.yml并编写以下代码:
代码语言:javascript复制spring:
cloud:
zookeeper:
connect-string: localhost: 2181
connect-string指定了ZooKeeper的服务端端口,默认值为localhost:2181。
(4)启动应用程序,可以看到当前工程已注册到ZooKeeper,如图13-4所示。
小结
Spring Cloud默认服务治理框架为Netflix的 Eureka框架,但它不是唯一的选择,Spring Cloud还集成了Consul和ZooKeeper供读者选择。
本章分别介绍了Spring Cloud Consul和 Spring Cloud ZooKeeper的安装部署和集成,从多元化思想出发,使读者在实际开发中有了更多的选择。本章简要介绍了两个服务治理框架的注册与发现、健康检查等。和 Eureka一样,它们也有许多特性,由于篇幅原因,没有一一介绍,其原理和Eureka一致,在深入了解后,读者完全可以在此基础上进一步优化架构。
本文给大家讲解的内容是springcloud实战:服务治理,Consul和 ZooKeeper
- 下篇文章给大家讲解的是springcloud实战:详解应用系统发布上线;
- 觉得文章不错的朋友可以转发此文关注小编;
- 感谢大家的支持!
本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。