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

本文涉及的产品
云原生 API 网关,700元额度,多规格可选
简介: SpringCloud升级之路2020.0.x版-3.Eureka Server 与 API 网关要考虑的问题

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


image.png


之前我们提到了,不同的集群,使用的是同一套 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 网络隔离的情况。


image.png


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

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


image.png


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

相关文章
|
6月前
|
监控 负载均衡 Java
深入理解Spring Cloud中的服务网关
深入理解Spring Cloud中的服务网关
|
3月前
|
Kubernetes 安全 Cloud Native
云上攻防-云原生篇&K8s安全-Kubelet未授权访问、API Server未授权访问
本文介绍了云原生环境下Kubernetes集群的安全问题及攻击方法。首先概述了云环境下的新型攻击路径,如通过虚拟机攻击云管理平台、容器逃逸控制宿主机等。接着详细解释了Kubernetes集群架构,并列举了常见组件的默认端口及其安全隐患。文章通过具体案例演示了API Server 8080和6443端口未授权访问的攻击过程,以及Kubelet 10250端口未授权访问的利用方法,展示了如何通过这些漏洞实现权限提升和横向渗透。
285 0
云上攻防-云原生篇&K8s安全-Kubelet未授权访问、API Server未授权访问
|
3月前
|
XML Java 数据格式
如何使用 Spring Cloud 实现网关
如何使用 Spring Cloud 实现网关
52 3
|
3月前
|
JavaScript API
|
5月前
|
API 开发者
【API管理 APIM】APIM集成内部VNet后,自我访问出现(Unable to connect to the remote server)问题,而Remote Server正是APIM它自己
【API管理 APIM】APIM集成内部VNet后,自我访问出现(Unable to connect to the remote server)问题,而Remote Server正是APIM它自己
106 5
|
5月前
|
Kubernetes Serverless API
Kubernetes 的架构问题之利用不可变性来最小化对API Server的访问如何解决
Kubernetes 的架构问题之利用不可变性来最小化对API Server的访问如何解决
96 7
|
5月前
|
API 开发者 Java
API 版本控制不再难!Spring 框架带你玩转多样化的版本管理策略,轻松应对升级挑战!
【8月更文挑战第31天】在开发RESTful服务时,为解决向后兼容性问题,常需进行API版本控制。本文以Spring框架为例,探讨四种版本控制策略:URL版本控制、请求头版本控制、查询参数版本控制及媒体类型版本控制,并提供示例代码。此外,还介绍了通过自定义注解与过滤器实现更灵活的版本控制方案,帮助开发者根据项目需求选择最适合的方法,确保API演化的管理和客户端使用的稳定与兼容。
228 0
|
6月前
|
JSON 前端开发 Java
SpringCloud怎么搭建GateWay网关&统一登录模块
本文来分享一下,最近我在自己的项目中实现的认证服务,目前比较简单,就是可以提供一个公共的服务,专门来处理登录请求,然后我还在API网关处实现了登录拦截的效果,因为在一个博客系统中,有一些地址是可以不登录的,比方说首页;也有一些是必须登录的,比如发布文章、评论等。所以,在网关处可以支持自定义一些不需要登录的地址,一些需要登录的地址,也可以在网关处进行校验,如果未登录,可以返回JSON格式的出参,前端可以进行相关处理,比如跳转到登录页面等。
168 4
|
5月前
|
Kubernetes 监控 API
在k8S中,各模块如何与API Server进行通信的?
在k8S中,各模块如何与API Server进行通信的?
|
6月前
|
监控 负载均衡 Java
深入理解Spring Cloud中的服务网关
深入理解Spring Cloud中的服务网关