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

之前我们提到了,不同的集群,使用的是同一套 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. 【题解】hdu2044一只小蜜蜂

    斐波拉契数列的应用 题目 有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行.请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数.其中,蜂房的结构如下所示. Input输入数据的第一行是一个整数N,表 ...

  2. windows 安装Git详解

    windows 安装Git详解 一.Git简介 Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Lin ...

  3. 四、JavaSE语言基础之运算符

    什么是是运算符 运算符:用于数据运算的符号,运算是一种处理.(注:浮点型数据(float.double)进行运算会出现精度丢失的情况) 运算符大致可分为以下六种: 一.算术运算符:+.-.*./.%. ...

  4. 20、高可用数据同步工具drbd介绍

    20.1.什么是drbd: 20.2.drbd的工作原理: 20.3.drbd的同步模式: 1.实时同步模式: 2.异步同步模式: 20.4.drbd生产应用场景: 1.生产场景中drbd常用于基于高 ...

  5. 重新整理 .net core 实践篇————跨域问题四十一]

    前言 简单整理一下.net core 的跨域问题,这个以前也整理过比较详细的,故而在此简单整理一下. 正文 对跨域相对的就是同源,什么是同源呢? 协议相同(http/https) 主机(域名)相同 端 ...

  6. SpringMVC(12)完结篇 基于Hibernate+Spring+Spring MVC+Bootstrap的管理系统实现

    到这里已经写到第12篇了,前11篇基本上把Spring MVC主要的内容都讲了,现在就直接上一个项目吧,希望能对有需要的朋友有一些帮助. 一.首先看一下项目结构: InfrastructureProj ...

  7. WPF DataGrid RowDetailsTemplate 鼠标滚动通知到 DataGrid 滚动

    前言:上次做了数据驱动UI虽然已经实现,但是在明细中鼠标滚动并不能带动外部 DataGrid 滚动条滚动,上文地址  https://www.cnblogs.com/luguangguang/p/14 ...

  8. Linux_multipath

    安装多路径软件 yum功能安装一下软件包 yum -y install device-mapper device-mapper-multipath 修改多路径软件运行等级为开机自启 chkconfig ...

  9. 为LInux系统安装坚果云网盘

    首先 从www.jianguoyun.com/s/downloads/linux 中下载安装包(deb.rpm) deb 包安装及解决依赖方法 1. 使用 gdebi 安装,自动安装依赖 sudo g ...

  10. java001-java基础

    基础数据类型 int--->Integer long--->Long float--->Float double--->Double boolean--->Boolean ...