Eureka是一个用于服务注册和发现的组件,最开始主要应用于亚马逊公司旗下的云计算服务平台AWS,Eureka分为Eureka Server和 Eureka Client, Eureka Server为 Eureka服务注册中心,Eureka Client为Eureka客户端。
Eureka的基本结构:
1:Register Service:服务注册中心,它是一个Eureka Server,提供服务注册和发现的功能。
2:Provider Service:服务提供者,它是一个Eureka Client,提供服务。
3:Consumer Service:服务消费者,它是一个Eureka Client,消费服务。
原理:
首先需要一个服务注册中心Eureka Server,服务提供者 Eureka Client向服务注册中心Eureka Server注册,将自己的信息(比如说服务名和服务的IP地址等)通过REST API的形式提交给服务注册中心Eureka Server。同样,服务消费者Eureka Client也向服务注册中心Eureka Server注册,同事服务消费者获取一份服务注册列表的信息,该列表包含了所有向服务注册中心Eureka Server注册的服务信息。获取服务注册列表信息之后,服务消费者就知道服务提供者的IP地址,可以通过Http远程调度来消费服务提供者的服务。
Eureka Server的实现:
首先在父项目创建一个模块为eureka server,需要引入以下pom文件,
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
application.yml配置如下
server:
port: ${EUREKA_PORT:8886} #服务的端口号
eureka: #eureka的配置信息
client:
registerWithEureka: false #是否注册自己自身
fetchRegistry: false #是否从eureka服务器获取注册信息
serviceUrl:
defaultZone: http://${EUREKA_ZONE_HOST:localhost}:${EUREKA_ZONE_PORT:8886}/eureka/ #注册到注册中心
server:
enable-self-preservation: true #保护机制(默认90S)
spring:
application:
name: eureka-server #给服务起的服务名
其中port配置eureka服务器端口号。Eureka的配置属性都在开源项目spring-cloud-netflix-master中定义,registerWithEureka表示是否注册自身到eureka服务器,因为当前这个应用就是eureka服务器,没必要注册自身,所以这里是false。fetchRegistry表示是否从eureka服务器获取注册信息,同上,这里不需要。defaultZone就比较重要了,是设置eureka服务器所在的地址,查询服务和注册服务都需要依赖这个地址。
而项目启动类里面需要加入@EnableEurekaServer这个注解,可以看到只需要使用@EnableEurekaServer注解就可以让应用变为Eureka服务器,这是因为spring boot封装了Eureka Server,让你可以嵌入到应用中直接使用。(至于真正的EurekaServer是Netflix公司的开源项目,也是可以单独下载使用的。)
在默认配置中,Eureka Server在默认90s没有得到客户端的心跳,则注销该实例,但是往往因为微服务跨进程调用,网络通信往往会面临着各种问题,比如微服务状态正常,但是因为网络分区故障时,Eureka Server注销服务实例则会让大部分微服务不可用,这很危险,因为服务明明没有问题。原理是,当Eureka Server节点在短时间内丢失过多的客户端时(可能发送了网络故障),那么这个节点将进入自我保护模式,不再注销任何微服务,当网络故障回复后,该节点会自动退出自我保护模式。
Eureka Client的实现:
同样首先引入相关的pom文件
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
主要是yml文件有些变化
server:
port: 8889
eureka:
client:
serviceUrl:
defaultZone: http://${EUREKA_ZONE_HOST:localhost}:${EUREKA_ZONE_PORT:8886}/eureka/
instance:
prefer-ip-address: true
spring:
application:
name: model-prod
前面post 定义自己服务的端口号,在eureka 的配置中defaultZone需要把服务注册到注册中心的地址去,prefer-ip-address意思是在注册中心是否显示IP方式的地址,false的话就是主机名+端口号。