当前位置: 首页 > news >正文

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

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

规范要求:

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

先看原来的实例内容

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

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

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

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--分割web与actuator常绑定一块-->

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地址

效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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;
    }
}

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进入了自我保护机制/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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秒钟就清除

启动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注册中心清理服务提供者

关闭8001服务提供者测试

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

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

4、总结Eureka使用步骤

4.1、引入依赖

服务注册中心依赖

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

服务提供者客户端依赖

<!--eureka-client客户端-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</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、服务发现与自我保护看上面

相关文章:

  • 机器学习01
  • 类加载器及反射简单笔记
  • MT6701磁编码器使用指南,14Bit单圈绝对值,I2C stm32 HAL库读角度
  • leetcode竞赛:20220918周赛
  • 牛客刷题,python入门基础(11)
  • 循序渐进学Git(可复习)
  • 力扣 6181. 最长的字母序连续子字符串的长度
  • Chapter8:控制系统状态空间分析
  • 基于Java+Springboot+vue体育用品销售商城平台设计和实现
  • uboot源码分析(基于S5PV210)之uboot的硬件驱动部分
  • iptables之SNAT,DNAT原理与DNS分离解析实验
  • 基于Web技术的优秀电影片段赏析与交流系统
  • Android案例手册 - 实现一个华容道拼图游戏
  • 软件设计师笔记-----系统安全分析与设计
  • 「Nature领衔」8月BIOTREE成功助力发表文章17篇,总IF:190+!
  • __proto__ 和 prototype的关系
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 30秒的PHP代码片段(1)数组 - Array
  • download使用浅析
  • Java 网络编程(2):UDP 的使用
  • Java,console输出实时的转向GUI textbox
  • JavaScript对象详解
  • JS实现简单的MVC模式开发小游戏
  • js数组之filter
  • mysql 5.6 原生Online DDL解析
  • Mysql优化
  • Node + FFmpeg 实现Canvas动画导出视频
  • nodejs:开发并发布一个nodejs包
  • Vue ES6 Jade Scss Webpack Gulp
  • 大快搜索数据爬虫技术实例安装教学篇
  • 好的网址,关于.net 4.0 ,vs 2010
  • 经典排序算法及其 Java 实现
  • 前端面试之CSS3新特性
  • 区块链共识机制优缺点对比都是什么
  • 深入 Nginx 之配置篇
  • 为视图添加丝滑的水波纹
  • 我的zsh配置, 2019最新方案
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ## 基础知识
  • #{}和${}的区别是什么 -- java面试
  • #stm32整理(一)flash读写
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (附源码)php新闻发布平台 毕业设计 141646
  • (一)插入排序
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转载)Linux 多线程条件变量同步
  • ****Linux下Mysql的安装和配置
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .Net 基于.Net8开发的一个Asp.Net Core Webapi小型易用框架
  • .net6Api后台+uniapp导出Excel
  • .Net的DataSet直接与SQL2005交互
  • .NET开发者必备的11款免费工具