一、基础
1、角色:
(1)Eureka Server:服务注册中心(可以是一个集群),对外暴露自己的地址给每个微服务使用
(2)服务提供者:启动后向 EurekaServer注册自己信息(地址、服务名)
(3)服务消费者:向 EurekaServer订阅服务,Eureka会将对应服务的所有提供者地址列表发送给消费者,并且定期更新
(4)心跳(续约):每个微服务定期通过 http方式向 EurekaServer刷新自己的状态
2、原理
(1)心跳机制:Client和 Server默认是 30s的周期心跳机制,Server默认 90s没收到则会进行移除
(2)自我保护:如果 15分钟内超过 85%的节点失效则进入保护机制(AP模式),可通过修改 配置进行关闭:
- 服务端关闭自我保护:
# 服务端关闭自我保护
eureka.server.enable-self-preservation = false
- 客户端修改心跳配置:
#修改心跳周期
eureka.instance.lease-renewal-interval-in-seconds = 30
#修改剔除时间
eureka.instance.lease-expiration-duration-in-seconds = 90
二、使用
1、服务端配置
- 新建工程后,增加相应的依赖
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>
<dependencies>
<!-- Eureka服务端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!-- SpringCloud依赖,放到dependencyManagement中,起到管理版本的作用 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 项目启动类添加注解 @EnableEurekaServer
- 增加配置
server:
port: 8761 # 端口
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false # 是否注册自己的信息到EurekaServer,默认是true
fetch-registry: false # 是否拉取其它服务的信息,默认是true
service-url: # EurekaServer的地址,现在是自己的地址,如果是集群,需要加上其它Server的地址。
defaultZone: http://localhost:${server.port}/eureka
2、客户端配置
- 增加客户端依赖
<!-- Eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 项目启动类增加注解 @EnableEurekaClient
- 增加配置
spring:
application:
name: eureka-test # 应用名称,会在Eureka中显示
eureka:
client:
service-url: # EurekaServer地址
defaultZone: http://localhost:8761/eureka
instance:
instance-id: lin-pc #主机名
prefer-ip-address: true # 主机名显示ip,当调用getHostname获取实例的hostname时,返回ip而不是host名称
ip-address: 127.0.0.1 # 指定自己的ip信息,不指定的话会自己寻找
- 消费者调用接口代码
# @LoadBalanced 记得加,否则调用不到
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
@RequestMapping("/restful")
public Object restful(){
# 这里使用 提供者方注册进 eureka 的服务名来调用
ResponseEntity<String> result = restTemplate.getForEntity("http://start-main-providerservice/provider", String.class);
return result.getBody();
}
3、集群配置
# eureka1,eureka2 需要在 host文件配置ip映射
# 服务端 eureka1配置
eureka:
instance:
# 集群下,在 host文件中配置映射
hostname: eureka1
client:
register-with-eureka: false
fetch-registry: false
service-url:
# 集群下配置
defaultZone: http://eureka2:8761/eureka
# 服务端 eureka2配置
eureka:
instance:
# 集群下,在 host文件中配置映射
hostname: eureka2
client:
register-with-eureka: false
fetch-registry: false
service-url:
# 集群下配置
defaultZone: http://eureka1:8761/eureka
# 客户端配置,只修改 defaultZone即可:
eureka:
client:
service-url:
defaultZone: http://eureka1:8761/eureka,http://eureka2:8761/eureka
4、集群配置(三台)
# eureka1,eureka2,eureka3 需要在 host文件配置ip映射
# 服务端 eureka配置
eureka:
instance:
# 集群下,在 host文件中配置映射(xxxx 在三个服务分别是:eureka1、eureka2、eureka3)
hostname: xxxx
client:
register-with-eureka: false
fetch-registry: false
service-url:
# 集群下配置
defaultZone: http://eureka1:8761/eureka,http://eureka2:8761/eureka,http://eureka3:8761/eureka
# 客户端配置,只修改 defaultZone即可:
eureka:
client:
service-url:
defaultZone: http://eureka1:8761/eureka,http://eureka2:8761/eureka,http://eureka3:8761/eureka
5、增加监控
#引入 actuator
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
6、查看服务信息
# eureka 客户端启动类增加注解
@EnableDiscoveryClient
# eureka 客户端注入接口,通过该接口即可查看服务信息
@Autowired
private DiscoveryClient discoveryClient;
discoveryClient.getServices()
discoveryClient.getInstances("xxx")