安卓demo源码分享下载网站?安卓源码下载地址

大家好,感谢邀请,今天来为大家分享一下安卓demo源码分享下载网站的问题,以及和安卓源码下载地址的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!

01全链路灰度背景介绍

发布新版本时,为了有效、谨慎地验证新版本代码逻辑的正确性,通常会采用灰度发布,从而达到减小第一次变更影响面的目的。

举个例子,应用的集合中可能会包含交易中心、商品中心、库存中心等多个模块。在一次新版本发布的过程中,可能有feature既修改了交易中心,又修改了商品中心。为了验证新版本的正确性,需要让灰度的流量到达交易中心和商品中心的灰度版本,串联起来才能有效验证新版本的正确性,因此需要全链路灰度。

如上图,流量从入口应用进来之后,如果被识别成灰度流量,则它不仅会去往交易中心的灰度,也会去往商品中心的灰度。如果库存中心有灰度,也会去库存中心的灰度;如果没有,则会降级到库存中心的基线环境。

假设有一个网关,客户端可以从iOS、安卓或H5对网关进行访问,在访问过程中,会给参数加上header(http协议),header头里包含用户ID信息。后端分为A、B、C三个模块,比如发布了新功能,需要更新A和C两个应用模块,A和C的灰度版本需要同时发布,而B应用没有新特性发布。为了有效地验证A和C新版本代码逻辑的正确性,我们将灰度规则设置为userID=120时去往灰度环境。因此流量从网关进来之后,先去往A的灰度环境;而后A调用B时,发现B没有灰度环境,会降级到B的基线环境;下一跳B调用C的时候,发现C存在灰度环境,又重新回到C的灰度环境,以此实现全链路的灰度发布。

上述全链路灰度发布的过程可以有效验证A和C两个应用的新版本组合在一起时的有效性,只有可控范围内的流量参与到灰度环境,可以有效验证新版本的正确性,避免因为新版本的业务逻辑错误造成比较重大的损失或业务故障。

以上为RPC层的全链路灰度。

当链路请求中存在消息的时候,如何实现全链路灰度?

假设库存中心C收到一笔订单之后,会生产消息并发送到RocketMQserver中,同时由A应用来消费该消息。此时如果在过程中对消费逻辑进行了修改,则需要C应用生产的消息(灰度的消息)被A的灰度环境即RocketMQ的灰度消费者消费,才能实现灰度环境的闭环。

02消息灰度的设计与实现

消息灰度的设计中,消息的生产者如何生产灰度消息?

带上灰度标签有以下三种方式:

①如果请求在入口被识别成灰度请求,则该消息会被标记成灰度消息。

②如果节点本身属于灰度节点,且开启了流量染色,则该消息会被标记为灰度消息。

③入口处请求没有被识别成灰度流量,但消息本身的payload属于灰度流量,则该消息也会被标记成灰度消息。

消息生产者在生产的时候,可以通过在tag或user-property中加上一些字段将灰度信息附带在消息体中。但是考虑到tag包含业务逻辑语义,且每个消息只能有一个tag,因此不推荐使用tag。而user-property字段属于key-value结构,较灵活,更适用于存储消息的灰度标识。

RocketMQ的producer中提供了SendMessageHook,可以自定义逻辑,生产消息的时候可以将灰度标签存储在user-property中,消息发送到RocketMQserver的时候就包含了灰度信息。

消费者灰度复杂一些,既支持客户端过滤,也支持服务端过滤。

从图中可以看到,开源的RocketMQclient中有FilterMseeageHook能够进行逻辑处理。可以通过FilterMseeageHook将本环境不需要消费的消息直接过滤掉。正式环境和灰度环境的消费者分别使用不同的consumergroup,使其offset分开。然后在FilterMseeageHook中加入对应逻辑,即可将灰度环境中收到所有非灰度的消息过滤掉。

正式环境需要拉取所有消息以分析user-property字段,keyvalue里包含消息的环境标,若识别到灰度环境的消息,则正式环境会通过remove的方式忽略此消息,灰度环境同理。

此套方案下,正式环境和灰度环境属于两个不同的consumergroup,且他们都需要将所有消息拉取本地。比较极端的场景下,比如灰度消费者只有一台机器,但是正式环境的消费者有100台机器,则灰度环境需要承担巨大压力。另一方面,RocketMQserver服务端也需要将每条消息推送两次,也增加了服务端的压力。

客户端过滤的方式存在弊端,那么,能否通过服务端过滤来规避这些弊端?

服务端的过滤分为Tag过滤和SQL92过滤两种方式。

RocketMQ的服务端过滤包含两种过滤模式,分为Tag过滤和SQL92过滤。

Tag过滤的实现中,RocketMQ消费者向server端订阅的时候,会传递订阅信息到服务端。订阅信息为SubscribtionData,其中包含四个字段:

topictagSetexpressionType=tag:表达式的类型,这里是tag过滤,所以值为tagclientversion:此次订阅的版本号

Client会不断向server端发送心跳,默认情况下30秒一次。过程中SubscribtionData可以动态变化,如果对tagSet或表达式的类型进行过更改,则会增加clientversion的值。服务端收到心跳之后,发现心跳里的SubscribtionData版本号改变,意味着订阅规则也有所变化,此时会更新客户端的订阅逻辑,决定服务端过滤变化的推送。

Server端处理服务端的灰度过滤逻辑如下:

RocketMQ中有一个MessageFilter类,首先会进行consumerqueue的比对,如果匹配成功,则进行tagscode的比对。两次比对都匹配才会将消息推送到client消费者端。

