Dubbo 环境隔离

news2024/11/15 12:44:51

通过标签实现流量隔离环境(灰度、多套开发环境等)

无论是在日常开发测试环境,还是在预发生产环境,我们经常都会遇到流量隔离环境的需求。

  • 在日常开发中,为了避免开发测试过程中互相干扰,我们有搭建多套独立测试环境的需求,但通过搭建物理集群的方式成本非常高且不够灵活
  • 在生产发布过程中,为了保障新版本得到充分的验证,我们需要搭建一套完全隔离的线上灰度环境用来部署新版本服务,线上灰度环境能完全模拟生产运行情况,但只有固定的带有特定标记的线上流量会被导流到灰度环境,充分验证新版本的同时将线上变更风险降到最低。

利用 Dubbo 提供的标签路由能力,可以非常灵活的实现流量隔离能力。可以单独为集群中的某一个或多个应用划分隔离环境,也可以为整个微服务集群划分隔离环境;可以在部署态静态的标记隔离环境,也可以在运行态通过规则动态的隔离出一部分机器环境。

注意:标签路由是一套严格隔离的流量体系,对于同一个应用而言,一旦打了标签则这部分地址子集就被隔离出来,只有带有对应标签的请求流量可以访问这个地址子集,这部分地址不再接收没有标签或者具有不同标签的流量。举个例子,如果我们将一个应用进行打标,打标后划分为 tag-a、tag-b、无 tag 三个地址子集,则访问这个应用的流量,要么路由到 tag-a (当请求上下文 dubbo.tag=tag-a),要么路由到 tag-b (dubbo.tag=tag-b),或者路由到无 tag 的地址子集 (dubbo.tag 未设置),不会出现混调的情况。

开始之前

  • 部署 Shop 商城项目
  • 部署并打开 Dubbo Admin

任务详情

我们决定为商城系统建立一套完整的线上灰度验证环境,灰度环境和线上环境共享一套物理集群,需要我们通过 Dubbo 标签路由从逻辑上完全隔离出一套环境,做到灰度流量和线上流量互不干扰。

为商城搭建一套完全隔离的灰度环境

首先,为 User、Detail、Comment、Order 几个应用都部署灰度环境实例,我们为这部分实例都带有 env=gray 的环境标。部署可以通过以下命令快速完成

kubectl apply -f https://raw.githubusercontent.com/apache/dubbo-samples/master/10-task/dubbo-samples-shop/deploy/Gray.yml

接下来,我们开始为几个应用分别增加标签规则,将刚刚部署的实例从普通流量实例隔离出来。

操作步骤
  1. 打开 Dubbo Admin 控制台
  2. 在左侧导航栏选择【服务治理】>【标签路由】
  3. 点击 “创建”,输入 shop-detail 和流量隔离条件保存即可;重复为 shop-commentshop-order 创建相同的隔离规则。

以上规则为每个应用隔离出了一套独立的灰度环境,所有带有 env=gray 的标签都属于灰度环境。等待一小会确保规则下发完成,接下来就可以验证灰度流量在隔离环境中运行。

为了模拟灰度流量,我们为商城示例首页设置了一个 Login To Gray 的入口来模拟从灰度环境进入商城的流量,在真实环境中这可以通过在入口网关根据某些规则识别流量并自动打标实现。

通过 Login To Gray 登录后,之后所有请求 Detail、Comment、Order、User 服务的流量都会自动带有 dubbo.tag=gray 的标识,Dubbo 标签路由组件会识别这个标识,并将流量路由到刚才圈定的灰度环境(即所有 env=gray 的实例)。系统运行效果如下:

规则详解

我们需要通过 Admin 为 shop-detailshop-commentshop-ordershop-user 四个应用分别设置标签归组规则,以 shop-detail 为例:

规则 key :shop-detail

规则体

configVersion: v3.0
force: true
enabled: true
key: shop-detail
tags:
  - name: gray
    match:
      - key: env
        value:
          exact: gray

其中,name 为灰度环境的流量匹配条件,只有请求上下文中带有 dubbo.tag=gray 的流量才会被转发到隔离环境地址子集。请求上下文可通过 RpcContext.getClientAttachment().setAttachment("dubbo.tag", "gray") 传递。

name: gray

