vlambda博客
学习文章列表

阿里云企业级分布式应用服务(EDAS)之服务治理

1 简介

服务治理是EDAS的重要功能之一。在EDAS中,您可以对Spring Cloud、Dubbo、HSF和多语言服务应用进行治理,包括服务查询、调用链查询、离群实例摘除和服务鉴权等。

下面从发布,部署和运维,安全和可用性,应用开发这几个方面介绍下EDAD中服务治理在Spring Cloud服务下的应用。

名词解释

1) ECS:云服务器ECS(Elastic Compute Service)是一种简单高效、处理能力可弹性伸缩的计算服务。帮助您快速构建更稳定、安全的应用。

2)EDAS:企业级分布式应用服务EDAS(Enterprise Distributed Application Service)是一个应用托管和微服务管理的云原生PaaS平台,提供应用开发、部署、监控、运维等全栈式解决方案,同时支持Spring Cloud和Dubbo的微服务运行环境,助力应用轻松上云。

3)HSF:高速服务框架 HSF(High-speed Service Framework)是一款面向企业级互联网架构的分布式服务框架,以高性能网络通信框架为基础,提供了诸如服务发布与注册、服务调用、服务路由、服务鉴权、服务限流、服务降级和服务调用链路跟踪等一系列功能特性。

2 发布

2.1 金丝雀发布(K8S)

即灰度发布,对于部署在K8s集群中的Spring Cloud或Dubbo微服务应用,为了确保升级操作的安全性,可以使用金丝雀发布(即灰度发布)进行小规模验证,验证通过后再全量升级。

使用限制

  • HSF应用:不支持金丝雀发布。

  • Dubbo应用:没有使用限制。

  • Spring Cloud应用:如果应用依赖Deployment.Metadata.Name或Deployment.Metadata.Uid的功能与配置,请勿使用金丝雀发布,否则发布后该原生功能将出现异常。

发布策略:

参数 说明
首批灰度数量 首批发布的应用实例数量。右侧会显示应用当前实例数,为了保证应用稳定性,灰度实例数不能超过应用实例总数的50%。

说明 灰度分组发布后,必须手动开始剩余分批发布。

剩余批次 首批发布后,剩余的应用实例按照此处设定的批次完成分批发布。
分批间处理方式 支持以下处理方式:
  • 自动:根据间隔自动分配分批发布。间隔即剩余批次间的发布时间间隔,单位为分钟。

  • 手动:手动触发下一个批次的发布。

说明 仅当剩余批次大于1时,才会显示分批间处理方式。

批次内部署间隔 每一批次内,如果应用实例数大于1,则应用实例会按此时间间隔部署,单位为秒。

灰度规则:

页签 参数 说明
按内容灰度 协议类型
  • Spring Cloud:需要设置path。

  • Dubbo:需要选择服务和方法。

条件模式 选择同时满足下列条件和满足下列任一条件。
条件列表
  • Spring Cloud:可根据Cookie、Header或Parameter类型设置具体的参数。

  • Dubbo:根据应用实际的参数、参数值获取表达式设置。

按比例灰度 流量比例 流量会按配置的比例被转发到当前的灰度分组。

2.2 金丝雀发布(ECS集群)

前提条件

确保应用中至少包含两个实例分组,且至少两个分组下包含实例,才能进行金丝雀发布。

使用限制

  • HSF应用:不支持金丝雀发布。

  • Dubbo应用:没有使用限制。

发布策略:

参数 描述
灰度分组 进行灰度发布的实例分组。
灰度后每组批次 灰度分组发布后,其它分组中的应用实例按照设定的批次完成分批发布。
  • 当所选分组为所有分组时,会对应用下每一个分组都进行所选批次数的分批,若分组实例数小于所选批次数,则以实例数为准进行分批。

  • 当所选分组为指定分组时,会对应用下指定分组进行所选批次数的分批。

灰度后分批方式 灰度后每组批次设置为2批或2批以上时需要设置,包括自动和手动两种方式。
  • 自动:根据分批时间间隔自动分批发布。自动分批方式还需要设置分批等待时间。

    分批等待时间包含不等待和1~5分钟。

  • 手动:手动触发下一个批次的发布。

Java环境 该应用的运行环境,根据实际需求选择。

灰度规则:

