OpenSergo & Spring Cloud Alibaba 带来的服务治理能力

2023-08-12 09:37:34

 

博主介绍:✌全网粉丝3W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌

博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+MySQL+Vue等前后端分离项目,可以在左边的分类专栏找到更多项目。《Uniapp项目案例》有几个有uniapp教程,企业实战开发。《微服务实战》专栏是本人的实战经验总结,《Spring家族及微服务系列》专注Spring、SpringMVC、SpringBoot、SpringCloud系列、Nacos等源码解读、热门面试题、架构设计等。除此之外还有不少文章等你来细细品味,更多惊喜等着你哦

🍅开源项目免费哦(有vue2与vue3版本):点击这里克隆或者下载      🍅

🍅文末获取联系🍅精彩专栏推荐订阅👇🏻👇🏻 不然下次找不到哟

Java项目案例《100套》

https://blog.csdn.net/qq_57756904/category_12173599.html
uniapp小程序《100套》

https://blog.csdn.net/qq_57756904/category_12199600.html

Spring Cloud 应用为何需要服务治理

随着微服务技术的发展,微服务(MicroServices) 的概念早已深入人心,越来越多的公司开始使用微服务架构来开发业务应用。如果采用得当,微服务架构可以带来非常大的优势。微服务架构的最大好处是它可以提升开发效率和系统整体的稳定性:

  • 开发和部署相对简单:单个微服务的功能可以更快地更改,因为可以独立部署、影响范围更小,启动和调试单个微服务的时间成本相比于单体应用也大大减少。
  • 横向扩展简单:根据业务的高峰低谷周期快速的横向扩展非常简单,因为单个微服务通常很小,可以随着系统整体负载的变化更快地启动和停止。
  • 架构升级灵活:单个微服务的“内部架构”可以迅速升级,因为微服务之间松散耦合的,只面向定义好的通讯接口进行编程。这使开发团队能够基于自身的技术背景和偏好灵活选择,而不会直接影响其他应用程序、服务或团队。
  • 更好的容错性:微服务之间可以实现更好的故障隔离,单个服务内的内存泄露等故障不容易影响其他服务,相比单体应用一个组件故障会拖垮整个系统。

但是微服务在实施过程中,也很容易遇到一些难点。随着业务规模的增长,在这个过程中如果微服务得不到恰当的治理,不仅不能享受到微服务架构带来的好处,反而会因为微服务带来的系统复杂性,造成开发、运维部署的复杂度增加,进而影响开发迭代的速度,甚至影响系统的整体稳定性,比如:

  • 服务之间使用远程调用进行通讯,这比进程内的直接调用复杂很多。由于通讯链路的复杂性,可能会出现很多不确定的问题,会出现远程调用不可用或者延迟较高的情况,开发人员需要能够处理这些偶发问题,避免影响业务。
  • 随着业务的发展,微服务之间的拓扑图开始变得复杂,排查问题变得困难,搭建完整的开发测试环境成本也越来越大。
  • 当功能涉及到多个微服务模块时,迭代时需要谨慎地协调多个开发团队的迭代排期,才能保证迭代能够按时交付,达到敏捷开发的效果。

因此, 微服务落地的成功与否,很大程度上取决于能否很好的对这些微服务进行治理,对于传统的 Spring Cloud 应用,并没有提供开箱即用的服务治理机制,用户只能通过自己去实现Spring Cloud中的各种扩展点来实现服务治理。相比起让用户费心费力去自己写代码实现扩展点,Spring Cloud Alibaba 选择了替用户做这些事情。用户只需导入 Spring Cloud Alibaba 中的 starter,即可快速给自己的 Spring Cloud 应用添加对应的微服务治理能力。

Spring Cloud Alibaba 新版本服务治理能力预览

最新发布的 Spring Cloud Alibaba 2.2.10.RC1 新版本,基于社区 2.2.x 分支进行的构建发布,其中 2.2.10.RC1 版本通过首次给 Spring Cloud 生态带来了微服务治理能力,并给Spring Cloud Alibaba应用带来了Proxyless Mesh的能力,让Spring Cloud Alibaba应用更好的拥抱服务网格。详细的新版本预览内容如下新版本:

