本系列为之前系列的整顿重启版,随着我的项目的倒退以及我的项目中的应用,之前系列外面很多货色产生了变动,并且还有一些货色之前系列并没有提到,所以重启这个系列重新整理下,欢送各位留言交换,谢谢!~

之前咱们提到了,不同的集群,应用的是同一套 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