页签 参数 说明
按内容灰度 协议类型
  • Spring Cloud:需要设置path。

  • Dubbo:需要选择服务和方法。

条件模式 选择同时满足下列条件和满足下列任一条件。
条件列表
  • Spring Cloud:可根据Cookie、Header或Parameter类型设置具体的参数。

  • Dubbo:根据应用实际的参数、参数值获取表达式设置。

按比例灰度 流量比例 流量会按配置的比例被转发到当前的灰度分组。

3 部署和运维

3.1 服务查询

服务详情面板包含基本信息、服务调用关系(包含服务提供者和服务消费者列表及其IP和端口信息)和元数据(包含接口元数据和Metadata元数据);


3.2 服务调用链查询

1 接口调用

用于监控应用下的接口调用详情,包括SQL调用分析、NoSQL调用分析、异常分析、错误分析、链路上下游和接口快照。

支持的框架

自动发现和监控以下Web框架和RPC框架中提供的接口:

Tomcat 7+

Jetty 8+

Resin 3.0+

Undertow 1.3+

WebLogic 11.0+

SpringBoot 1.3.0+

HSF 2.0+

Dubbo 2.5+

查看接口概览

在概览页签上可以查看目标接口的详细调用拓扑,以及请求数、响应时间、错误数和HTTP-状态码统计的时序曲线。

查看SQL和NoSQL调用分析

在SQL调用分析页签和NoSQL调用分析展示了左侧选中服务的代码段内所发起的SQL和NoSQL请求列表。借助此页签,您可以找出是哪一个SQL或NoSQL造成某个服务过慢。您还可以单击某个SQL或NoSQL中的接口快照来查看一个SQL或NoSQL执行逻辑所处的完整代码链路。

阿里云企业级分布式应用服务(EDAS)之服务治理

查看异常分析

在异常分析页签展示了左侧选中服务的代码段内所抛出的Java异常。您还可以单击某个异常中的接口快照来查看一个异常堆栈所处的完整代码链路。

阿里云企业级分布式应用服务(EDAS)之服务治理

查看错误分析

在错误分析页签展示了应用的错误和HTTP状态码统计数据。您还可以单击需要查看的TraceId,即可在新页面查看调用链路相关信息。

阿里云企业级分布式应用服务(EDAS)之服务治理

查看链路上游和链路下游的接口调用情况

链路上游和链路下游页签分别列出了应用上游(调用应用的一方)和应用下游(被应用调用的一方)的接口及其调用性能指标,包括响应时间、请求数和错误数。

在链路上游和链路下游页签上,可按需执行以下操作:

  • 在页签顶部单击全部折叠/展开,即可折叠或展开下方的所有接口。

  • 在页签顶部的搜索框内输入应用名称或接口(Span)名称的关键字,并单击搜索图标,即可筛选出符合条件的接口。

  • 单击接口信息所在的折叠面板,或者单击行末的上箭头或下箭头,即可展开或折叠该接口的性能指标信息。

阿里云企业级分布式应用服务(EDAS)之服务治理

查看接口快照

1)在接口快照页面可以看到该服务接口中的参数详情,单击TraceId可以查看调用链路和业务轨迹。

阿里云企业级分布式应用服务(EDAS)之服务治理

2)全息排查用于通过业务主键快速定位问题链路,需要和应用监控功能搭配使用。

前提条件

在 ARMS 控制台上已创建应用监控,并已在 Java 程序中挂载和启动应用监控的 Agent。详情参见为 Java 应用安装探针中关于安装 Java 探针的步骤。

1)程序中已引入 arms-sdk-1.7.1.jar。

<dependency>

<groupId>com.alibaba.arms.apm</groupId>

<artifactId>arms-sdk</artifactId>

<version>1.7.1</version>

</dependency>

2)获取 TraceId 与 RpcId

满足上述前提条件后,即可通过以下代码获取上下文的 TraceId 与 RpcId。

Span span = Tracer.builder().getSpan();

String traceId = span.getTraceId();

String rpcId = span.getRpcId();

3)打印日志

获取 TraceId 与 RpcId 后,您可以根据业务需求打印和输出业务日志。以下是包含 TraceId 与 RpcId 的样例业务日志。该日志输出到文件 /home/admin/logs/example/example.log 中,但您也可以按需将其输出到 SLS、MQ 等其他通道中。

