本系列为之前系列的整理重启版,随着项目的发展以及项目中的使用,之前系列里面很多东西发生了变化,并且还有一些东西之前系列并没有提到,所以重启这个系列重新整理下,欢迎各位留言交流,谢谢!~

之前我们提到了,不同的集群,使用的是同一套 Eureka 集群。

我们会动态在线发布每个微服务,在 K8s 的环境下,我们一般使用 ReplicaSet 将我们的微服务部署成无状态的微服务实例(参考:ReplicaSet);在这种情况下,新的微服务实例地址(ip)和原来的地址一般是不一样的。在这种情况下,我们想实现实例的快速上下线,即快速感知实例状态。

这需要两方面的配置,一是 Eureka 客户端与实例配置,另一个就是这里要讨论的 Eureka 服务器的配置。在正常发布的过程中,我们会先启动一个新的实例,然后优雅关闭一个老实例,然后再启动一个新的,再关闭一个老的,以此类推,滚动更新。优雅关闭的时候,一般会从注册中心 Eureka 注销自己。但是有异常情况的时候,例如 JVM Stop-the-world,或者死锁等,优雅关闭可能失败。还有就是这些异常也可能导致心跳无法正常发送到 Eureka。

所以为了实现实例状态快速被其他实例感知,我们需要启动Eureka 主动实例过期检查,同时,建议关闭掉自我保护机制。主要因为:自我保护主要针对集群中网络出现问题,或者 Eureka 出现问题导致 Stop-the-world 并且无法恢复,或者压力过大,导致有很多实例无法发送心跳导致很多实例状态异常,但是实际实例还在正常工作的情况,不要让这些实例不参与负载均衡。启用自我保护的情况下,就会停止对于实例的过期。但是,如果出现这种情况,其实也代表很多实例无法读取注册中心了。并且还有一种情况就是,Eureka 重启,虽然不常见,但是对于镜像中其他的组件更新(例如 JDK 等)我们还是很频繁的。在我们的集群中, Eureka 集群压力不大(服务几百个实例),并且 Eureka 比较稳定,其实只需要考虑 Eureka 网络出问题的情况。我倾向于从客户端对于实例缓存机制来解决这个问题,如果返回实例列表为空,则使用上次的实例列表进行负载均衡,这样既能解决 Eureka 重启的情况,又能处理一些 Eureka 网络隔离的情况。

对于 API 网关,我们使用 Spring Cloud Gatway。Spring Cloud Gateway 是基于 WebFlux(底层即 Project Reactor,基于 Netty 实现)的 API 网关。我们在使用的过程中,遇到并解决了以下一些问题:

  • Spring Cloud Gateway 是纯异步响应式的代码实现,API 网关涉及接口 Body 加密:我们需要对发过来的请求进行解密再发往微服务,之后对微服务返回的响应进行加密再返回给客户端,这就涉及到了 Body 读取与修改。在 Spring Cloud Gateway 中如何实现 Body 的读取与修改呢?这块要好好考虑实现,并且保证不能有内存泄漏。
  • API 网关需要鉴权,但是鉴权一般是单独有另一个微服务负责,API 网关需要调用这个微服务,如何在异步的环境下调用呢?
  • 发往微服务的每个请求,都是异步响应非阻塞的,所以可以不像微服务调用微服务那样做线程隔离,限流也可以不使用客户端限流,而是每个微服务自己限流
  • 发往微服务的每个请求,是需要有重试机制的。
  • 发往微服务的每个请求,也需要做实例和路径级别的断路机制

本小节我们继续针对注册中心 Eureka 以及 API 网关需要考虑的异常情况,设计问题等做了详细的说明与分析。接下来我们将开始入手开始开发我们的框架项目。

微信搜索“我的编程喵”关注公众号,每日一刷,轻松提升技术,斩获各种offer

