文章目录
- 1、什么是 Eureka?
- 2、Eureka 的两个组件
- 2.1、Eureka Server
- 2.2、Eureka Client
- 2.3、Eureka 元数据
- 3、Eureka 自我保护
- 4、Eureka 高可用集群
- 5、总结
1、什么是 Eureka?
我们在之前了解过注册中心,Eureka 就是注册中心的一种。
Eureka 是Netflix 开发的服务发现框架,采用了 CS 的设计架构。SpringCloud 将它集成在自己的子项目 spring-cloud-netflix 中,实现 SpringCloud 的服务发现功能。
Eureka由3个角色组成:
-
Eureka Server
:服务中心,提供服务注册和发现 -
Service Provider
:服务提供方,将自身服务注册到Eureka,从而使服务消费方能够找到 -
Service Consumer
:服务消费方,从Eureka获取注册服务列表,从而能够消费服务
2、Eureka 的两个组件
2.1、Eureka Server
Eureka Server 组件提供服务注册服务。当各个微服务节点通过配置启动后,会在Eureka Server 中进行注册,这样 Eureka Server 中的服务注册表中将会存储所有可用服务节点的信息。
而 Eureka Server 本身也是一个SpringBoot 项目,且没有任何业务逻辑。Eureka Server 的创建如下:
- 引入坐标:引入 Eureka Server 所需要的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
- 添加配置文件:添加有关 Eureka Server
#这个表示 Eureka 服务中心运行的端口号。
server:
port: 9999
spring:
application:
name: eureka-server
eureka:
instance:
hostname: localhost
client:
#表示是否向注册中心注册自己。false 表示不注册。默认为 true
register-with-eureka: false
#表示是否从Eureka中获取注册信息。false 表示不获取.默认为 true
fetch-registry: false
#表示客户端与Eureka服务端进行交互的地址
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
- 修改启动类:在启动类上添加注解
@EnableEurekaServer
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
}
在完成上述步骤之后,通过浏览器访问localhost:9999
,如果出现如下显示表示 Eureka 的服务中心搭建成功:
2.2、Eureka Client
Eureka Client 通过注册中心进行访问。Eureka Client 本身是一个服务,然后通过配置将其注册到注册中心上。服务提供方和服务服务提供方都需要实现 Eureka Client 。具体配置如下:
- 引入坐标:引入 Eureka Client所需要的依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
- 修改配置文件:添加与 Eureka 有关的配置
server:
port: 9001
spring:
application:
name: cloud-order-service
eureka:
instance:
hostname: localhost
#使用ip地址注册
prefer-ip-address: true
#使用自定义注册
instance-id: ${spring.cloud.client.ip-address}:${server.port}
client:
#表示是否向注册中心注册自己。true 表示注册。
register-with-eureka: true
#表示是否从Eureka中获取注册信息。true 表示获取。默认为 true
fetch-registry: true
serviceUrl:
defaultZone: http://localhost:9999/eureka
- 修改启动类:在启动类上添加注解
@EnableEurekaClient
或@EnableDiscoveryClient
。在版本比较新的 SpringCloud 中,可以省略注解。
@SpringBootApplication
@EnableDiscoveryClient
//@EnableEurekaClient
public class EurekaClientApplication {
}
在完成上述步骤之后,通过浏览器访问localhost:9999
,如果出现如下显示表示服务已经注册到了 Eureka 的服务中心:
2.3、Eureka 元数据
Eureka中的元数据是指当服务注册到服务中心之后,服务的主机名、IP地址、端口号、状态页和健康检查等信息,这些信息都会被发布在服务注册表中,用于服务之间的调用。
Eureka的元数据有两种:标准元数据和自定义元数据。
- 标准元数据:主机名、IP地址、端口号、状态页和健康检查等信息,这些信息都会被发布在服务注
册表中,用于服务之间的调用。 - 自定义元数据:可以使用
eureka.instance.metadata-map
配置,符合KEY/VALUE
的存储格式。这
些元数据可以在远程客户端中访问。
只有在去调用注册进 Eureka 里面的微服务,才会使用到元数据。Eureka 将元数据都存放在由 SpringCloud 提供了一个工具类DiscoveryClient
中,具体使用如下:
/**
* 注入DiscoveryClient :
* springcloud提供的获取原数组的工具类
* 调用方法获取服务的元数据信息
*/
@Autowired
private DiscoveryClient discoveryClient;
public void findById() {
//调用discoveryClient方法
//已调用服务名称获取所有的元数据
//参数为注册在服务中心的服务名
List<ServiceInstance> instances = discoveryClient.getInstances("service-product5");
//获取唯一的一个元数据
ServiceInstance instance = instances.get(0);
}
下图中是一个服务包含的所有元数据,其中也包含自定义的元数据:
在获取到元数据之后,我们就可以使用 Spring 中提供的 RestTemplate类
远程调用服务。使用RestTemplate类
之前必须要在启动类中将RestTemplate类
注入到 IOC 容器中:
@SpringBootApplication
@EnableEurekaClient
public class OrderMain
{
public static void main(String[] args)
{
SpringApplication.run(OrderMain8001.class,args);
}
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
然后再具体的业务类中进行调用:
@RestController
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/user/{id}")
public String user(@PathVariable("id") Integer id) {
List<ServiceInstance> instances = discoveryClient.getInstances("cloud-payment-service");
ServiceInstance instance = instances.get(0);
String result = restTemplate.getForObject(instance.getUri()+ "/具体访问路径", String.class);
return result;
}
}
3、Eureka 自我保护
微服务第一次注册成功之后,每30秒会发送一次心跳将服务的实例信息注册到注册中心。通知 Eureka Server 该实例仍然存在。如果超过90秒没有发送更新,则服务器将从注册信息中将此服务移除。
Eureka Server在运行期间,但是当网络分区故障发生(延时、卡顿、拥挤),微服务与 Eureka Server 会之间无法正常通信,导致微服务移除过多时。会判断心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况,Eureka Server会进入自我保护,将当前的实例注册信息保护起来,同时提示这个警告。
一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据。完自我保护机制开启后,并不会马上呈现到web上,而是默认需等待 5 分钟后会看到下面的提示信息:
Eureka 的自我保护机制是默认开启,可以通过eureka.server.enable-self-preservation
配置项对自动保护进行设置,false 表示关闭保护机制。
其他设置:
- 设置Eureka客户端向服务端发送心跳的时间间隔:
lease-renewal-interval-in-seconds: 1
,默认是 30 秒 - 设置Eureka服务端在收到最后一次心跳后等待时间上限:
lease-expiration-duration-in-seconds: 2
,默认是 90 秒 - 设置自我保护机制开启后,呈现到web页面上的时间:
eureka.server.wait-time-in-ms-when-sync-empty:60
,默认是 5分钟
4、Eureka 高可用集群
Eureka Client会定时连接Eureka Server,获取注册表中的信息并缓存到本地。微服务在消费远程API时总是使用本地缓存中的数据。所以即使Eureka Server发生宕机,也不会影响到服务之间的调用。但是当Eureka Server发生宕机,且某个服务发生改变时,就可能会影响到微服务的调用,甚至影响到整个应用系统的高可用,因此通常会搭建一个高可用的Eureka注册中心集群
想要搭建 Eureka Server 高可用集群,就必须创建多个 Eureka Server,这些 Eureka Server 只在配置上有略微差别:
#第一个Eureka Server配置文件
server:
port: 9999
spring:
application:
name: eureka-server
eureka:
instance:
hostname: localhost
client:
serviceUrl:
#注意这里是第二个Eureka Server的地址
defaultZone: http://127.0.0.1:9998/eureka/
#第二个Eureka Server配置文件
server:
port: 9998
spring:
application:
name: eureka-server
eureka:
instance:
hostname: localhost
client:
serviceUrl:
#注意这里是第一个Eureka Server的地址
defaultZone: http://127.0.0.1:9999/eureka/
在搭建 Eureka 集群时,需要注意的是,defaultZone
属性的属性值不是该 Eureka Server 的地址,而是集群内除开它本身的地址。
需要在将服务注册到Eureka Server集群中,需要修改 Eureka Client 的配置文件:
server:
port: 9001
spring:
application:
name: eureka-client
eureka:
instance:
hostname: localhost
client:
register-with-eureka: true
fetch-registry: true
serviceUrl:
defaultZone: http://localhost:9999/eureka,http://localhost:9998/eureka
5、总结
在学习了 Eureka 之后,可以发现其实 Eureka 大多数功能都是通过配置文件进行配置的,所以我们需要重点去了解 Eureka 的配置项(配置详解传送门)。