摘要:微服务应用通常是基于分布式集群部署的,当集群实例达到一定数量时,就不得不做服务治理了。将微服务实例集中管理,需要一个服务注册中心与服务发现组件。微服务实例启动后自动注册到注册中心组件中,注册中心维护与实例的连接关系,所有的实例列表用于服务发现。服务发现可以分为
微服务应用通常是基于分布式集群部署的,当集群实例达到一定数量时,就不得不做服务治理了。将微服务实例集中管理,需要一个服务注册中心与服务发现组件。微服务实例启动后自动注册到注册中心组件中,注册中心维护与实例的连接关系,所有的实例列表用于服务发现。服务发现可以分为客户端模式与服务端模式。客户端模式首先从服务注册中心获取服务列表,然后在客户端进行服务调用;服务端模式则直接向服务注册中心发送请求,服务注册中心直接调用服务实例并返回结果。本节主要介绍服务注册与发现组件Eureka和Consul的功能。
Eureka是Netflix公司开源的用于服务注册和发现的框架。从2018年7月份开始,Netflix宣布不再维护Eureka开源代码。但是SpringCloud集成了Eureka到子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。
Eureka分为Eureka Server端与Eureka Client端。Eureka Server端提供服务注册功能,微服务启动后,调用注册接口进行服务注册;
Eureka Server端还会维护所有可用的服务节点信息,同时提供页面,可以查看注册过的服务。Eureka Client端提供与Eureka Server端的交互,它内嵌在微服务中,向Eureka Server端发送心跳检测,提供注册和续租等服务。
Eureka架构如图5.12所示。
下面列举一个简单的Eureka使用示例。
(1)创建一个eureka-server工程,应用需要依赖spring-cloudstarter-netflix-eureka-server包,修改配置文件如下:
eureka:
client:
register-with-eureka: false
fetch-registry: false
serviceUrl:
defaultZone: http://localhost:8080/eureka/
(2)在启动类中添加注解@EnableEurekaServer,然后启动工程。
(3)新建客户端工程eureka-client,应用需要依赖springcloud-starter-netflix-eureka-client包,修改配置文件如下:
eureka:
client:
service-url:
defaultZone: http://localhost:8080/eureka/
(4)在启动类中添加注解@EnableDiscoveryClient,然后启动工程,访问Eureka界面即可看到客户端已经注册到服务端了。
Consul是HashiCorp公司推出的开源软件,也可以实现服务注册与服务发现的功能。Consul主要有以下几种特性:
服务发现:服务通过Consul客户端注册到Consul服务端,然后可以通过Consul服务端进行服务发现查询。
健康检查:Consul客户端可以对服务提供相应的健康检查。
数据存储:Consul提供了Key/Vaule存储方式,应用程序可以设置相关的配置数据。
多数据中心:不依赖其他第三方工具即可使用多数据中心。
Consul可分为Server端和Client端两种角色。Server端保存配置、选举和维护状态等复杂的逻辑,Client端负责转发请求到服务端。
Consul使用时需要自己安装,步骤如下:
(1)在官网下载Consul,网址为https://www.consul.io/downloads.html,然后需要在PATH环境变量中添加安装目录。
(2)执行consul --version命令查看版本,本例使用的是1.8.4版本。
(3)想使用Consul,需要启动Agent。有两种启动方式,一种是server方式,一种是client方式。执行命令如下:
consul agent -server -ui -bootstrap-expect=3 -data
dir=/data/consul
-node=server-1 -client=0.0.0.0 -bind=127.0.0.1 -
datacenter=dc1
(5)Spring Boot整合Consul需要依赖spring-cloud-starterconsul-discovery包。另外,spring-boot-starter-actuator可以提供健康检查。
(6)修改Spring Boot项目的application.yml配置文件如下:
spring:
cloud:
consul:
host: 127.0.0.1
port: 8500
discovery:
service-name: ${spring.application.name}
tags: test=consul
healthCheckPath: /health
healthCheckInterval: 15s
来源:大数据架构师