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

之前我们提到了,不同的集群,使用的是同一套 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. ThreadPoolExecutor参数详解

    ThreadPoolExecutor全部参数的构造函数 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long ke ...

  2. noip2012 总结

    Vigenère 密码 题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密码.Vigenère 密码的加密解密算法简单易用,且破译 ...

  3. VBS脚本编程(2)——运算符

    算数运算符 用于执行数学计算的运算符. 1.加法运算符( + ) 计算两个数之和. 2.减法运算符( - ) 计算两个数值的差或表示数值表达式的负值. 3.乘法运算符(*) 计算两个数之积. 4.除法 ...

  4. 深度学习的优化器(各类 optimizer 的原理、优缺点及数学推导)

    深度学习优化器 深度学习中的优化器均采用了梯度下降的方式进行优化,所谓炼丹我觉得优化器可以当作灶,它控制着火量的大小.形式与时间等. 初级的优化器 首先我们来一下看最初级的灶台(100 - 1000 ...

  5. 用户RFM模型及应用

    RMF含义 R(Recency)(用户粘性,越小越好):用户最近一次交易时间的间隔.R值越大,表示用户交易发生的日期越久,反之则表示用户交易发生的日期越近 F(Frequency)(用户忠诚度,越大越 ...

  6. bson的类型

    BSON是JSON的扩展数据类型

  7. [心得体会]RabbitMQ

    RabbitMQ是什么? 消息队列, 基于AMQP(高级消息队列), 使用Erlang语言编写, 收发消息使用 有什么用? 有什么应用场景? 1. 任务异步处理 2. 应用程序解耦 为什么使用Rabb ...

  8. pybot参数

    p.p1 { margin: 0; font: 12px "Helvetica Neue" } p.p2 { margin: 0; font: 12px "Helveti ...

  9. XCTF reverse maze

    一.查壳 二.拖入ida64,静态调试,找到主函数F5反编译 二.1 思路分析(逆向是真的费时间,每个函数都要分析过去): 1.发现每个if最终都会进入LABEL-15 点进去,看看这个函数是干啥的. ...

  10. MindSpore模型精度调优实战:常用的定位精度调试调优思路

    摘要:在模型的开发过程中,精度达不到预期常常让人头疼.为了帮助用户解决模型调试调优的问题,我们为MindSpore量身定做了可视化调试调优组件:MindInsight. 本文分享自华为云社区<技 ...