2018-07-12 11:37:40|1e057c4015313666599651005d1201|0|username=xiao,age=22,action=login

2018-07-12 11:37:40|1e057c401531366659961005d1201|0|username=xiao,age=22,action=search

2018-07-12 11:37:40|1e057c4015313666599651005d1201|0|username=xiao,age=22,action=cart

以上每条业务日志均表示用户的一条行为轨迹。

更多请参考:https://help.aliyun.com/document_detail/74576.htm?spm=a2c4g.11186623.2.3.19241829ucIqOJ#concept-74576-zh

3.3 查看Spring Cloud应用的服务契约及变更通知

服务契约指基于OpenAPI规范的微服务接口描述,是微服务系统运行和治理的基础。您无需在应用中引入依赖,直接部署后,便可以通过服务契约在线查看微服务接口、路径等API信息,不但能查询提供的服务,还能方便的使用服务测试等功能。

背景信息

服务契约包含了以下3个主要功能:

1)API查询

查看服务提供者或消费者的重要API信息,包括方法名、参数列表、返回类型。Spring Cloud服务还支持查看请求方法、请求路径、所属类的类名等信息。

2)Swagger注解解析

作为OpenAPI规范的主要制定者,Swagger虽并非是唯一支持OpenAPI的工具,但基本也属于一种事实标准。

服务契约支持Swagger注解解析,并在控制台的服务契约页面进行展示:

  • Swagger2的注解解析(例如@ApiOperation,@ApiParam,@ApiImplicitParam),解析value值在描述列展示。

  • OpenAPI3的注解解析(例如@Operation,@Parameter),解析description值在描述列展示。

3)服务测试的前置条件

服务测试功能需要基于通过服务契约收集的服务的API信息,对服务接口或路径进行测试。

服务契约的变更通知

阿里云企业级分布式应用服务(EDAS)之服务治理

3.4 为Spring Cloud服务配置标签路由

标签路由通过标签将一个或多个服务的提供者划分到同一个分组,从而约束流量只在指定分组中流转,实现流量隔离的目的。标签路由可以作为多版本开发测试、同应用的多版本流量隔离以及A/B Testing等场景的能力基础。标签路由目前仅支持ECS集群中的应用。类似于我们的泳道

1)多版本开发场景

阿里云企业级分布式应用服务(EDAS)之服务治理

2)同应用多版本

阿里云企业级分布式应用服务(EDAS)之服务治理

3)A/B Testing

阿里云企业级分布式应用服务(EDAS)之服务治理

标签路由流程如下:

1)创建标签:为该应用新建两个分组group1和group2,将默认分组下的2个应用示例分别更换到分组group1和group2,然后分别为group1和group2分组创建标签路由中的标签。

2)创建标签路由规则:基于group1和group2的标签分别创建标签路由规则。

标签路由创建完成后,当应用B调用A时,流量会根据规则被路由到group1和group2,其它不满足group1和group2的路由规则的流量会被路由到默认分组。

3.5 无损下线Spring Cloud应用

1 概述

无损下线能够实现服务消费者无感知,保持业务连续无损。无需对应用进行任何配置、也无需在EDAS控制台进行任何操作,EDAS默认支持Spring Cloud应用无损下线。

EDAS将无损下线的流程整合在发布流程中,对应用进行停止、部署、回滚、缩容、重置等操作时,无损下线会自动执行。相对于开源的方案,EDAS无损下线具有以下优势:

分类 开源Spring Cloud EDAS
版本 使用ServiceRegistryEndpoint,需要依赖Actuator组件,且需要升级到适配的版本。 无需任何操作,无侵入地支持Spring Cloud Dalston及以上版本。
注册中心和流量损失 依赖注册中心,有些注册中心会导致流量损失。
  • ZooKeeper不存在流量损失

  • Eureka存在3s流量损失

  • Nacos存在客户端缓存,会造成最长10s的流量损失。

无需依赖任何注册中心,对于任何注册均不存在流量损失。
场景 ECS场景需要结合变更详情;K8s场景可以配合prestop接口,但是prestop接口只能配置一个动作。 ECS和K8s全部覆盖,且不影响对应用的任何操作与配置。
客户端缓存 需要权衡利弊配置合理的Ribbon缓存的刷新时间,过长会导致下线有流量损失,过短会影响性能。 增强Ribbon下线刷新机制,通过反应式响应方式主动刷新Ribbon缓存。无需关心缓存刷新。

