0


173 深度探索Eureka服务注册发现

深度探索Eureka服务注册发现

通过服务实际地址虽然能够请求到数据,但是上述实现存在硬编码,如果一旦服务ip或端口发生改变,则无法完成调用。 此时可以通过注册中心实现服务注册与自动发现。

1 Netflix Eureka 介绍

Eureka是spring cloud中的一个负责服务注册与发现的组件 。内部包含两个角色:Eureka Server(注册中心)EurekaClient(服务提供者、服务消费者)

架构模式:C/S架构

在这里插入图片描述

2 快速入门

2.1 EurekaServer搭建
1)修改父工程pom.xml

<!-- cloud --><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR8</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

2)新建eureka_server模块并修改

修改pom.xml

<!--eureka server-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

修改启动类

@EnableEurekaServer //声明为注册中心
修改application.yml

server:
  port: 6011

eureka:
  instance:
    hostname: localhost #服务地址
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka # eureka服务端地址,将来客户端使用该地址和eureka进行通信
    register-with-eureka: false  #是否将自己的路径注册到eureka
    fetch-registry: false  #是否需要从eureka中抓取路径
    ```
启动服务并访问eurekaServer控制台:http://localhost:6011

**2.2 EurekaClient配置注册到EurekaServer**

1)修改用户服务&订单服务的pom.xml

org.springframework.cloud spring-cloud-starter-netflix-eureka-client ``` 2)修改用户服务&订单服务的启动类

@EnableDiscoveryClient //声明为注册中心客户端
3)修改用户服务&订单服务的application.yml

