自更新参数web接口预热工具

news2025/1/21 12:55:56

痛点

日常上线流程中经常需要对接口进行预热,因为服务器每次启动后都有一定次数访问失败,如果不处理将此请求直接抛出,会降低用户体验。当服务器数量较少时,我们可以在发布机器后,待机器启动使用本地hosts更改IP,请求对应服务器接口看(1.刷新接口,2.校验返回数据)

然而当服务器数量较多时,这样的验证过程非常麻烦,每次需要修改完hosts,再去ping一下看看修改成功没,再去请求接口,整个集群只能测试几台机器,不能完全覆盖,主要存在两个问题:

  1. 可能存在上线后有机器没起来等问题,对于数据的校验不够完善,只能看看大致返回的量,看不出具体缺失数据。
  2. 还有接口请求数据不够全面,都是使用很早以前的访问参数,如用户pin,经纬度,活动ID,版本号,客户端等,不能及时更新。

公司内部其实有很多预热工具,但都是基于固定参数的形式,类似于postman使用一套参数反复请求刷新

预热类型分为内部预热和外部预热

image-20230513222042998

由此想做自动预热和报文对比,减少人为干预成本,提高覆盖率,采用外部+内部预热的方式:最大程度减少对本地代码的入侵,同时还能全面覆盖服务器,并使用最新参数刷新接口。

下面是自更新参数预热工具的交互流程图

image.png

服务端配置:

这里开发了预热注解,在需要的地方加上注解,这里会拦截请求里的body+indexRequest参数,通过本地Cache缓存请求间隔次数,每隔一个小时保存一次,参数内容保存到本地缓存中,服务端不做多版本保存,每小时动态覆盖,再加上zk开关进行判断。

/**
 * 服务预热的切面
 * @author 
 * @date 
 */
@Component
@Aspect
public class StartMockAspect {

    /** */
    private static final Logger logger = LoggerFactory.getLogger(StartMockAspect.class);
    /** */
    public static final String BODY = "body";
    /** */
    public static final String INDEX_REQUEST = "indexRequest";

    /** */
    @Resource
    private ZkConfigManager zkConfigManager;

    /**
     * 使用注解的方式定位需要拦截的方法
     */
    @Pointcut(" @annotation(com.jd.o2o.app.common.mock.DeepHttpMock)")
    public void pointCut() {
    }

    /** */
    private static final Cache<String, Integer> NUM_CACHE = CacheBuilder.newBuilder()
            .expireAfterWrite(3600, TimeUnit.SECONDS).build();

    /**
     * @param proceedingJoinPoint
     * @return
     * @throws Throwable
     * InetAddress host = InetAddress.getLocalHost();
     */
    @Around("pointCut()")
    public Object handle(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        try {
            //配置开关
            boolean startFlag = zkConfigManager.getConfig(ZkConfigPathEnum.START_PARAMETER_ASPECT_SWITCH);
            if (Boolean.FALSE.equals(startFlag)) {
                return proceedingJoinPoint.proceed();
            }
            // 获取参数
            IndexRequest indexRequest = LocaleContextHandler.getLocaleContext().getIndexRequest();
            if (proceedingJoinPoint.getSignature() instanceof MethodSignature) {
                MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();
                Method method = methodSignature.getMethod();
                Object[] args = proceedingJoinPoint.getArgs();
                Object bodyRequest = args[0];
                DeepHttpMock monitor = method.getAnnotation(DeepHttpMock.class);
                if (monitor == null || indexRequest == null || bodyRequest == null) {
                    return proceedingJoinPoint.proceed();
                }
                if (NUM_CACHE.get(monitor.pageSource(), () -> -1) == -1) {
                    START_LOAD_REQUEST_MAP.put(monitor.pageSource(), ImmutableMap.of(BODY, bodyRequest, INDEX_REQUEST, indexRequest));
                    NUM_CACHE.put(monitor.pageSource(), 0);
                }
            }
        } catch (Exception e) {
            logger.error("StartMockAspect失败");
        }
        return proceedingJoinPoint.proceed();
    }

}

外部脚本通过特定接口访问每次缓存的一份数据

/**
     * @param host
     * @return
     */
    @RequestMapping(value = "testStartupParameters")
    @ResponseBody
    public Map<String, Object> testStartupParameters(String host) {
        return START_LOAD_REQUEST_MAP.getOrDefault(host, Collections.emptyMap());
    }

python服务

这里采用python的原因是

  1. 定时抓取参数的方式比较简单,适合用脚本开发,

  2. python能够快速完成接口请求及提供web服务,开发成本较低,

  3. 可以随时更新脚本调整代码

python共三个模块

start_parameters模块

  1. 拉取集群下所有服务器IP
  2. 根据host与IP配置的接口,拉取对应服务器上缓存的接口参数
  3. 保存所有动态URL参数内容到文件中

server_verify模块

  1. 使用保存的动态参数,自动/主动->预热触发的接口
  2. 使用保存的动态参数,进行新旧服务器接口的报文对比

web模块

  1. 提供主动预热服务操作页面
  2. 手动选择报文对比接口列表

下面分为三类处理

自动服务预热:

