当前位置: 首页 > news >正文

3.微服务灰度发布落地实践(组件灰度增强)

前言

上一篇介绍,agent基础框架的实现,本篇主要介绍灰度标签在各种组件、协议之间续传,以及路由规则改写;从用户客户端发送请求,到用户收到后端响应信息,整个请求链路会经过各种组件,

调用链示图

  1. dubbo服务之间的的调链
    在这里插入图片描述

  2. clooud. 服务之间的调用链
    在这里插入图片描述

上面展示的组件调用链为: 用户->网关->servlet容器服务->线程池->dubbo服务或cloud服务;这仅展示某一种调用路径,实际环境可能更复杂,有经过cloud或消息队列等等,不再一一列举。

网关

网关交互相对杂复一些,单独开篇

servlet容器增强

通常web容器服务,都会实现servlet,找到适合的组件接口,

  1. 从http请求头获取灰度标签,并设置到threadLocal,

  2. 请求处理完后,清除该信息;

  3. 分析发现比较合适对HandlerAdapter(不是唯一)进行拦截:

  4. 定义插件

    public class HandlerAdapterDefine extends ClassEnhancePluginDefine {
    private static final String CLASS_INTERCEPTOR = "com.dbcat.gray.agent.mvc.HandlerAdapterInterceptor";
    @Override
    protected ClassMatch enhanceClass() {return HierarchyMatch.byHierarchyMatch("org.springframework.web.servlet.HandlerAdapter");
    }
    @Override
    public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {return new ConstructorInterceptPoint[0];
    }
    @Override
    public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {return new InstanceMethodsInterceptPoint[] {new InstanceMethodsInterceptPoint() {@Overridepublic ElementMatcher<MethodDescription> getMethodsMatcher() {return named("handle").and(takesArguments(3));}@Overridepublic String getMethodsInterceptor() {return CLASS_INTERCEPTOR;}@Overridepublic boolean isOverrideArgs() {return false;}}};
    }@Override
    public StaticMethodsInterceptPoint[] getStaticMethodsInterceptPoints() {return new StaticMethodsInterceptPoint[0];
    }
    

    }

  5. 实现灰度增强拦截

public class HandlerAdapterInterceptor implements InInterceptor, InstanceMethodsAroundInterceptor {@Overridepublic void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, MethodInterceptResult result){String routingEnv = getRoutingEnv(allArguments);this.setContext(routingEnv);CounterManager.increaseConsume(ComponentType.MVC,routingEnv);}@Overridepublic Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Object ret) {//清除threadLocal里的数据this.removeContext();return ret;}private String getRoutingEnv(Object[] allArguments){//从http 请求头或Attribute 获取灰度标签设置到threadLocalObject request =  allArguments[0];Method getHeader = ReflectUtils.getMethod(request, "getHeader", String.class);String env = (String)ReflectUtils.invokeMethod(getHeader, request, X_ENV);if(env != null && !env.trim().equals("")){return env;}Method getAttribute = ReflectUtils.getMethod(request, "getAttribute", String.class);return  (String)ReflectUtils.invokeMethod(getAttribute, request, X_ENV);}
}

这里只是介绍Servlet容器,如果项目实际使用其它类型web容器,也可以用类似的方式对其增强

线程池灰度增强

dubbo服务灰度增强

cloud 服务灰度增强

nacos 增强

未完,待续…

最后,不要脸给大家安利一款mysql监控软件: 安装方便,消耗低,可视化,傻瓜式操作,可以监控慢日志详情、cpu、内存、连接数、tps 等信息
体验演示
下载地址


http://www.mrgr.cn/news/81726.html

相关文章:

  • bash shell的条件语句
  • uniapp Native.js原生arr插件服务发送广播到uniapp页面中
  • Unity中实现人物残影效果
  • 使用 Spring Boot 实现文件上传:从配置文件中动态读取上传路径
  • sonarqube 安装及使用
  • 如何将webm格式转换成mp4?转换webm格式的几个转换方法推荐
  • CY系统环境部署说明
  • 工作流审批流程的一些概念
  • 广义线性模型(GLM)全面解析
  • Ribbon、Nacos
  • 「matplotlib」绘制图线和数据点的样式风格和颜色表大全
  • 适配器模式概述
  • Linux应用软件编程-多任务处理(线程)
  • 119.【C语言】数据结构之快速排序(调用库函数)
  • 工厂+策略模式之最佳实践(疾病报卡维护模块API设计)
  • Java编程规约
  • C++线程、并发、并行
  • 【Leetcode 热题 100】46. 全排列
  • 雷电模拟器安装LSPosed
  • 强化学习基础之贝尔曼期望方程
  • -0.4375 IEEE754表示
  • Python+Django 技术实现自动化漏洞扫描系统开发
  • 【Rust自学】7.2. 路径(Path)Pt.1:相对路径、绝对路径与pub关键字
  • Python数据可视化小项目
  • 麒麟操作系统服务架构保姆级教程(六)部署PHP环境
  • Prometheus 专栏 —— Prometheus入门介绍