文章目录
- 一、Eureka 简介
- 1.1 Eureka 概述
- 1.2 Eureka组件
- 二、Eureka 的使用
- 2.1 Eureka Server 的搭建
- 2.2 客户端服务注册
- 2.3 actuator 微服务信息的完善
- 2.4 服务发现 Discovery
- 2.5 Eureka 的自我保护机制
一、Eureka 简介
1.1 Eureka 概述
服务治理
Spring Cloud
封装了Netflix
公司开发的Eureka
模块来实现服务治理。
在传统的RPC
远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
服务注册与发现
Eureka
采用了CS
的设计架构,Eureka Server
作为服务注册功能的服务器, 它是服务注册中心。而系统中的其他微服务,使用Eureka
的客户端连接到 Eureka Server
并维持心跳连接。这样系统的维护人员就可以通过Eureka Server
来监控系统中各个微服务是否正常运行。
在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息比如服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者|服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC
调用RPC
远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一 个依赖关系(服务治理概念)。 在任何RPC
远程框架中,都会有一个注册中心(存放服务地址相关信息)。
1.2 Eureka组件
Eureka架构图:
Eureka
包含两个组件: Eureka Server
和Eureka Client
Eureka Server 提供服务注册服务
各个微服务节点通过配置启动后,会在EurekaServer
中进行注册, 这样EurekaServer
中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。
EurekaClient 通过注册中心进行访问
Eureka Client
是一个Java客户端,用于简化Eureka Server
的交互,客户端同时也具备一个内置的、 使用轮询(round-robin
)负载算法的负载均衡器。
在应用启动后,将会向Eureka Server
发送心跳(默认周期为30秒)。如果Eureka Server
在多个心跳周期内没有接收到某个节点的心跳,EurekaServer
将会从服务注册表中把这个服务节点移除(默认90秒)
二、Eureka 的使用
2.1 Eureka Server 的搭建
接下来的测试,SpringCloud
的版本都为Hoxton.SR1
,SpringBoot
的版本为2.2.2.RELEASE
。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
eureka2.x
的版本选择spring-cloud-starter-netflix-eureka-server
,而不是spring-cloud-starter-eureka
。
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-eureka</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
配置文件设置:
server:
port: 7001
eureka:
instance:
hostname: localhost #eureka服务端的实例名称
client:
# false表示不向注册中心注册自己
register-with-eureka: false
# false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要检索服务
fetch-registry: false
service-url:
# 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
# 相互注册
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
主启动类上添加注解:@EnableEurekaServer
;访问localhost:70001
即访问Eureka
的主页面;
2.2 客户端服务注册
①主启动类上添加@EnableEurekaClient
② 配置文件添加:
eureka:
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://localhost:7001/eureka/
启动项目后,可以看到服务已经在注册中心了:
2.3 actuator 微服务信息的完善
添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
① 主机名称:服务名称修改
修改配置:
eureka:
instance:
instance-id: payment8001
效果:
② 访问信息有 ip 信息提示
修改配置:
eureka:
instance:
prefer-ip-address: true
效果:
2.4 服务发现 Discovery
对于注册到Eureka
里面的微服务,可以通过服务发现来获得该服务的信息
主启动类上添加注解:@EnableDiscoveryClient
。
测试代码:
@Slf4j
@RestController
@RequestMapping("/payment")
public class PaymentController {
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/discovery")
public CommonResult<Object> discovery() {
List<String> services = discoveryClient.getServices();
services.forEach(log::info);
List<ServiceInstance> instances = discoveryClient.getInstances("cloud-payment-service");
instances.forEach(instance -> {
log.info("serviceId:" + instance.getServiceId() +" instanceId:" + instance.getInstanceId() +" scheme:" + instance.getScheme() +" metadata:" + instance.getMetadata() +" uri:" + instance.getUri());
});
return new CommonResult(200, "查询服务发现", this.discoveryClient);
}
}
打印services
信息:
返回结果:
2.5 Eureka 的自我保护机制
保护模式主要用于一组客户端和Eureka Server
之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server
将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务。
如果在Eureka Server
的首页看到以下这段提示,则说明Eureka
进入了保护模式:
原因:某时刻某一个微服务不可用了,Eureka
不会立即清理,依旧会对该微服务的信息进行保存,属于CAP
里面的AP
分支。使用eureka.server.enbale-self-preservation=false
可以禁止自我保护