eureka:
  instance:
    hostname: localhost
    ip-address: 127.0.0.1 # ip地址
    prefer-ip-address: true # 更倾向于使用ip,而不是host名
    instance-id: ${eureka.instance.ip-address}:${server.port} # 自定义实例的id

  client:
    service-url:
      defaultZone: http://localhost:6011/eureka # eureka服务端地址
      ```
4)启动服务并观察eurekaServer控制台

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/cb029e034400455fa1195af0a844464c.png)
**2.3 基于注册中心动态获取服务路径**

@Autowired
private RestTemplate restTemplate;

@Autowired
private DiscoveryClient discoveryClient;

//查询用户订单信息
@GetMapping(“/findUserOrders/{userId}”)
public OrderResultVO findUserOrders(@PathVariable(“userId”) Integer userId){

OrderResultVO orderResultVO = new OrderResultVO();
UserEntity userEntity = userService.findUserById(userId);

//todo
//动态获取服务路径
List<ServiceInstance> instanceList = discoveryClient.getInstances("ORDER-SERVICE");
if (instanceList == null || instanceList.size() == 0){
    return null;
}
ServiceInstance serviceInstance = instanceList.get(0);
String host = serviceInstance.getHost();
int port = serviceInstance.getPort();

//String url = "http://localhost:9001/order/findOrderInfoByUserId/"+userId;
String url = "http://"+host+":"+port+"/order/findOrderInfoByUserId/"+userId;
List<OrderEntity> orderList = restTemplate.getForObject(url, List.class);

orderResultVO.setUserName(userEntity.getUserName());
orderResultVO.setOrderList(orderList);
return orderResultVO;
}

3 Eureka高级

4.1.3.1 Eureka Server端
Eureka Server即服务的注册中心,在刚才的案例中,我们只有一个EurekaServer,事实上EurekaServer也可以是一个集群,形成高可用的Eureka注册中心。

4.1.3.1.1 Eureka Server集群原理
多个Eureka Server之间也会互相注册为服务,当服务提供者注册到Eureka Server集群中的某个节点时,该节点会把服务的信息同步给集群中的每个节点,从而实现高可用集群。因此,无论客户端访问到Eureka Server集群中的任意一个节点,都可以获取到完整的服务列表信息。

而作为客户端,需要把信息注册到每个Eureka中:

在这里插入图片描述

如果有三个Eureka,则每一个EurekaServer都需要注册到其它几个Eureka服务中,例如:有三个分别为6011、6012、6013则:

6011要注册到6012和6013上
6012要注册到6011和6013上
6013要注册到6011和6012上

3.1. Eureka Server集群搭建

(1)修改application.yml配置文件

server:
  port:6011
spring:
  application:
    name: eureka-server
    
eureka:
  instance:
    hostname: localhost #服务地址

  client:
    service-url:
      # 单机
#      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka # eureka服务端地址,将来客户端使用该地址和eureka进行通信
      # 集群
      defaultZone: ${url}
    register-with-eureka:true  #是否将自己的路径注册到eureka
    fetch-registry:true  #是否需要从eureka中抓取路径

(2)修改原来的EurekaServer 端口
在这里插入图片描述

VM中添加配置6011

-Dserver.port=6011 -Durl=http://127.0.0.1:6012/eureka,http://127.0.0.1:6013/eureka

在这里插入图片描述
复制并修改6012服务

-Dserver.port=6012 -Durl=http://127.0.0.1:6011/eureka,http://127.0.0.1:6013/eureka

复制并修改6013服务

-Dserver.port=6013 -Durl=http://127.0.0.1:6011/eureka,http://127.0.0.1:6012/eureka

在这里插入图片描述
浏览器访问任意一台服务:http://127.0.0.1:6011/

在这里插入图片描述
(3)修改user/order服务配置文件注册到集群

eureka:
  instance:
    hostname: localhost
  client:
    service-url:
      # 单机
#      defaultZone: http://localhost:6011/eureka # eureka服务端地址
      # 集群
      defaultZone: http://127.0.0.1:6011/eureka,http://127.0.0.1:6012/eureka,http://127.0.0.1:6013/eureka # eureka服务端地址

3.2 Eureka Client端
​ 实际业务服务,根据调用关系,分为:服务提供者、**服务消费者(一个服务即可以是服务提供者也可以是服务消费者)**。启动时,会向Eureka Server注册自身并获取Eureka Server注册表信息。

服务提供者要向EurekaServer注册服务,并且完成服务续约等工作。

.3.2.1 服务注册
服务提供者在启动时,会检测配置属性中的:eureka.client.register-with-erueka=true参数是否正确,事实上默认就是true。如果值确实为true,则会向EurekaServer发起一个Rest请求,并携带自己的元数据信息,Eureka Server会把这些信息保存到一个双层Map结构中。Map<String,Map<String, ServiceInstance>>

第一层Map的Key就是服务id,一般是配置中的spring.application.name属性

第二层Map的key是服务的实例id。一般host+ serviceId + port,例如:locahost:user_service:8001

值则是服务的实例对象,也就是说一个服务,可以同时启动多个不同实例,形成集群。

如:Map:

key: serviceId :ORDER-SERVICE

Value: Map

  • Key: host+ serviceId + port 192.168.1.2:ORDER-SERVICE:9001
  • Value: 实例对象ServiceInstance
  • Key: host+ serviceId + port 192.168.1.3:ORDER-SERVICE:9001
  • Value: 实例对象ServiceInstance

3.2.2 自我保护机制
Eureka Server在90秒内没有收到Eureka Client的心跳,则可能会将该client从注册表删除。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制。

自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使Eureka集群更加的健壮、稳定的运行。如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制

当进入自我保护机制后,会出现的情况:

1)Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。

2)Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。

3)当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。

如需修改自我保护机制:

#eureka server
eureka:
  server:
    enable-self-preservation:true #默认开启
    renewal-percent-threshold:0.5 #设置保护机制的阈值,默认是0.85

4 工作流程

在这里插入图片描述
1、Eureka Server 启动成功,创建服务注册表,等待服务端注册。

2、Eureka Client 启动时根据配置的 Eureka Server 地址去注册中心注册服务,并获取Eureka Server的注册表并维护在本地。

3、服务调用时,Eureka Client 会先从本地缓存找寻调取的服务。如果获取不到,先从注册中心刷新注册表,再同步到本地缓存。

4、Eureka Client 获取到目标服务器信息,发起服务调用。

5、Eureka Client 程序关闭时向 Eureka Server 发送取消请求,Eureka Server 将实例从注册表中删除。

6、Eureka Client 会每30s向 Eureka Server 发送一次心跳请求,证明客户端服务正常。

7、当 Eureka Server 超过90s 没有收到 Eureka Client 的心跳,注册中心则认为该节点失效,会注销该实例。

8、如果**在15分钟内是否超过85%**的客户端节点都没有正常的心跳,则认为可能为网络异常,进入自我保护机制,不再剔除没有上送心跳的客户端。

9、当 Eureka Client 心跳请求恢复正常之后,Eureka Server 自动退出自我保护模式。

标签: eureka 云原生 java

本文转载自: https://blog.csdn.net/weixin_44498127/article/details/135567616
版权归原作者 THE ORDER 所有, 如有侵权,请联系我们删除。

“173 深度探索Eureka服务注册发现”的评论:

还没有评论