match 指定了地址子集筛选条件,示例中我们匹配了所有地址 URL 中带有 env=gray 标签的地址列表(商城示例中 v2 版本部署的实例都带已经被打上这个标签)。

match:
  - key: env
    value:
      exact: gray

force 指定了是否允许流量跳出灰度隔离环境,这决定了某个服务发现灰度隔离环境没有可用地址时的行为,默认值为 false 表示会 fallback 到不属于任何隔离环境 (不带标签) 的普通地址集(不会 fallback 到任何已经归属其他隔离环境的 ip 地址)。示例中设置 froce: true 表示当灰度环境地址子集为空时,服务调用失败(No provider exception)。

force: true

清理

为了不影响其他任务效果,通过 Admin 删除或者禁用刚刚配置的流量隔离规则。

其他事项

除了示例中演示的动态环境划分,也可以在部署态指定实例所属流量标签(通过一个特殊的 key dubbo.provider.tag 实现),这样当实例启动成功后就已经被自动圈定在某个流量环境,具体配置方式可参见 标签路由 说明。

通常,dubbo.tag 流量标的传递需要依赖全链路追踪工具的帮助,Dubbo 只会负责 A-B 的点对点标签传递,示例中也是通过在每次点对点 RPC 调用前重复设置达成的传递效果,在实践中,全链路灰度往往从 tag 设置进全链路上下文后自动启动,我们只需要扩展 Dubbo Filter 将全链路工具上下文中的 tag 标签读取并设置进 Dubbo 上下文即可实现全链路在 Dubbo 中的自动传递,具体可参见 Dubbo 链路追踪集成示例。另外,除了 RPC 调用,在微服务体系的其他基础产品中也需要依赖全链路上下文保证灰度标识的传递,以保证完整的流量隔离环境。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1074648.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于AlexNet深度学习网络的智能垃圾分类系统matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、基于AlexNet深度学习网络的智能垃圾分类系统概述 4.2、基于AlexNet深度学习网络的智能垃圾分类系统主要原理 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab20…

MySQ 学习笔记

1.MySQL(老版)基础 开启MySQL服务: net start mysql mysql为安装时的名称 关闭MySQL服务: net stop mysql 注: 需管理员模式下运行Dos命令 . 打开服务窗口命令 services.msc 登录MySQL服务: mysql [-h localhost -P 3306] -u root -p****** Navicat常用快捷键 键动作CTRLG设…

C语言——文件操作_学习笔记

一、引言——为什么使用文件 如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的…

仅用61行代码,你也能从零训练大模型

本文并非基于微调训练模型,而是从头开始训练出一个全新的大语言模型的硬核教程。看完本篇,你将了解训练出一个大模型的环境准备、数据准备,生成分词,模型训练、测试模型等环节分别需要做什么。AI 小白友好~文中代码可以直接实操运…

C++ 类和对象篇(三) 空类和6个默认成员函数

目录 一、空类 1. 是什么? 2. 空类中的成员 3. 空类的大小 二、6个默认成员函数 三、 构造函数 1. 构造函数是什么? 2. 为什么C要引入构造函数? 四、析构函数 1. 析构函数是什么? 2. 为什么要有析构函数? 五、拷贝构造…

硬件信号协议UART是干啥的?

UART协议是电子传输中一种常见的信号协议,通常只需要三根信号线就可以完成数据的收发,分别是TX,RX,GND。 UART(universal asynchronous receiver transmitter),是通用异步收发器,因为是异步,所以…

312.戳气球

将戳气球转换到添加气球&#xff0c;记忆搜索slove(i,j)&#xff1a;在开区间(i,j)全部填满气球得到的最多硬币数&#xff0c;两端val[i]、val[j] class Solution { public:vector<vector<int>> ans;vector<int> val;int slove(int left,int right){if(left&…

分布式存储系统如何应对SSD硬盘UNC坏块可靠性问题?

Uncorrectable Bit Errors&#xff08;UNC&#xff09;&#xff0c;也有时候叫做Media Error&#xff08;介质错误&#xff09;是指在闪存设备中出现的无法修复的位错误。Media Error的产生意味着即使硬盘自身已经用尽了所有容错手段&#xff08;如LDPC解码&#xff0c;retry等…

75.颜色分类

