系列文章|云原生时代下微服务架构进阶之路 - Spring Cloud

软件架构 创建于:2023-05-29

通过本篇文章您可以了解到以下内容:

  • Spring Cloud 简介
  • Spring Cloud 的前生今世
  • Spring Cloud & Kubernetes 最佳实践
  • 总结

Spring Cloud简介

谈到 Spring Cloud 相信大家都不会陌生,在本文的开篇,首先让我们来看看关于 Spring Cloud 的官方介绍(部分截取):

英文部分:

Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems

(e.g. configuration management, service discovery, circuit breakers, intelligent routing, micro-proxy, control bus, one-time tokens, global locks, leadership election, distributed sessions, cluster state).

通过介绍我们可以看出,Spring Cloud 主要特点是提供了一系列开箱即用的组件,这些组件可以帮助开发人员快速解决微服务架构系统构建过程中所遇到的问题。

如上图所示,在分布式微服务架构系统下,我们面临需要解决的问题可能包括如下几大方面:

  • 注册中心是怎样构建的?
  • 监控的解决方案又是什么?
  • 网关的技术选型?
  • 微服务级别的高可用?
  • 微服务之间的负载均衡?
  • 配置中心的解决方案?

那么对于上述提出的问题,Spring Cloud 给出的解决方案又是什么呢? 接下来让我们深入了解下 Spring Cloud 包含哪些组件,这些组件的又是干什么的? 以及哪些组件又做了替换和升级。

Spring Cloud 的前生今世

众所周知,传统意义上的 Spring Cloud 是集成了 Netflix 的一些组件,通过 Spring 的代码粘合,使得开发人员通过简单的注解方式以及 yaml 的配置就可以快速构建出一整套微服务架构的解决方案。这里面包括网关、注册中心、配置中心、监控、应用层面的高可用(熔断、降级、限流),负载均衡等。如下图所示:

Zuul

这里谈到的 Zuul 指的是 Zuul 1.0,底层原理本质是 Servlet。通过前置、后置的Filter完成在路由过程中的额外操作,比如鉴权、统一日志处理等功能。同时也支持 Groovy 语言,通过定时任务扫描在指定位置的 Groovy 文件,完成动态加载的功能。值得注意的是后续 Netflix 开发出了 Zuul 2.0 是基于非阻塞模型的,Spring Cloud 并没有进行集成,而是采用大家所熟知的 Spring Cloud Gateway 作为网关首选的解决方案。

Eureka

作为注册中心,在 CAP 理论模型中属于 AP。分为 Eureka Server 以及 Eureka Client 两部分,对于 Eureka Server 而言,提供了一些了的 Rest API 从而完成服务注册、心跳保持、驱除服务实例等功能,同时本身包含多级缓存,以及包括自我保护机制等。

Ribbon

相比服务端负载均衡,Ribbon 是客户端负载均衡的实现。通常结合 OpenFeign 使用,本身提供了多种客户端负载均衡的策略,同时也可以自定义负载均衡的策略。目前 Ribbon 项目处于 maintenance 状态。

Hystrix

本质是通过 SDK 的方式实现熔断、降级、限流等功能。通过 yaml 方式可以进行配置,另一方面也可以通过编写 Java 代码方式实现。需要值得注意的是,目前 Hystrix 项目处于 maintenance 状态。

OpenFeign

简化 HTTP 调用,相比传统代码编写完成一次 HTTP 调用,OpenFeign 大大简化了代码的复杂度。同时可以结合 Ribbon 以及 Hystrix 完成一次请求过程中涉及到的负载均衡以及熔断、降级、限流操作。OpenFeign 底层支持三种方式,分别是URLconnection、HttpClient 以及 OKHttp。

Config Server

统一配置中心,分为 Config Server 以及 Config Client 两部分,可以结合消息组件完成每一个微服务的配置更新。

Zipkin

监控解决方案,无论是同步还是异步调用可以展现。主要目的是完成整个微服务系统中监控模块,包括微服务之间调用关系、耗时、问题定位等功能。

说到这里,相信大家已经发现了,传统的 Spring Cloud 所集成的一些组件已经处于 maintenance 的状态,例如(Hystrix、Ribbon 等)所以 Spring Cloud 在此基础上,做了一些组件的升级工作,接下来会向大家做一一介绍。

Spring Cloud Gateway

网关的解决方案,替换原有的 Zuul1.0。相比 Zuul1.0 这种传统Servlet方式,Spring Cloud Gateway 采用非阻塞方式,基于 Spring Boot2.0 以及 Spring Framework5。

Spring Cloud LoadBalancer

对于传统 Ribbon 组件的升级和替换。同时增加对 WebFlux 的支持。

Spring Cloud Circuit breaker

对于传统 Hystrix 组件的升级和替换,采用集成整合 Resilience4j 的方式完成熔断、降级、限流等功能。

对于上面提到的三个组件的详细信息,可以参考以下链接(扫码立即查看):

通过上面的介绍可以了解到目前的 Spring Cloud 对原有的一些组件进行了升级替换。这里原有的含义指的是集成 Netflix 的一些组件。

Spring Cloud & Kubernetes最佳实践

我们知道 Spring Cloud 的本质是通过SDK的方式(引入 SDK、并且通过简单的注解和 yaml 的配置),帮助开发人员快速构建微服务架构中所必须的元素。那么如果当 Spring Cloud 遇到上 Kubernetes 时又会发生什么呢?

Image

第一种方案

相对比较粗暴的方式,使用 Spring Boot 作为基石来开发每一个微服务,这里面并不使用 Spring Cloud 任何组件,依托于Kubernetes 的特性来构建微服务架构。比如注册中心我们不采用 Eureka(亦或者 zookeeper、consul 等)而是直接采用Kubernetes 服务发现机制。对于负载均衡、熔断降级限流等功能我们可以结合 Service Mesh 来实现。所以如果用一句话概括,那么第一种方案就是: Spring Boot + Kubernetes + Service Mesh。

第二种方案

相比第一种解决方案,第二种的方式相对中和一些,我们可以对 Spring Cloud 的组件进行取舍,比如注册中心的解决方案我们可以不使用 Eureka 而是采用 Kubernetes 的服务发现机制,对于网关可以采用 Spring Cloud Gateway,应用高可用层面我们可以采用 Spring Cloud Circuit breaker。所以如果用一句话概括,那么第二种方案就是: Spring Cloud(部分组件) + Kubernetes。

第三种方案

对于第三种解决方案,我们可以使用全家桶似的 Spring Cloud 作为微服务开发的解决方案。也就是说可以理解为将所有Spring Cloud 技术组件平移到 Kubernetes 之上。

总结

回顾全篇内容,整体包括以下内容:

  • 首先在开篇我们简单了解到了 Spring Cloud。
  • 其次对 Spring Cloud 包含组件的功能以及组件升级替换进行了详细的介绍。
  • 最后对 Spring Cloud 在 Kubernetes 上的最佳实践给出了三种方案。

参考链接:

1. https://github.com/spring-cloud/

2. https://spring.io/projects/spring-cloud

3. https://start.spring.io/

内容来源|公众号:VMwareTanzu 云原生

原文地址:https://my.oschina.net/u/4238514/blog/5589612

免责声明:本文来源于互联网,版权归合法拥有者所有,如有侵权请公众号联系管理员

* 本站提供的一些文章、资料是供学习研究之用,如用于商业用途,请购买正版。

VMware中国研发中心