带你入门SpringCloud服务发现 | Eurka搭建和使用
前言
服务注册与发现是微服务中最为基础的环节,而 Eureka 就是一个可以帮助你实现服务注册与发现的选择之一。如果你对 Eureka 和服务发现了解甚少,那么该篇博客将会帮助到你。文中通过具体操作带你了解如下内容:
- 什么是服务注册与发现
- 什么是 Eureka
- SpringCloud Eureka 单台环境搭建
- SpringCloud Eureka 高可用环境搭建
- SpringCloud Eureka RestTemplate Ribbion 的使用
- SpringCloud Feign SpringCloud Eureka 的使用
阅读本文需要你熟悉SpringBoot项目的基本使用即可,还有一点需要注意的是在操作过程中尽量和我本地环境一致,因为环境不一致可能会带来一些问题。我本地环境如下:
SpringBoot Version: 2.1.0.RELEASE
SpringCloud Version: Greenwich.RELEASE
Apache Maven Version: 3.6.0
Java Version: 1.8.0_144
IDEA:Spring Tools Suite (STS)
服务注册与发现介绍
上面讲到服务发现是微服务中最为基础的环节,什么是服务发现呢 ?我们可以从单体架构说起,单体架构各个服务都在一起,是不需要被发现的。但是在微服务的架构中会出现很多的服务。服务与服务之间怎么获取调用地址URL 呢 ?例如 一个商城网站有商品服务和订单服务。查询订单服务时需要从商品服务中获取商品的信息。
如果有1个订单服务和1 个商品服务,订单服务服务在配置文件中将商品服务的 URL 配置在配置文件中即可。如果出现 2个商品服务,你可能会想到将2个商品服务URL 配置到订单服务中。如果出现上千个服务呢?你可能发现这种方式不是一个好的方案。同时还有一个问题就是:商品服务宕机后。如何将宕机的服务从配置文件中剔除。
我们可以将商品服务的 URL 地址信息都注册到统一的服务上,在调用时拉取所有商品服务的 URL 信息。订单服务可以自定义负载均衡策略来选取一个 URL 地址进行调用,如果注册中心发现某个商品服务已经宕机,可以将其从注册中心剔除。而今天的主角 Eureka 就是通过这种机制来完成服务发现的。
接下来就正式开始今天的主角 Eureka 的详细介绍!
Eureka 是什么 ?
在介绍操作前,首先来了解一下 Eureka 是什么?Eureka 是 Netflix 公司开源的一个基于 REST 服务的服务发现框架,主要用于AWS云,用于定位服务,以实现中间层服务器的负载平衡和故障转移。SpringCloud 对 Netflix 众多的开源框架都封装到其子项目spring-cloud-netflix 中,而 Eureka 就是其中的一个。SpringCloud 可以通过 Eureka 来完成微服务的服务注册与发现,当然你也可以使用其他的服务发现框架在 SpringCloud 中。
具体使用和介绍可以访问 Eureka 的 GitHub wiki 进行查看
https://github.com/Netflix/eureka/wiki/
https://github.com/Netflix/eureka/wiki/Eureka-at-a-glance
闲话少说,开始我们的 Eureka 环境搭建!
SpringCloud Eureka 单台环境搭建
Eureka Server 端搭建
按下图所示打开SpringBoot Starter构建的窗口 File--New--Spring Starter Project
勾选 Eureka Server
如果不勾选 Eureka Server 也可以在SpringBoot项目中引入 spring-cloud-starter-netflix-eureka-server 依赖即可。代码如下:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
在 SpringBoot Application上声明 @EnableEurekaServer
在 application.properties 添加配置信息
server.port=8761 spring.application.name=EUREKASERVER eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.service-url.defaultZone= http://localhost:8761/eureka/ eureka.server.enable-self-preservation=false
server.port: 配置服务端的端口号。
spring.application.name: 配置服务端应用名称.。
eureka.client.register-with-eureka: 是否将自己注册到服务端,Eureka 服务端需要配置成false 默认是 true
eureka.client.fetch-registry:是否从其他Eureka服务端获取注册信息,默认为true。如过是单台服务器可以设置为false。
eureka.server.enable-self-preservation:开启自我保护模式,默认为 true 表示为开启。开发中为了方便可以将其设置为false。
eureka.client.service-url.defaultZone:设置 Eureka 服务端的地址,如果是单体服务就配置该 Eureka 单台服务的 ip 端口号 /eureka。需要注意的是 /eureka 一定要加上。
自我保护模式介绍:
默认情况下,如果Eureka Server在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,Eureka Server将会移除该实例。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制。
自我保护机制的工作机制是如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制,此时会出现以下几种情况:
1、Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。 2、Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。 3、当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。
自我保护介绍内容摘抄自 —— Java技术栈的博客: Spring Cloud Eureka 自我保护机制 https://segmentfault.com/a/1190000015349644
如果 eureka.client.register-with-eureka=true 或者不配置该信息会,Eureka 服务端本身也注册到服务端如下图所示:
Eureka Client 端搭建
首先在 SpringBoot Starter 构建的窗口 勾选 Eureka Discovery Client 和 Spring Web Starter 如下图所示:
需要注意的是如果没有勾选 Spring Web Starter 客户端注册是注册不到服务端的。
如果不勾选,也可以直接在SpringBoot项目中引入下面2个依赖来完成。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
然后在 SpringBoot Application 上声明 @EnableDiscoveryClient 如下图所示: