文章目录
随着互联网、物联网的广泛应用,高并发应用程序在数量与体量上都在以指数级提高,传统的单体应用、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 服务治理核心概念最主要的就是服务注册和服务发现。服务注册(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
本文内容到此结束了,
如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误❌疑问💬欢迎各位大佬指出。
主页:共饮一杯无的博客汇总👨💻保持热爱,奔赴下一场山海。🏃🏃🏃