img

主动预热:

img

报文对比:

在这里插入图片描述
在这里插入图片描述

部分可操作界面
在这里插入图片描述

通过引用自更新参数的预热工具,相比较传统固定参数的预热工具,上线之后服务器接口性能不再出现大幅度波动,有效提高接口可用率。

start_before.sh

# 获取实例IP
function_app_ip(){
if [[ -n "$def_host_ip" ]]; then
echo ${def_host_ip}
else
echo `/sbin/ip addr sh | /bin/grep -v 'global secondary' | /bin/grep inet | /bin/grep -v inet6 | /bin/grep -v '127.0.0.1' | /bin/grep -v 'lo:' | /bin/awk '{print $2}' | /bin/awk -F'/' '{print $1}'| /usr/bin/head -n 1`
fi
}

# 执行命令
echo "开始请求预热" 
_app_ip=$(function_app_ip);
echo "操作机器IP:$_app_ip"  
echo $(date +%Y-%m-%d\ %H:%M:%S)
curl http://preheat.local/start?local=pdjhome.local\&ip=$_app_ip

这里是用来触发预热的任务,之后会通过python内部保存的参数URL来刷接口

# 服务器脚本中需要预热的访问地址
class startHandler(tornado.web.RequestHandler):
    def get(self):
        try:
            ip = self.get_argument('ip')
            local = self.get_argument('local')
            print(ip, local, "发送机器预热请求")
            # 启动线程异步执行
            thead_one = threading.Thread(target=server_verify.web_one_start, args=(ip, local))
            thead_one.start()
            self.write("发送机器预热请求")
        except Exception as e:
            print(e)
            self.write("参数错误")


application = tornado.web.Application([(r"/add", MainHandler),
                                       (r"/diff_result", diffHandler),
                                       (r"/tool", toolHandler),
                                       (r"/start", startHandler),
                                       (r"/serverDiff", PdjserviceHandler)],
                                      static_path=os.path.join(os.path.dirname(__file__), "static"), )

if __name__ == "__main__":
    application.listen(80)
    tornado.ioloop.IOLoop.instance().start()

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

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

相关文章

20230510MTCNN3

MTCNN数据制作 - 1 多任务 分类任务 回归任务 模型增加任务&#xff0c;其实就是增加输出 级联即减少了 数据量&#xff0c;又增加了 模型的精度 级联可以让网络变得越快 越好 单独来看这三个网络&#xff0c;它们的效果不会好&#xff0c;因为网络太浅了 但&#xff0c;当…

【嵌入式烧录刷写文件】-1.3-删除/修改Motorola S-record(S19/SREC/mot/SX)文件中指定地址范围内的数据

案例背景&#xff08;共6页精讲&#xff09;&#xff1a; 有如下一段S19文件&#xff0c;如何“自动”地完成地址范围0x9110-0x9113数据的删除或修改。 S0110000486578766965772056312E30352EA6 S123910058595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576775B…

t检验前世今生

1、背景 t检验是科研中非常常用的一种方法和手段&#xff0c;但是理解到位的人并不多&#xff0c;虽然这也不影响其使用。本文主要目的在于将与t检验有关的前前后后都讲明白。 2、补充知识 理解t检验&#xff0c;我们需要补充一些统计学有关的先验知识。 2.1 正态分布 概率…

【文本三剑客】SED

SED 一、sed编辑器1.2sed简介1.3sed工作流程1.4sed命令格式1.5常用选项1.6常用操作 二、sed实验2.1打印内容2.2删除行2.3替换2.4插入 一、sed编辑器 1.2sed简介 sed是一种流编辑器&#xff0c;流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。sed编辑器可…

链表详解 - C语言描述

目录 认识链表 链表的分类 链表的实现 单链表的增删查改 增操作 删操作 查操作 改操作 带头双向循环链表 认识链表 链表是一种物理存储上非连续&#xff0c;数据元素的逻辑顺序通过链表中的指针链接次序&#xff0c;实现的一种线性存储结构。链表由一系列节点(结点)组…

最火爆ChatGPT知识星球分享,开启与GPT的神奇之旅

今天给大家介绍的是一个讲解ChatGPt的知识星球&#xff0c;这个星球是专门为ChatGPT爱好者和AI绘画感兴趣的朋友们打造的。这个知识星球主题是关于ChatGPT的&#xff0c;旨在提供一个交流、学习和探索GPT的平台。 这里有一个强大的阵容&#xff0c;汇集了许多对人工智能和自然…

