Spring Cloud Eureka详解
- 创建Eureka Server服务
创建一个Springboot工程,并在pom.xml文件中引入依赖 pom.xml文件中引入依赖
<repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>http://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Edgware.SR3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
Eureka Server相关配置
下面是一个Eureka Server的application.properites的相关配置:
服务名称
spring.application.name=eureka-server
服务注册中心端口号
server.port=1110
服务注册中心实例的主机名
eureka.instance.hostname=localhost
是否向服务注册中心注册自己
eureka.client.register-with-eureka=false
是否检索服务
eureka.client.fetch-registry=false
服务注册中心的配置内容,指定服务注册中心的位置
eureka.client.serviceUrl.defaultZone=http:// eureka.instance.hostname: e u r e k a . i n s t a n c e . h o s t n a m e : {server.port}/eureka/
关闭保护机制
eureka.server.enable-self-preservation=false
eureka.server.eviction-interval-timer-in-ms=60000
日志
logging.file=${spring.application.name}.log
启动服务注册中心
在启动类上添加注解
@EnableEurekaServer
@SpringBootApplication
@RestController
3.5 高可用服务注册中心
3.5.1 高可用服务注册中心的概念
考虑到发生故障的情况,服务注册中心发生故障必将会造成整个系统的瘫痪,因此需要保证服务注册中心的高可用。
Eureka Server在设计的时候就考虑了高可用设计,在Eureka服务治理设计中,所有节点既是服务的提供方,也是服务的消费方,服务注册中心也不例外。
Eureka Server的高可用实际上就是将自己做为服务向其他服务注册中心注册自己,这样就可以形成一组互相注册的服务注册中心,以实现服务清单的互相同步,达到高可用的效果。
3.5.2 构建服务注册中心集群
Eureka Server的同步遵循着一个非常简单的原则:只要有一条边将节点连接,就可以进行信息传播与同步。可以采用两两注册的方式实现集群中节点完全对等的效果,实现最高可用性集群,任何一台注册中心故障都不会影响服务的注册与发现
(1)创建application-peer1.properties
server.port=1111
eureka.instance.hostname=master
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.instance.preferIpAddress=true
eureka.server.enableSelfPreservation=false
eureka.client.serviceUrl.defaultZone=http://backup1:1112/eureka/,http://backup2:1113/eureka/
(2)创建application-peer2.properties
server.port=1112
eureka.instance.hostname=backup1
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.instance.preferIpAddress=true
eureka.server.enableSelfPreservation=false
eureka.client.serviceUrl.defaultZone=http://master:1111/eureka/,http://backup2:1113/eureka/
(3)创建application-peer3.properties
server.port=1113
eureka.instance.hostname=backup2
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.instance.preferIpAddress=true
eureka.server.enableSelfPreservation=false
eureka.client.serviceUrl.defaultZone=http://master:1111/eureka/,http://backup1:1112/eureka/
(4) 在hosts文件中增加如下配置
127.0.0.1 master
127.0.0.1 backup1
127.0.0.1 backup2
3.6 失效剔除
有些时候,我们的服务实例并不一定会正常下线,可能由于内存溢出、网络故障等原因使服务不能正常运作。而服务注册中心并未收到“服务下线”的请求,为了从服务列表中将这些无法提供服务的实例剔除,Eureka Server在启动的时候会创建一个定时任务,默认每隔一段时间(默认为60秒)将当前清单中超时(默认为90秒)没有续约的服务剔除出去。
3.7 自我保护
服务注册到Eureka Server后,会维护一个心跳连接,告诉Eureka Server自己还活着。Eureka Server在运行期间会统计心跳失败的比例在15分钟以之内是否低于85%,如果出现低于的情况,Eureka Server会将当前实例注册信息保护起来,让这些实例不会过期。这样做会使客户端很容易拿到实际已经不存在的服务实例,会出现调用失败的情况。因此客户端要有容错机制,比如请求重试、断路器。
以下是自我保护相关的属性:
eureka.server.enableSelfPreservation=true. 可以设置改参数值为false,以确保注册中心将不可用的实例删除
3.8 region(地域)与zone(可用区)
region和zone(或者Availability Zone)均是AWS的概念。在非AWS环境下,我们可以简单地将region理解为地域,zone理解成机房。一个region可以包含多个zone,可以理解为一个地域内的多个不同的机房。不同地域的距离很远,一个地域的不同zone间距离往往较近,也可能在同一个机房内。
region可以通过配置文件进行配置,如果不配置,会默认使用us-east-1。同样Zone也可以配置,如果不配置,会默认使用defaultZone。
Eureka Server通过eureka.client.serviceUrl.defaultZone属性设置Eureka的服务注册中心的位置。
指定region和zone的属性如下:
(1)eureka.client.availabilityZones.myregion=myzone# myregion是region
(2)eureka.client.region=myregion
Ribbon的默认策略会优先访问通客户端处于同一个region中的服务端实例,只有当同一个zone中没有可用服务端实例的时候才会访问其他zone中的实例。所以通过zone属性的定义,配合实际部署的物理结构,我们就可以设计出应对区域性故障的容错集群。
3.9 安全验证
我们启动了Eureka Server,然后在浏览器中输入http://localhost:8761/后,直接回车,就进入了spring cloud的服务治理页面,这么做在生产环境是极不安全的,下面,我们就给Eureka Server加上安全的用户认证.
(1)pom文件中引入依赖
org.springframework.boot
spring-boot-starter-security
(2)serviceurl中加入安全校验信息
eureka.client.serviceUrl.defaultZone=http://:@ eureka.instance.hostname: e u r e k a . i n s t a n c e . h o s t n a m e : {server.port}/eureka/
3.10 Eureka信息面板
服务启动后,访问http://127.0.0.1:1110/可以看到Eureka的信息面板。如下图,目前Instancescurrently registered with Eureka一栏显示注册到服务注册中心内的服务。