原地排序&#xff1a;空间复杂度为1 class Solution { public:void sortColors(vector<int>& nums) {if(0){//法一&#xff1a;单指针两个遍历int nnums.size();int ptr0;for(int i0;i<n;i){if(nums[i]0){swap(nums[i],nums[ptr]);ptr;}}for(int iptr;i<n;i){…

win11安装双系统Ubuntu的坎坷记录

之前一直装的都是在一个硬盘中&#xff0c;这是是两块盘。 我的电脑是惠普暗影精灵8Pro 一 安装前的准备工作 1.1 记得先关闭&#xff0c;Bitlocker 输入wins&#xff0c;搜索框输入&#xff1a;设备加密设置 1.2 BIOS设置 &#xff08;惠普这电脑是开机时按 F10&#xff0…

断点测试怎么做,一文教你用Charles 工具做好接口测试!

在测试工作过程中&#xff0c;我们经常会在程序的某一行或者某一环节设置断点&#xff0c;在程序请求的过程中&#xff0c;修改断点处的参数、请求或者响应&#xff0c;这就是所谓的断点测试。这类断点测试主要用于接口测试。 断点测试可以通过查看接口返回数据可以方便定位是前…

015-衍生版本开发

衍生版本开发 文章目录 衍生版本开发项目介绍衍生版本开发波形分析设置CPU 亲缘性 总结 关键字&#xff1a; Qt、 Qml、 关键字3、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Object Language&#…

【Linux】基本指令-入门级文件操作(一)

目录 前言 ⭕linux的树状文件结构 ⭕绝对路径和相对路径 ⭕当前路径和上级路径 ⭕隐藏文件 基本指令&#xff08;重点&#xff09; 1 pwd 指令 2 mkdir 指令 3 touch 指令 4 ls 指令 4.1 ls只加选项不加文件/目录名&#xff0c;默认查看当前目录下的文件 4.1.1 ls -a…

360 G800行车记录仪,不使用降压线如何开机,8芯插头的定义。

G800记录仪的插头是这样的&#xff0c;图中标出了线的颜色。其中红色为常电V&#xff0c;黑色为GND负极&#xff0c;黄色为ACC受车是否启动控制。 这个记录仪原装的电源线没有降压功能&#xff0c;所以这里的V是12V。 记录仪内部有电源板&#xff0c;负责将12V降压为5V。 如果…

CSS盒子定位的扩张

定位的扩展 绝对定位&#xff08;固定定位&#xff09;会完全压住盒子 浮动元素不会压住下面标准流的文字&#xff0c;而绝对定位或固定位会压住下面标准流的所有内容 如果一个盒子既有向左又有向右&#xff0c;则执行左&#xff0c;同理执行上 显示隐藏 display: none&…

Tasmota系统之MQTT配置和使用篇

Tasmota系统之MQTT配置和使用篇 &#x1f6a9;相关篇《ESP32/ESP8266在线刷写Sonoff Tasmota固件以及配置简要》&#x1f4cc;《Tasmota系统之外设配置》&#x1f4cd;Tasmota官方对MQTT功能使用介绍&#xff1a;https://tasmota.github.io/docs/MQTT/ &#x1f6e0;MQTT本地化…

消息队列 Kafka

Kafka Kafka 是一个分布式的基于发布/订阅模式的消息队列&#xff08;MQ&#xff0c;Message Queue&#xff09;&#xff0c;主要应用于大数据实时处理领域 为什么使用消息队列MQ 在高并发环境下&#xff0c;同步请求来不及处理会发生堵塞&#xff0c;从而触发too many conne…

团队协作中如何处理ConflictingBeanDefinitionException异常

&#x1f47c; 前言 当使用Spring框架进行Java应用程序开发时&#xff0c;可能会遇到ConflictingBeanDefinitionException异常。 如&#xff1a; org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name ‘xxxBean’ …

Spring5应用之AOP注解编程

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言开发…

2.1 Qemu系统模拟:简介

目录 1 后端/加速器2 特性简介3 运行 1 后端/加速器 系统模拟主要用于在host设备上运行guest OSQEMU支持多种hypervisors,同时也支持JIT模拟方案&#xff08;TCG&#xff09; 例如从上表我们可以看出&#xff0c;运行在x86硬件上的Linux系统支持KVM,Xen,TCG 2 特性简介 提供…