.Net平台下OpenGL绘制图形(2)(VS2019,Winform,C#)

本节主要讲诉图形绘制的原理&#xff0c;使用介绍和代码演示。 原理介绍 我们先来讲讲OpenGL的图形绘制。其实&#xff0c;所有的图形都是由许多个小图形连接而成的。你可以理解为是图片的像素&#xff0c;一张彩图是由很多个色彩不一的像素点组合而成。要实现色彩绚丽的图形设…

安装旧版本chrome 浏览器方法

1、下载 国内推荐下载网址&#xff1a;https://www.slimjet.com/chrome/google-chrome-old-version.php 我自己目前再用的103.0.5060.53版本&#xff0c;也可以到我网盘下载[若失效可联系我更新]。 2、安装之前&#xff0c;请先卸载干净当前版本 打开控制面板&#xff0c;找打…

挣值管理专题

挣值管理 基本思路 该方法的基本思想是应用统计学的原理&#xff0c;通过引进一个中间变量即“挣值”来帮助项目管理者分析项目成本的变动情况&#xff0c;并给出项目成本与工期相关变化的信息及对项目成本发展趋势作出预测与决策。 挣值的定义 挣值是一个表示项目“已完成作业…

Linux多路复用机制原理分析--select/poll

前言 Linux访问设备的IO模型主要有五种&#xff0c;分别是非阻塞IO模型、阻塞IO模型、IO多路复用模型、信号驱动模型以及异步IO模型。本文主要分析IO多路复用模型&#xff0c;Linux下的IO多路复用模型主要有select/poll/epoll等机制实现。 IO多路复用模型可以实现以非阻塞的方…

Dijkstra算法图解,C++实现Dijkstra算法

目录 Dijkstra算法简介数据结构抽象初始化开始计算第一轮计算第二轮计算第三轮计算第四轮计算算法总结 C实现Dijkstra算法 Dijkstra算法简介 Dijkstra算法计算是从一个顶点到其余各顶点的最短路径算法&#xff0c;解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起…

1929-2022年全球气象站点的逐日平均能见度

气象数据是我们在各项研究中都非常常用的数据&#xff0c;之前我们分享过全球范围的1929-2022年的具体到气象站点的逐日气象数据&#xff0c;包括平均气温、最高气温、最低气温、平均风速&#xff08;可查看之前的文章获取&#xff09;。 本次我们带来的是全球范围的1929-2022…

单链表的成环问题

前言&#xff1a;链表成环问题不仅考察双指针的用法&#xff0c;该问题还需要一定的数学推理和分析能力&#xff0c;看似简单的题目实则细思缜密&#xff0c;值得斟酌~ 目录 1.问题背景引入-判断链表是否成环&#xff1a; 1.1.正解&#xff1a;快慢指针 1.2 STL的集合判重 …

kubespray部署k8s 1.26集群安装指南

Kubespray 是一个自由开源的工具&#xff0c;它提供了 Ansible 剧本(playbook) 来部署和管理 Kubernetes 集群。它旨在简化跨多个节点的 Kubernetes 集群的安装过程&#xff0c;允许用户快速轻松地部署和管理生产就绪的 Kubernetes 集群。 它支持一系列操作系统&#xff0c;包…

Spring的第十五阶段:Spring的事务管理(02)

1、自定义设置回滚异常 rollbackFor和rollbackForClassName回滚的异常 /*** Transactional 表示使用通知( 启用事务 ) <br/>* rollbackFor 属性可以自定义哪些异常可以回滚事务 <br/>* rollbackForClassName 属性可以自定义哪些全类名的异常回滚事务 <br/>…

Java实现八大排序

&#x1f495;“汲取知识&#xff0c;分享快乐&#xff0c;让生命不留遗憾”&#x1f495; &#x1f386;作者&#xff1a;不能再留遗憾了&#x1f386; &#x1f43c;专栏&#xff1a;Java学习&#x1f43c; &#x1f3c0;该文章主要内容&#xff1a;直接插入排序、希尔排序、…

VMware安装Ubuntu系统

VMware安装Ubuntu系统 1.首先选择文件&#xff0c;点击新建虚拟机 2.选择自定义&#xff0c;点击下一步 3.点击下一步 4.选择稍后安装操作系统&#xff0c;点击下一步 5.选择Linus操作系统&#xff0c;版本选择Ubuntu64位&#xff0c;点击下一位 6.自己看图 7. 这里根据自…

「2023 最新」 Github、Gitlab Git 工作流「常用」 git 命令、规范以及操作总结 Rebase

Git commit 规范 关于提交信息的格式&#xff0c;可以遵循以下的规则&#xff1a; feat: 新特性&#xff0c;添加功能fix: 修改 bugrefactor: 代码重构docs: 文档修改style: 代码格式修改test: 测试用例修改chore: 其他修改, 比如构建流程, 依赖管理 Git 基础知识 当我们通过…

ThinkPHP6,视图的安装及模板渲染和变量赋值 view::fetch() ,view::assgin() ,助手函数

ThinkPHP6&#xff0c;视图的安装及模板渲染和变量赋值 tp6视图功能由\think\View类配合视图驱动&#xff08;也即模板引擎驱动&#xff09;类一起完成&#xff0c;新版仅内置了PHP原生模板引擎&#xff08;主要用于内置的异常页面输出&#xff09;&#xff0c;如果需要使用其…

mysql数据库的数据类型 -- 4

目录 数据类型 4.1&#xff1a;数据类型的分类 4.2&#xff1a;数值类型 4.3&#xff1a;字符类型 4.5&#xff1a;enum和set类型 数据类型 4.1&#xff1a;数据类型的分类 数值类型 描述 TINYINT [UNSIGNED]整数&#xff0c;占用1字节SMALLINT [UNSIGNED] 整数&#xf…