2.2.10.RC1 是在 Spring Cloud Hoxton.SR12、Spring Cloud 2.3.12.RELEASE 的基础上,支持 Istio 以及OpenSergo 控制面下发的服务治理规则,对 Spring Cloud 生态中的 Ribbon 负载均衡器以及 Spring MVC, Spring WebFlux 的各种拦截器做了增强,实现了服务治理的部分能力,属于一个重大特性发布的。

2.2.10 RC1版本主要支持了标签路由与鉴权这两种服务治理的能力,并且支持对接多种控制平面的实现,除了目前服务网格的事实标准 Istio,新版本也支持社区最新推出的 OpenSergo 控制平面以及服务治理生态,详细的能力如下所示:

流量路由

我们可以基于流量路由标准来实现各种业务场景,如标签路由、金丝雀发布、同机房优先路由等。

  • 标签路由:标签路由是按照标签为维度对目标负载进行划分,符合条件的流量匹配至对应的目标,从而实现标签路由的能力。当然基于标签路由的能力,赋予标签各种含义我们就可以实现各种流量路由的场景化能力。
  • 金丝雀发布:金丝雀发布是一种降低在生产中引入新软件版本的风险的技术,方法是在将更改推广到整个基础架构并使其可供所有人使用之前,缓慢地将更改推广到一小部分用户。金丝雀发布是一种在黑与白之间,能够平滑过渡的一种发布方式。让一部分用户继续用旧版本,一部分用户开始用新版本,如果用户对新版本没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到新版本上面来。一直都有听说,安全生产三板斧的概念:可灰度、可观测、可回滚。那么灰度发布能力就是帮助企业软件做到快速迭代验证的必备能力。在K8s中金丝雀发布的最佳实践如下:第一步:新建灰度 Deployment,部署新版本的镜像,打上新版本的标签。第二步:配置针对新版本的标签路由规则。第三步:验证成功,扩大灰度比例。第四步:若验证成功,将稳定版本的应用更新成最新镜像;若验证失败,把灰度的 Deployment 副本数调整到 0 或删除该 Deployment。
  • 全链路灰度:当企业的发展,微服务的数量会逐渐增多。在有一定规模的一定数量的微服务情况下,一次发版可能涉及到的服务数量会比较多,微服务链路也相当较长。全链路灰度可以保证特定的灰度流量可以路由到所有涉及到的灰度版本中。
  • 同可用区优先路由:当企业的对稳定性的要求变高时,企业的应用会选择部署在多个可用区中提高应用的可用性,避免某个可用区出现问题后导致影响应用的可用性。当应用在不同的可用区部署时,应用间跨可用区调用可能会被因为远距离调用造成的网络延迟影响,同可用区优先路由会让我们的 Consumer 应用优先调用当前可用区内 的Provider 应用,可以很好地减少这种远距离调用造成的影响,同时当某个可用区出现问题后,我们只需在流量入口处将当前可用区的流量隔离掉,其他可用区的流量不会访问至当前可用区的节点,可以很好地控制某个可用区出现问题后的影响面。

服务鉴权

正常生产场景,微服务应用都具有安全要求,不会让任意的服务都可直接调用。因此需要对调用该应用的上游应用进行服务鉴权,保证应用自身的安全。

通过 OpenSergo 探索治理能力的标准化

OpenSergo 是开放通用的,覆盖微服务及上下游关联组件的微服务治理项目,是阿里巴巴微服务治理的最佳实践。OpenSergo 从微服务的角度出发,涵盖流量治理、服务容错、服务元信息治理、安全治理等关键治理领域,提供一系列的治理能力与标准、生态适配与最佳实践,支持 Java, Go, Rust 等多语言生态。

image

OpenSergo 控制平面 (Control Plane) 作为 OpenSergo CRD 的统一管控组件,承载服务治理配置转换与下发的职责。

image

  1. 准备 Kubernetes 环境;
  2. 在 K8s 集群安装 OpenSergo Control Plane
  3. Spring Cloud Alibaba 应用集成 OpenSergo

注意 本章节只是为了便于您理解接入方式,本中已经示例代码完成接入工作,您无需再进行修改。

首先,修改 pom.xml 文件,引入 spring-cloud-starter-alibaba-governance-routing 依赖。同时引入 Spring Cloud Alibaba 的 spring-cloud-starter-opensergo-adapter 模块:

<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-governance-routing</artifactId>
</dependency>
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-opensergo-adapter</artifactId>
</dependency>

在 application.properties 配置文件中配置 OpenSergo 控制面的相关信息:

# OpenSergo 控制面 endpoint
spring.cloud.opensergo.endpoint=127.0.0.1:10246

  1. Spring Cloud Alibaba 应用启动:启动三个模块的启动类,分别为OpenSergoConsumerApplication,两个ProviderApplication,将其注入到Nacos注册中心中。
  2. 通过 OpenSergo 控制面也定义了特定的流量路由规则TrafficRouter。TrafficRouter 将特定特征的流量映射至特定特征所对应的工作负载上,社区目前的设计TrafficRouter主要是基于 Istio VirtualService 进行补充与扩展。

如下是一个 OpenSergo 控制面对应的流量路由规则:

apiVersion: traffic.opensergo.io/v1alpha1
kind: TrafficRouter
metadata:
  name: service-provider
  namespace: default
  labels:
    app: service-provider
spec:
  hosts:
    - service-provider
  http:
    - match:
        - headers:
            tag:
              exact: v2
      route:
        - destination:
            host: service-provider
            subset: v2
            fallback:
              host: service-provider
              subset: v1
    - route:
        - destination:
            host: service-provider
            subset: v1

这条  TrafficRouter指定了一条最简单的流量路由规则,将请求头tag为v2的HTTP请求路由到v2版本,其余的流量都路由到v1版本。如果v2版本没有对应的节点,则将流量fallback至v1版本。

效果演示

发送一条不带请求头的 HTTP 请求至 OpenSergoConsumerApplication:

curl --location --request GET '127.0.0.1:18083/router-test'

因为请求头不为 v2,所以请求将会被路由到v1版本,返回如下:

Route in 30.221.132.228: 18081,version is v1.

之后发送一条请求头tag为 v2 的HTTP请求:

curl --location --request GET '127.0.0.1:18083/router-test' --header 'tag: v2'

因为满足路由规则,所以请求会被路由至 v2 版本:

Route in 30.221.132.228: 18082,version is v2.

停止 v2 版本的 ProviderApplication 后,继续发送一条请求头tag为 v2 的 HTTP 请求:

curl --location --request GET '127.0.0.1:18083/router-test' --header 'tag: v2'

因为 v2 版本没有服务提供者,因此流量被 fallback 至 v1 版本。

Route in 30.221.132.228: 18081,version is v1.

OpenSergo 总结与展望

在 Java 生态中, OpenSergo 紧接着会支持 Apache Dubbo 的流量路由与全链路灰度场景,同时 Sentinel 2.0 会进行服务治理全面升级,能力实现从流量防护场景升级至支持微服务治理场景。在多语言生态中,OpenSergo 后续会探索 Dubbo、Kratos、CloudWeGo 以及 Mesh 等更多生态的治理能力支持与覆盖,与企业与社区共建微服务治理的最佳实践。

image

OpenSergo 社区现在处于高速发展阶段,从微服务治理标准定义,到统一控制面 (control plane) 的实现,再到 Java/Go/C++/Rust 等多语言 SDK 与治理功能的实现,再到各个微服务生态的整合与落地、最佳实践,都还有大量的演进工作,欢迎社区一起参与标准完善与代码贡献。 

image

更多推荐

企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理工程项目各模块及其功能点清单一、系统管理1、数据字典:实现对数据字典标签的增删改查操作2、编码管理:实现对系统编码的增删改查操作3、用户管理:管理和查看用户角

MySQL数据库详解 二:数据库的高级语言和操作

文章目录1.克隆表----将数据表的数据记录生成到新的表中1.1方式一:先创建新表,再导入数据1.2方式二:创建的时候同时导入2.清空表----删除表内的所有数据2.1delete删除2.2truncate删除(重新记录)2.3创建临时表(退出数据库自动删除)3.创建外键约束----保证数据的完整性和一致性3.1MyS

UI自动化测试实践

一、设计背景随着IT行业的发展,产品愈渐复杂,web端业务及流程更加繁琐,目前UI测试仅是针对单一页面,操作量大。为了满足多页面功能及流程的需求及节省工时,设计了这款UI自动化测试程序。旨在提供接口,集成到蜗牛自动化测试框架,方便用例的设计。整个程序是基于selenium设计的。程序对selenium提供的接口进行了二

基于Java+微信小程序实现《医院管理系统小程序》

博主介绍:✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌🍅文末获取源码联系🍅👇🏻精彩专栏推荐订阅👇🏻不然下次找不到哟2022-2024年最全的计算机软件毕业设计选题

基于Java+微信小程序实现《模拟考试平台》

博主介绍:✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌🍅文末获取源码联系🍅👇🏻精彩专栏推荐订阅👇🏻不然下次找不到哟2022-2024年最全的计算机软件毕业设计选题

学习笔记-接口测试(postman、jmeter)

目录一、什么是接口测试二、前端和后端三、get请求和post请求的区别四、cookie和session五、接口测试的依据六、HTTP状态码七、通用接口用例八、postman接口测试九、Jmeter接口测试一、什么是接口测试通常做的接口测试指的是系统对外的接口,比如你需要从别的系统来获取到或者同步资源与信息,他们会提供给

华为云云耀云服务器L实例评测|宝塔一站式安装数据库MySQL+Redis教程

目录前言一、传统服务器安装数据库1.安装MySQL2.安装Redis二、云耀云服务器L安装MySQL1.云耀云服务器L实例购买2.远程登录并重置密码3.云耀云服务器L初始化宝塔面板4.宝塔面板安装数据库5.MySQL第三方登录三、云耀云服务器L安装Redis1.宝塔面板安装Redis2.Redis密码设置及第三方登录总

Linux开发工具之编辑器-vim

vim简单来说就是一款文本编辑器,用于写代码,更是一款多模式编辑器vim的基本概念vim有许多种模式,但是铁三角是以下三种模式:命令模式,插入模式,底行模式1正常/普通/命令模式(默认打开)控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入插入模式,底行模式2插入模式只有在插入模式下,才可以做文字输入,按「E

【C# 基础精讲】try-catch语句块

try-catch语句块是C#中用于异常处理的关键机制。异常是在程序执行过程中可能出现的错误或意外情况,而try-catch语句块允许您在执行代码时捕获并处理这些异常,从而保证程序的稳定性和健壮性。本文将深入探讨try-catch语句块的结构、用法和最佳实践。1.try-catch语句块的结构一个try-catch语句

打造自己的美颜应用:使用视频直播美颜sdk的步骤

当下,视频直播已经成为人们分享自己生活、技能和兴趣的流行方式。但是,随着竞争的加剧,提供高质量视频直播体验变得至关重要。其中一个重要因素是美颜效果,这已经成为吸引观众的重要因素之一。幸运的是,现在有许多视频直播美颜sdk可供开发人员使用,无需从头开始构建美颜功能。本文将详细介绍如何使用这些sdk来打造自己的美颜应用。步

【C# 基础精讲】文件流和文本处理

文件流是C#中用于进行文件读写操作的重要概念,它提供了一种逐字节或逐块访问文件内容的机制。文本处理则是指在读取和写入文件时,对文本数据进行解析、操作和转换的过程。在本文中,我们将深入探讨文件流的概念、种类以及使用方法,并介绍在文本处理过程中常见的操作和技巧。1.文件流的基本概念文件流是C#中处理文件读写的抽象,它提供了

热文推荐