2 无损下线实现

SAE (Serverless 应用引擎)做了两件事情,

第一,服务提供者在应用发布前,会主动向服务注册中心注销应用,并将应用标记为已下线状态,将原来停止进程阶段的注销变成了 preStop 阶段注销进程。

第二,在接收到服务消费者的请求时,首先会正常处理本次请求,并且通知服务消费者此节点已经下线,在此之后消费者收到通知后,会立即刷新自己的服务列表,在此之后服务消费者就不会再把请求发到服务提供者 B1 的实例上。

通过上面这个方案,就使得下线感知时间大大缩短,从原来的分钟级别做到准实时的,确保你的应用在下线时能够做到业务无损。


4 安全和可用性

4.1 使用离群实例摘除保障Spring Cloud应用的可用性

在微服务架构中,当服务提供者的应用实例出现异常,而服务消费者无法感知时会影响服务的正常调用,并影响消费者的服务性能甚至可用性。离群实例摘除功能会检测应用实例的可用性并进行动态调整,以保证服务成功调用,从而提升业务的稳定性和服务质量。

离群实例摘除流程如下:

  • 当应用B、C或D的某个实例异常时,系统能够检测到,并根据配置的摘除实例比例上限判断是否将对应的实例从应用中摘除。

  • 摘除实例后,A的调用请求不再被分发到B、C、D的异常实例上。

  • 按配置的恢复检测单位时间开始检测异常实例是否恢复。

  • 检测间隔随检测次数按恢复检测单位时间(默认为5分钟)线性增加,当达到设置的未恢复累计次数上限后,会按最长时间间隔持续检测异常实例是否恢复。

  • 当检测到实例恢复后,将实例重新添加到应用的实例列表中,处理调用请求。同时,将检测间隔重置为恢复检测单位时间,例如5分钟。

说明

  • 当提供者应用的异常实例数量过多(超过摘除实例比例上限)时,仅按照设置的比例摘除。

  • 当提供者应用中仅剩最后一个可用实例时,即使错误率超过配置的阈值,也不会摘除该实例。

节点在配置健康检查以后,节点里的容器是可以重新拉起的,可以做到快速对进程进行恢复。

4.2 使用服务鉴权实现Spring Cloud应用的访问控制

当您的某个微服务应用有安全要求,不希望其它所有应用都能调用时,可以对调用该应用的其它应用进行鉴权,仅允许匹配鉴权规则的应用调用。

配置服务鉴权

1)设置所有Path的鉴权

可以对Provider的所有Path设置鉴权规则,例如Provider所有Path对Consumer 1的鉴权方式设置为黑名单(拒绝调用),则Consumer 2、3的鉴权方式为白名单(允许调用)。

2)设置指定Path的鉴权

在设置所有Path的鉴权基础上,还可以设置Consumer指定Path的鉴权规则,例如按所有Path的鉴权方式,Consumer 2、3可以访问Provider的所有Path,但Provider的Path 2涉及一些核心业务或数据,不希望Consumer 2调用,可以将Path 2对Consumer 2的鉴权方式设置为黑名单(拒绝调用),则Consumer 2只能访问Provider的Path 1和Path 3。

4.3 为Spring Cloud服务配置服务降级

当您遇到业务高峰期,发现下游的服务提供者遇到性能瓶颈,甚至影响业务时。您可以通过服务降级功能,对部分的服务消费者进行降级操作,让不重要的业务方不进行真实地调用,直接返回Mock的结果,将宝贵的下游服务提供者资源保留给重要的业务调用方使用,从而提升整体服务的稳定性。

开源已有的Sentinel、Hystrix等开源的熔断降级,主要是对不稳定的弱依赖服务调用进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。熔断降级作为保护自身的手段,通常在服务消费端进行配置。

服务降级功能既支持在服务调用报错时候进行降级,同时也支持在服务调用正常时也开启,这样可以很好地保护服务提供者,将有限的资源更多地分配给关键的服务消费者。


参考:

https://help.aliyun.com/document_detail/155695.html?spm=a2c4g.11186623.6.795.cb3c76ecyctZdn