以上流程的优势为避免了灰度环境拉取所有消息,能够有效减轻灰度环境消费者的负担。同时,服务端不会将所有消息都推送两遍,大大降低了服务端压力。

如果灰度信息保存在user-property字段,可以通过SQL92的方式进行过滤。

服务端ConsumerFilterManager保存了每一个topic对应的FilterDataMapByTopic,而FilterDataMapByTopic里保存了不同consumergroup对应的消费逻辑ConsumerFilterData,ConsumerFilterData里包含了consumergroup、topic、表达式以及clientversion,与客户端发送的信息非常类似,因此可以借此来过滤。

SQL92是一种可以写复杂表达式的过滤规则,除了能够实现tag过滤方式,也能基于user-property字段进行过滤。

SQL92的过滤规则如上图所示。

消费Tag为A或者Tag为B的消息可以写为:(TAGSisnotnullandTAGSin(&39;,&39;))消费user-property中version为gray的消息可以写为:(versionis&39;)消费Tag为A且user-property中version为gray的消息可以写为:(TAGSis&39;)and(versionis&39;)消费Tag为A且user-property中version为green或者blue的消息可以写为:(TAGSisnotnullandTAGSis&39;)and((versionis&39;)or(versionis&39;))

此外,实际应用场景中要实现完善的消息灰度,还有诸多需要考虑的问题:

如果消息生产逻辑是独立的线程池,如何实现灰度标的透传?常见方式为往线程池里提交任务的时候,将属于灰度的标志放到task某个字段中,在消费的时候读取task字段,重新放在threadlocal中,实现跨线程的灰度标传递。全路灰度发布的过程中出现了回滚,有一些灰度消息是否会出现没有灰度消费者的情况?消息一直没有被消费,应该怎么办?有两种选择,一种是筛选没有消费的消息,进行补偿动作;如果消息的消费逻辑没有进行较大变更,也可以容忍让基线环境消费灰度消息。消息灰度过程中出现重复消费怎么办?可以在消费逻辑中保证幂等,或设置更精准的灰度控制逻辑。消费者的订阅行为能否支持动态变更?比如没有灰度的消费者是否可以用正式环境消费灰度消息?如果正式环境可以消费灰度消息,那么正式环境的默认行为时消费所有消息,还是只消费正式环境的消息?如何实现自定义的消息灰度逻辑?比如流量刚进来的时候,并没有被识别为灰度流量,但是在发送过程中发现消息里有一些特殊的逻辑,正好命中了灰度规则,则需要将其标记为一条灰度规则。此时如何做自定义的灰度逻辑?假设正式环境能够消费灰度的消息,过程中如果灰度的消费者启动了,正式环境能否自动探测是否需要消费灰度?实现这一点可以避免重复消费,同时又能解决发布上下游有联动的情况。

03MSE全链路灰度最佳实践

阿里云的微服引擎MSE的全链路灰度最佳实践如上图:name=xiaoming属于灰度流量,进行规则配置后流量经过A的灰度环境再到B的基线环境再到C的灰度环境,C产生的灰度消息可以被RocketMQServer接收,同时准确推送到A的灰度环境,实现闭环。

只要基于开源标准的方式开发,接入使用MSE就不需要修改任何代码,业务无侵入/无感知,而且零升级成本,完全不需要改变现有的业务架构。主要通过OneJavaAgent方式实现,通过JavaAgent进行字节码的增强,使消息的生产者和消费者在开源RocketMQ的发送行为和消费行为自动注入灰度相关字节码,业务部署以后即可自动attach上JavaAgent,无需修改任何逻辑就能完成消息灰度。

上图中,消息生产者挂载上JavaAgent之后,agent会自动修改发送消息的逻辑。如果识别到消息属于灰度流量,会自动将消息加上灰度标,发送到消息服务端。消息消费者在启动过程中识别到灰度环境,会自动通过JavaAgent修改consumergroup,而且发送订阅规则时会自动订阅只消费灰度的消息。消息的服务端会对过滤的规则进行识别和匹配,以保证只有灰度消息会推送给灰度消费者。

接入微服务引擎MSE后,所有对于消息灰度的操作可直接在控制台上完成。用户只需在MSE控制台进行治理规则的配置,即可自动通过配置中心给消费者推送消费规则,使消费者可以动态变更消费行为而完成消息灰度的完整过程。过程中无需修改任何代码,只需要接入JavaAgent即可实现全部功能。

使用步骤如下:在MSE的应用列表页选择对应的应用,开启消息灰度,配置基线环境和需要忽略的标签,即可使用消息的灰度。

点击链接可查看更多相关信息:

help.aliyun.com/document_de…

接入MSE后,Demo的效果为:A应用的灰度环境只会消费灰度消息,基线环境只会消费基线消息。

上图为Demo效果。左边为基线环境,只会消费基线的应用生产出来的消息,后续A调B调C的过程中也只会在基线的环境。右边日志是A的灰度环境,消费的消息用C的灰度环境生产出来。往后调用A调B调C的过程中,A是灰度环境,调用B的时候,因B只有基线环境,所以是流量消息只到B的基线环境,最后到达C的灰度环境。消费消息的时候,能够继续带上消息的灰度标往下透传并走到正确路径上。

Demo源码下载地址:

github.com/aliyun/alib…

本文作者:肖京,SpringCloudAlibabaPMC,阿里云智能技术专家。

关于安卓demo源码分享下载网站和安卓源码下载地址的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平