随着互联网、物联网的广泛应用,高并发应用程序在数量与体量上都在以指数级提高,传统的单体应用、SOA 等架构已经不足以支撑新环境对应用性能与可靠性的要求。此时微服务架构开始闪亮登场了😎。
微服务架构的出现系统复杂度相对单体服务也提高了很多,系统架构需要考虑的问题也随之而来:

  • 微服务的拆分粒度如何界定?
  • 微服务之间的事务怎么控制?
  • 微服务之间怎么互相调用?怎么做负载均衡请求?
  • 限流和熔断机制怎么实现?
  • 微服务架构数据一致性该如何保障?
  • 大型应用如何实施监控与链路跟踪?
  • 众多服务的日志如何管理?

微服务看似是将整体应用打散为小服务这种很简单的处理,实则操作起来非常复杂,针对新的微服务架构额外产生的数据一致性问题、网络通信故障、限流与熔断机制、调用链路跟踪、集群监控、甚至用户登录与权限管理都是全新的挑战。如果这些问题全部都要软件公司自己解决显然是行不通的,如何高效地实现系统扩展性、伸缩性,以及维护性,成为一个非常现实且亟待解决的难题。
面对这样的挑战,业界普遍做法是引入服务拆分和集成的设计理念。而微服务架构通过将传统的单体应用按照业务边界划分为小型的、可以独立部署的服务单元,然后通过遵循轻量级的交互协议进行集成,成为这一理念下事实上的标准开发模式和实践。
微服务架构的真正落地需要对应的框架和工具,而基于 Spring Boot 的 Spring Cloud 框架应运而生,而Spring Cloud Alibaba 基于Spring Cloud技术生态扩展延伸成为后起之秀,也提供了很多优秀组件。

SpringCloud

服务注册发现与服务治理 Eureka

Netflix Eureka 是一款由 Netflix 开源的基于 REST 服务的注册中心,用于提供服务发现功能。Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 进行了二次封装,主要负责完成微服务架构中的服务治理功能。
eureka架构图
Eureka架构设计图
Eureka 服务治理核心概念最主要的就是服务注册和服务发现。服务注册(Register)是服务治理的最基本概念,内嵌了 Eureka 客户端的各个微服务通过向 Eureka 服务器提供 IP 地址、端点等各项与服务发现相关的基本信息完成服务注册操作。
服务发现(Get Register)指的是从注册中心获取对应服务的信息。服务发现是客户端向注册中心获取信息的动作。
Eureka 客户端需要每隔一定时间主动上报自己的运行时状态,进行服务续约(Renew)。如果客户端长时间没有续约,那么 Eureka服务端将在 90 秒内从服务器注册表中剔除(Evict)客户端的信息。
Eureka 客户端也可以主动告知 Eureka 服务器自己不想再注册到 Eureka 中,进行服务取消(Cancel)

服务调用 Feign

在这里插入图片描述
Feign 是一个声明式的 REST 客户端,它的目的就是让 REST 调用更加简单。Feign 提供了 HTTP 请求的模板,通过编写简单的接口和插入注解,就可以定义好 HTTP 请求的参数、格式、地址等信息。
而且 Feign 会完全代理 HTTP 请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。Spring Cloud 对 Feign 进行了封装,使其支持 SpringMVC 标准注解和 HttpMessageConverters。Feign 可以与 Eureka 和 Ribbon 组合使用以支持负载均衡,与 Hystrix 组合使用,支持熔断回退。

客户端负载均衡 Ribbon

负载均衡是一种基础的网络服务,它的核心原理是按照指定的负载均衡算法,将请求分配到后端服务集群上,从而为系统提供并行处理和高可用的能力。
负载均衡的方式有很多种,在 Spring Cloud 体系中,Ribbon 就是负载均衡的组件,所有的请求都是通过 Ribbon 来选取对应的服务信息的。
目前主流的负载方案分为两种:

  • 集中式负载均衡,在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的负载均衡器,比如 F5,也有软件,比如 Nginx。
  • 客户端负载均衡,客户端根据自己的请求情况做负载,Ribbon 就属于客户端自己做负载的框架。
    在这里插入图片描述
    Ribbon负载均衡(轮询策略)

API网关

API 网关是对外提供服务的一个入口,并且隐藏了内部架构的实现,是微服务架构中必不可少的一个组件。API 网关可以为我们管理大量的 API 接口,负责对接客户、协议适配、安全认证、路由转发、流量限制、日志监控、防止爬虫、灰度发布等功能。
在这里插入图片描述

Zuul

Zuul 也是 Netflix 中的一员,是一个基于 JVM 路由和服务端的负载均衡器。提供了路由、监控、弹性、安全等服务。Zuul 能够与 Eureka、Ribbon、Hystrix 等组件配合使用。
github地址:https://github.com/Netflix/zuul

Gateway

Spring Cloud Gateway 是 Spring 官方自己开发的一款 API 网关。Zuul 的实现原理是对 Servlet 的一层封装,通信模式上采用的是阻塞式 I/O。而在技术体系上,Spring Cloud Gateway 基于最新的 Spring 5 和 Spring Boot 2,以及用于响应式编程的 Project Reactor 框架,提供的是响应式、非阻塞式 I/O 模型。所以较之 Netflix Zuul,性能上Spring Cloud Gateway 显然要更胜一筹。
Spring Cloud Gateway 的源码非常复杂,出现问题不容易排查和解决。而 Zuul 的编程模型和底层原理都非常简单,开发调试上也容易把握。
github地址:https://github.com/spring-cloud/spring-cloud-gateway