SpringCloud升级之路2020.0.x版-3.Eureka Server 与 API 网关要考虑的问题的更多相关文章

  1. SpringCloud升级之路2020.0.x版-16.Eureka架构和核心概念

    本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford Eureka 目前 ...

  2. SpringCloud升级之路2020.0.x版-18.Eureka的客户端核心设计和配置

    本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford Eureka 客户 ...

  3. SpringCloud升级之路2020.0.x版-19.Eureka的服务端设计与配置

    本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford Eureka Se ...

  4. SpringCloud升级之路2020.0.x版-17.Eureka的实例配置

    本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 上一节我们提到过, ...

  5. SpringCloud升级之路2020.0.x版-1.背景

    本系列为之前系列的整理重启版,随着项目的发展以及项目中的使用,之前系列里面很多东西发生了变化,并且还有一些东西之前系列并没有提到,所以重启这个系列重新整理下,欢迎各位留言交流,谢谢!~ Spring ...

  6. SpringCloud升级之路2020.0.x版-41. SpringCloudGateway 基本流程讲解(1)

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 接下来,将进入我们升级之路的又一大模块,即网关模块.网关模块我们废弃了已经进入维护状态的 ...

  7. SpringCloud升级之路2020.0.x版-6.微服务特性相关的依赖说明

    本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford spring-cl ...

  8. SpringCloud升级之路2020.0.x版-10.使用Log4j2以及一些核心配置

    本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 我们使用 Log4 ...

  9. SpringCloud升级之路2020.0.x版-43.为何 SpringCloudGateway 中会有链路信息丢失

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 在开始编写我们自己的日志 Filter 之前,还有一个问题我想在这里和大家分享,即在 Sp ...

随机推荐

  1. 三、WPF入门教程——布局和常用Panel学习

    布局和常用Panel学习 一.简介 所有的WPF布局容器都派生自System.Windows.Controls.Panel.Panel继承自FrameworkElement. 在Panel中有一个比较 ...

  2. 5.22考试总结(NOIP模拟1)

    5.22考试总结(NOIP模拟1) 改题记录 T1 序列 题解 暴力思路很好想,分数也很好想\(QAQ\) (反正我只拿了5pts) 正解的话: 先用欧拉筛把1-n的素数筛出来 void get_Pr ...

  3. 【题解】Luogu p2285 BZOJ1207 [HNOI2004]打鼹鼠

    题目描述 鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢把头探出到地面上来透透气的.根据这个特点阿牛编写了一个打鼹鼠的游戏:在一个n*n的网格中,在某些时刻鼹鼠会在某一个网格探出头来透透气. ...

  4. 微信小程序电子签名实现

    实现签名方法就是使用canvas <canvas canvas-id="firstCanvas" id='firstCanvas' bindtouchstart=" ...

  5. Vue(12)组件的组织结构和组件注册

    组件的组织 通常一个应用会以一棵嵌套的组件树的形式来组织: 例如,你可能会有页头.侧边栏.内容区等组件,每个组件又包含了其它的像导航链接.博文之类的组件. 为了能在模板中使用,这些组件必须先注册以便 ...

  6. Unity异步加载进度条

    先上代码: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngi ...

  7. Swagger/OpenAPI By Swashbuckle在NetCore 3.1中较NetCore 2.2使用的注意事项及入门

    方案选择 使用Web API时,了解其各种方法对开发人员来说可能是一项挑战. Swagger也称为OpenAPI(Open Application Programming Interface,开放应用 ...

  8. 关于Word中复杂表格转完美的Markdown格式的技巧

    背景 我们都知道有很多工具能做到Word转Markdown格式,但是在某些复杂的需求下,比如带合并单元格的表格,就会出现错乱,效果非常不理想. 那我们今天来学习和探讨下怎么实现完美转换. 转换 如果想 ...

  9. 3、dns服务搭建

    3.1.dns服务简介: 1.DNS(Domain Name System)域名系统. 目前提供网络服务的应用使用唯一的32位的IP地址来标识,但是由于数字比较复杂.难以记忆,因此产生了域名系统(DN ...

  10. Vue $emit

    案例演示 需求:点击子组件触发一个事件改变父组件的字体大小. <div id="app"> <p :style="{fontSize: fontSize ...