• 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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    1.1、修改YAML配置文件

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

    instance与client平级关系

    eureka:
      client:
        ...
      instance:
        instance-id: payment8001 # 主机名称
    
    • 1
    • 2
    • 3
    • 4
    • 5

    刷新Eureka查看状态

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

    1.2、页面检查状态

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

    http://localhost:8002/actuator/health
    
    • 1

    1.3、访问信息有IP显示

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

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

    eureka:
      client:
        ...
      instance:
        instance-id: payment8001 # 主机名称
        prefer-ip-address: true # 显示IP地址
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    效果

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dwe30TA8-1663540722850)(image/28、显示IP地址.png)]

    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    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);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2.3、重启8001服务测试

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

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

    2. 浏览器输出内容

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

      {
        "services": [
          "cloud-payment-service",
          "cloud-order-service"
        ],
        "order": 0
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
    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
      
      • 1
      • 2
      • 3
      • 4
    4. 小结

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

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

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

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Z62mTxY-1663540722850)(image/20、注入80实例.png)]

    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秒钟就清除
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    启动7001服务访问

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EWHvDhJD-1663540722851)(image/29、关闭自我保护.png)]

    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注册中心清理服务提供者
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    关闭8001服务提供者测试

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

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UKUCZoiX-1663540722851)(image/30、8001剔除.png)]

    4、总结Eureka使用步骤

    4.1、引入依赖

    服务注册中心依赖

    
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    服务提供者客户端依赖

    
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4.2、启动类配置注解

    服务注册中心注解

    @EnableEurekaServer
    
    • 1

    服务提供者客户端注解

    @EnableEurekaClient
    
    • 1

    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的服务注册中心
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    客户端

    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  # 集群版
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

  • 相关阅读:
    开发模式对测试的影响
    基于OCC+OSG的CAD之GMSH与Netgen网格连贯性测试
    华为ipsec vpn配置案例
    STM32F103 CAN通讯实操
    可用于嵌入各种功能的STSPIN820、STSPIN830、STSPIN240、STSPIN233电机驱动器 功率 MOSFET
    毕业4年,薪资25k,这一刻,我决定从字节离职了···
    Vue父子传值子组件接收的6种方式
    爱上开源之DockerUI-xterm.js实现Web控制台
    vue多种实现动画效果分享【推荐学习】
    分享篇:我用数据分析做副业
  • 原文地址:https://blog.csdn.net/baidu_39378193/article/details/126926175