配置中心 Config

在 Spring Cloud 中,自研了一个 Spring Cloud Config 框架来构建配置中心,并同时提供了配置服务器和多种配置仓库实现方案。
在这里插入图片描述

服务之间调用的容错保护 Hystrix

在这里插入图片描述
正常情况服务A调用服务B,服务B再调用服务C,大家都正常的情况下都相安无事。
在这里插入图片描述
一旦服务C挂了,会间接的导致服务B不可用,服务B不可用会导致服务A也不可用,最终整个调用链都不可用,出现服务雪崩效应。
Hystrix 是由 Netflix 发布的针对微服务分布式系统的熔断保护中间件,相当于电路中的保险丝,它的关注度也非常高,在 GitHub 上已经有超过 22K star,也经过了 Netflix 线上大规模流量的验证,性能非常稳定。
在微服务架构下,很多服务都相互依赖,如果不能对依赖的服务进行隔离,那么服务本身也有可能发生故障,Hystrix 通过 HystrixCommand 对调用进行隔离,这样可以阻止故障的连锁反应,能够快速失败并迅速恢复服务或者进行回退并优雅降级。
github地址:https://github.com/Netflix/Hystrix

链路跟踪 Sleuth+Zipkin

当系统发生故障的时候,就需要一种机制对故障点进行快速定位,确认是哪个服务出了问题,链路追踪技术由此而生。所谓的链路追踪,就是运行时通过某种方式记录下服务之间的调用过程,在通过可视化的 UI 界面帮研发运维人员快速定位到出错点。
Spring Cloud 标准生态下内置了 Sleuth 这个组件,它通过扩展 Logging 日志的方式实现微服务的链路追踪。Zipkin 是 推特的一个开源项目,它能收集各个服务实例上的链路追踪数据并可视化展现。

消息事件驱动 Stream

Spring Cloud 专门提供了一个 Spring Cloud Stream 框架来实现事件驱动架构,并完成与主流消息中间件的集成。事件生产者和消费者之间的虚线代表的是一种相互松散、没有直接调用的关联关系。满足以上特性的系统代表着一种松耦合的架构,通常被称为事件驱动架构,而这里的事件也可以被理解是服务与服务之间发送的一种消息。
在这里插入图片描述

SpringCloud Alibaba

SpringCloud Alibaba微服务架构主要对服务注册发现和配置中心、限流熔断、分布式事务做了升级拓展处理,其他的组件还是沿用SpringCloud官方提供的相关组件。

服务注册发现和配置中心 Nacos

Nacos同时实现了服务治理和配置中心的功能,简单理解可以把Nacos看成是SpringCloud Eureka和SpringCloud Config的结合体。
Nacos 官方地址为https://nacos.io/zh-cn/index.html。由阿里开源,官方定义为:
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
相关文章:
Nacos基本概念和单机部署
Nacos集群部署-高可用保证
在这里插入图片描述

限流与熔断 Sentinel

在 Spring Cloud Alibaba 生态中有一个重要的流控组件 Sentinel。Sentinel 以流量为切入点,从流量控制熔断降级系统负载保护等多个维度保护服务的稳定性。
Sentinel 具有以下特征。

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
  • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
  • 广泛的开源生态:Sentinel 提供开箱即用的与其他开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 整合只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
  • 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

github地址:https://github.com/alibaba/Sentinel

分布式事务 Seata

Alibaba Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。它的官网是http://seata.io/,截止到目前 Seata 在 GitHub 已有 22.3K star,最新版本已迭代到 1.5.1,阿里多年的技术沉淀让 Seata 的内部版本平稳渡过了多次双 11 的考验。2019 年 1 月为了打造更加完善的技术生态和普惠技术成果,Seata 正式宣布对外开源,未来 Seata 将以社区共建的形式帮助其技术更加可靠与完备,按官方的说法Seata目前已具备了在生产环境使用的条件。
在这里插入图片描述

RPC服务通信 Dubbo

Dubbo 是阿里巴巴开源的高性能、轻量级的开源 Java 框架,目前被 Apache收录,官网是:
https://dubbo.apache.org/zh/index.html
Dubbo 是典型的 RPC 框架的代表,通过客户端/服务端结构实现跨进程应用的高效二进制通信。但是它的功能比你想象的更加强大。同时支持如下特性:

  • 服务发现
  • 通过 Dubbo 定义的路由规则,实现对流量分布的控制
  • 描述 Dubbo 支持的配置,Dubbo 的动态配置能力。
  • 部署架构(注册中心 配置中心 元数据中心)

推荐技术选型

  • 服务注册与发现:Nacos
  • 服务通信调用:Open Feign
  • 配置中心:Nacos
  • 服务网关:Spring Cloud Gateway
  • 服务熔断限流:Sentinel
  • 分布式事务:Seata
  • 调用链监控:Sleuth+Zipkin
  • 分布式任务调度:XXL-JOB

本文内容到此结束了,
如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误❌疑问💬欢迎各位大佬指出。
主页共饮一杯无的博客汇总👨‍💻

保持热爱,奔赴下一场山海。🏃🏃🏃

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