Discovery服务发现与Eureka自我保护机制及总结步骤

Discovery服务发现与Eureka自我保护机制及总结步骤

规范要求:

  1. 只暴露服务名称不保留主机名称
  2. 访问详细有IP地址显示(方便排错)

先看原来的实例内容

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Iknk9sVu-1663540722848)(image/26、主机名称.png)]

修改的服务为:8001、8002两个微服务提供者

注意依赖【web与actuator】最好放在一起(图形化展示和监控),是标配

有了actuator我们的IP才会修改有效果

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-actuatorartifactId>
dependency>

1、主机名称修改和IP信息提示

1.1、修改YAML配置文件

8001、8002的配置一样,端口号根据变动修改即可

instance与client平级关系

eureka:
  client:
    ...
  instance:
    instance-id: payment8001 # 主机名称

刷新Eureka查看状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OjQc9J6B-1663540722849)(image/27、修改后.png)]

1.2、页面检查状态

随便点击一个主机名称进入,通过下面的路径访问,检查健康状态

http://localhost:8002/actuator/health

1.3、访问信息有IP显示

在两个访问服务提供者下面添加prefer-ip-address: true # 显示IP地址配置即可

如果没有配置就是主机的名称

eureka:
  client:
    ...
  instance:
    instance-id: payment8001 # 主机名称
    prefer-ip-address: true # 显示IP地址

效果

Discovery服务发现与Eureka自我保护机制及总结步骤_第1张图片

2、服务发现Discovery

对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息

2.1、修改8001模块的控制器

通过服务发现获取到自己的信息

注意导入包

import com.zcl.springcloud.entities.CommonResult;

@Slf4j
@RestController
@RequestMapping("/payment")
public class PaymentController {
	/**
     * Discovery服务发现
     */
    @Resource
    private DiscoveryClient discoveryClient;

    @GetMapping("/discovery")
    public Object getDiscovery(){
        // 获取到Eureka服务列表
        List<String> services = discoveryClient.getServices();
        for (String service : services) {
            log.info("-----service-----"+service);
        }

        // 获取指定微服务名称的列表
        List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        for (ServiceInstance instance : instances) {
            log.info(instance.getServiceId()+"\t"+instance.getHost() + "\t"+instance.getPort()+"\t"+instance.getUri());
        }
        return this.discoveryClient;
    }
}

2.2、添加【@EnableDiscoveryClient】注解到启动类

注意:以后不会再使用Erueka当是会经常使用到@EnableDiscoveryClient注解

import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * 描述:项目启动类
 *
 * @author zhong
 * @date 2022-09-14 10:43
 */
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class PaymentMain8001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain8001.class, args);
    }
}

2.3、重启8001服务测试

由于只修改了一个服务,通过浏览器访问创建的控制器获取到服务信息

  1. 浏览器访问:http://localhost:8001/payment/discovery

  2. 浏览器输出内容

    下面的内容就是Eureka的注册实例列表,以及排序

    {
      "services": [
        "cloud-payment-service",
        "cloud-order-service"
      ],
      "order": 0
    }
    
  3. IDEA日志输出

    1. 输出了当前的两个微服务实例名称
    2. 输出了CLOUD-PAYMENT-SERVICE同一个服务实例名称的详细信息
    2022-09-18 19:24:58.610  INFO 3100 --- [nio-8001-exec-2] c.z.s.controller.PaymentController       : -----service-----cloud-payment-service
    2022-09-18 19:24:58.610  INFO 3100 --- [nio-8001-exec-2] c.z.s.controller.PaymentController       : -----service-----cloud-order-service
    2022-09-18 19:24:58.610  INFO 3100 --- [nio-8001-exec-2] c.z.s.controller.PaymentController       : CLOUD-PAYMENT-SERVICE	192.168.26.1	8002	http://192.168.26.1:8002
    2022-09-18 19:24:58.610  INFO 3100 --- [nio-8001-exec-2] c.z.s.controller.PaymentController       : CLOUD-PAYMENT-SERVICE	192.168.26.1	8001	http://192.168.26.1:8001
    
  4. 小结

    1. 只要将上面创建的控制器向外暴露出去,消费者就可以通过访问获取到服务提供者的详细信息

3、Eureka自我保护机制(保证高可用)【属于CAP里面的AP分支】

如下一大串红色的内容就说明了Eureka进入了自我保护机制/

Discovery服务发现与Eureka自我保护机制及总结步骤_第2张图片

3.1、保护机制概述【微服务不可用,不会立即清除】

保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务。

3.2、导致原因

1、为什么会产生自我保护机制

为了防止EurekaClient可以正常运行,但是 与 EurekaServer网络不通情况下,EurekaServer不会立刻将EurekaClient服务剔除

2、什么是自我保护机制

默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒)。但是当网络分区故障发生(延时、卡顿、拥挤)时,微服务与EurekaServer之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。Eureka通过“自我保护模式”来解决这个问题——当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式

3.3、禁止自我保护

1、修改服务注册中心7001YAML配置文件

出厂默认是开启自我保护机制的

eureka:
  instance:
    hostname: eureka7001.com # eureka服务端的实例名称
  client:
  	...
  server:
    enable-self-preservation: false # 关闭Eureka自我保护机制,默认是true
    eviction-interval-timer-in-ms: 2000 # 2秒钟就清除

启动7001服务访问

Discovery服务发现与Eureka自我保护机制及总结步骤_第3张图片

2、修改生产者客户端8001YAML配置文件

eureka:
  client:
  	...
  instance:
    instance-id: payment8001 # 主机名称
    prefer-ip-address: true # 显示IP地址
    lease-renewal-interval-in-seconds: 1 # Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
    lease-expiration-duration-in-seconds: 2 # Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认90秒),超时Eureka注册中心清理服务提供者

关闭8001服务提供者测试

说明:修改了配置后需要重启才能生效,重启后再关闭

Discovery服务发现与Eureka自我保护机制及总结步骤_第4张图片

4、总结Eureka使用步骤

4.1、引入依赖

服务注册中心依赖


<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
dependency>

服务提供者客户端依赖


<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>

4.2、启动类配置注解

服务注册中心注解

@EnableEurekaServer

服务提供者客户端注解

@EnableEurekaClient

4.3、YAML配置文件

服务注册中心

集群部署,互相注册,相互守望

eureka:
  instance:
    hostname: eureka7001.com # eureka服务端的实例名称
  client:
    register-with-eureka: false # false表示不向注册中心注册自己
    fetch-registry: false # false表示自己端就是注册中心,维护服务实例
    service-url:
      # 设置与EurekaServer交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://eureka7002.com:7002/eureka/ # 集群模式,指向其他的注册中心 1中有2的服务注册中心

客户端

eureka:
  client:
    register-with-eureka: true # 表示是否将自己注册进EurekaServer服务中心,默认是true
    fetchRegistry: true # 是否从EurekaServer抓取已有的注册学习,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    service-url:
      # defaultZone: http://localhost:7001/eureka/ # 单机版eureka地址
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka  # 集群版

4.4、服务发现与自我保护看上面

你可能感兴趣的:(eureka,服务发现,java)