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

nginx upstream server主动健康检测模块ngx_http_upstream_check_module 使用和源码分析(下)

目录

  • 7. 实现一个UDP健康检测功能
    • 7.1 功能定义
    • 7.2 定义一个新的健康检测类型
    • 7.3 增加udp特定的健康检测需要的配置指令
      • 7.3.1 ngx_http_upstream_check_srv_conf_s结构体的扩展
      • 7.3.2 check_udp_send的实现
      • 7.3.3 check_udp_expect的实现
      • 7.3.4 16进制解码代码的实现
    • 7.4 ngx_http_upstream_check函数的修改
    • 7.5 ngx_http_upstream_check_connect_handler函数的修改
    • 7.6 ngx_http_upstream_check_udp_init函数实现
    • 7.7 ngx_http_upstream_check_udp_parse函数实现
    • 7.7 ngx_http_upstream_check_udp_reinit函数实现
    • 7.8 测试验证

本篇对ngx_http_upstream_check_module的源码进行扩展,来实现udp健康检查功能。

-关于配置和使用部分可以查看上篇:nginx upstream server主动健康检测模块ngx_http_upstream_check_module 使用和源码分析(上)
-关于源码分析部分可以查看中篇:nginx upstream server主动健康检测模块ngx_http_upstream_check_module 使用和源码分析(中)添加链接描述

7. 实现一个UDP健康检测功能

7.1 功能定义

  • 支持后端UDP请求定义
  • 支持通过nginx配置发送一个用户自定义的请求包
  • 支持通过nginx配置希望从上游服务器响应的报文内容,通过比对实际响应内容和希望的响应内容来判断上游服务器是否正常
  • 允许配置的希望响应报文内容部分匹配就认为OK
  • 允许用text字符串或者16进制编码的方式来设置请求报文内容和响应报文内容

7.2 定义一个新的健康检测类型

static ngx_check_conf_t  ngx_check_types[] = {
......{ NGX_HTTP_CHECK_UDP,ngx_string("udp"),ngx_null_string,0,ngx_http_upstream_check_send_handler,ngx_http_upstream_check_recv_handler,ngx_http_upstream_check_udp_init,ngx_http_upstream_check_udp_parse,ngx_http_upstream_check_udp_reinit,1,0 },
......
这里定义了名称为udp的新的健康检测类型,其中ngx_http_upstream_check_send_handler和ngx_http_upstream_check_recv_handler两个回调函数是复用原先的实现的,而ngx_http_upstream_check_udp_init、ngx_http_upstream_check_udp_parse和ngx_http_upstream_check_udp_reinit是需要后面重新来实现的。这几个函数的实现留待后面来阐述。其中NGX_HTTP_CHECK_UDP定义为:
	#define NGX_HTTP_CHECK_UDP                   0X0020

7.3 增加udp特定的健康检测需要的配置指令

static ngx_command_t  ngx_http_upstream_check_commands[] = {
......{ ngx_string("check_udp_send"),NGX_HTTP_UPS_CONF|NGX_CONF_TAKE1,ngx_http_upstream_check_udp_send,0,0,NULL },{ ngx_string("check_udp_expect"),NGX_HTTP_UPS_CONF|NGX_CONF_TAKE12,ngx_http_upstream_check_udp_expect,0,0,NULL },
......
}

7.3.1 ngx_http_upstream_check_srv_conf_s结构体的扩展

为了保存解析到的配置信息,需要对ngx_http_upstream_check_srv_conf_s结构体进行扩展,增加4个字段,定义如下:

struct ngx_http_upstream_check_srv_conf_s {ngx_uint_t                 port;ngx_uint_t                 fall_count;ngx_uint_t                 rise_count;ngx_msec_t                 check_interval;ngx_msec_t                 check_timeout;ngx_uint_t                 check_keepalive_requests;ngx_check_conf_t          *check_type_conf;ngx_str_t                  send;union {ngx_uint_t             return_code;ngx_uint_t             status_alive;} code;ngx_array_t               *fastcgi_params;ngx_uint_t                default_down;ngx_uint_t                unique;ngx_uint_t                udp : 1;       /* 是否udp socket */ngx_int_t                 match_part : 1; /* 是否只要部分匹配就可以了 */ngx_int_t                 match_offset; /* udp响应期望的内容从哪个字节开始匹配 */ngx_str_t                 expect;   /* udp响应的期望内容 */
};

7.3.2 check_udp_send的实现

check_udp_send配置指令用来读取准备发送到上游服务器的报文内容,格式如下:
   check_udp_send [raw:|text:]packet   
如果指定了raw格式,那么packet中的内容就是用16进制编码的报文,如果用text格式,那么packet内容就是一个普通的字符串,如果没有指定raw或者text,那么默认是text格式。下面来实现check_udp_send配置指令的解析函数ngx_http_upstream_check_udp_send函数:

static char *ngx_http_upstream_check_udp_send(ngx_conf_t *cf,ngx_command_t *cmd, void *conf)
{ngx_str_t                           *value;ngx_http_upstream_check_srv_conf_t  *ucscf;ngx_str_t                            tmp;ngx_str_t                            content;ngx_int_t                            r;value = cf->args->elts;ucscf = ngx_http_conf_get_module_srv_conf(cf,ngx_http_upstream_check_module);/* 如果是text格式,直接取text:后的字符内容即可 */if (value[1].len > 5 && ngx_strncmp(value[1].data, "text:", 5) == 0) {ucscf->send.data = value[1].data + 5;ucscf->send.len  = value[1].len - 5;} /* 如果是raw格式,则需要进行16进制的解码 */else if(value[1].len > 4 && ngx_strncmp(value[1].data, "raw:", 4) == 0) {

相关文章:

nginx upstream server主动健康检测模块ngx_http_upstream_check_module 使用和源码分析(下)

目录 7. 实现一个UDP健康检测功能7.1 功能定义7.2 定义一个新的健康检测类型7.3 增加udp特定的健康检测需要的配置指令7.3.1 ngx_http_upstream_check_srv_conf_s结构体的扩展7.3.2 check_udp_send的实现7.3.3 check_udp_expect的实现7.3.4 16进制解码代码的实现7.4 ngx_http_u…...

基于SSM的网络在线考试系统(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的网络在线考试系统(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring …...

【Flink状态管理(二)各状态初始化入口】状态初始化流程详解与源码剖析

文章目录 1. 状态初始化总流程梳理2.创建StreamOperatorStateContext3. StateInitializationContext的接口设计。4. 状态初始化举例:UDF状态初始化 在TaskManager中启动Task线程后,会调用StreamTask.invoke()方法触发当前Task中算子的执行,在…...

python+flask人口普查数据的应用研究及实现django

作为一款人口普查数据的应用研究及实现,面向的是大多数学者,软件的界面设计简洁清晰,用户可轻松掌握使用技巧。在调查之后,获得用户以下需求: (1)用户注册登录后,可进入系统解锁更多…...

C语言:函数

C语言:函数 函数的概念库函数自定义函数实参与形参return语句数组做参数声明与定义externstatic 嵌套调用 函数的概念 在C语言中,存在一个函数的概念,有人也将其翻译为子程序。 在数学中,函数是一个完成特定功能的公式&#xff0…...

jmeter-问题一:关于线程组,线程数,用户数详解

文章目录 jmeter参数介绍1.线程数2.准备时长(Ramp-up)3.循环次数4.same user on each iteratio5.调度器 场景一:当你的线程组中线程数为1,循环为1场景二:当你的线程组中线程数为2,循环为1场景三:当你的线程组中线程数为1&#xff…...

golang 通过 cgo 调用 C++ 库

思路 将 C 库包装成 C 库 -> golang 通过 cgo 调用 C 库 C 相关文件 目录列表 include/ some.h C 库头文件some_wrapper.h < 用于将 C 库包装成 C 库的头文件 lib/ libsome.a C 库 src/ some_wrapper.cpp < 用于将 C 库包装成 C 库的源码文件 源码示例 some.h…...

使用 IDEA 开发一个简单易用的 SDK

目录 一、什么是 SDK 二、为什么要开发 SDK 三、开发 SDK 的详细步骤 四、导入 SDK 进行测试 附&#xff1a;ConfigurationProperties 注解的介绍及使用 一、什么是 SDK 1. 定义&#xff1a;软件开发工具包 Software Development Kit 2. 用于开发特定软件或应用程序的工…...

CSS transition(过渡效果)详解

CSS过渡效果&#xff08;Transition&#xff09;是一种在CSS3中引入的动画效果&#xff0c;它允许开发者在元素状态变化时&#xff08;如鼠标悬停、类更改等&#xff09;平滑地改变CSS属性值&#xff0c;从而创建出平滑的动画效果。过渡效果可以应用于多种CSS属性&#xff0c;如…...

Android13多媒体框架概览

Android13多媒体框架概览 Android 多媒体框架 Android 多媒体框架旨在为 Java 服务提供可靠的接口。它是一个系统&#xff0c;包括多媒体应用程序、框架、OpenCore 引擎、音频/视频/输入的硬件设备&#xff0c;输出设备以及一些核心动态库&#xff0c;比如 libmedia、libmedi…...

一文读懂:MybatisPlus从入门到进阶

快速入门 简介 在项目开发中&#xff0c;Mybatis已经为我们简化了代码编写。 但是我们仍需要编写很多单表CURD语句&#xff0c;MybatisPlus可以进一步简化Mybatis。 MybatisPlus官方文档&#xff1a;https://www.baomidou.com/&#xff0c;感谢苞米豆和黑马程序员。 Mybat…...

C语言--------指针(1)

0.指针&指针变量 32位平台&#xff0c;指针变量是4个字节&#xff08;32bit/84)--------x86 64位平台&#xff0c;指针变量是8个字节&#xff08;64bit/88)--------x64 编号指针地址&#xff1b;我们平常讲的p是指针就是说p是一个指针变量&#xff1b; ************只要…...

Vite 下一代的前端工具链,前端开发与构建工具

一、Vite 简介 官方中文网站&#xff1a;Vite | 下一代的前端工具链 官方定义&#xff1a; Vite&#xff0c;下一代的前端工具链&#xff0c;为开发提供极速响应。 Vue3.4版本&#xff0c;Vue新版本使用Vite构建、开发、调试、编译。 Vite的优势 极速的服务启动 使用原生…...

【SpringBoot】FreeMarker视图渲染

目录 一、FreeMarker 简介 1.1 什么是FreeMarker&#xff1f; 1.2 Freemarker模板组成部分 1.3 为什么要使用FreeMarker 二、Springboot集成FreeMarker 2.1 配置 2.2 数据类型 2.2.1 字符串 2.2.2 数值 2.2.3 布尔值 2.2.4 日期 2.3 常见指令 2.3.2 assign 2.3…...

巴尔加瓦算法图解:算法运用。

树 如果能将用户名插入到数组的正确位置就好了&#xff0c;这样就无需在插入后再排序。为此&#xff0c;有人设计了一种名为二叉查找树(binary search tree)的数据结构。 每个node的children 都不大于两个。对于其中的每个节点&#xff0c;左子节点的值都比它小&#xff0c;…...

Docker的镜像和容器的区别

1 Docker镜像 假设Linux内核是第0层&#xff0c;那么无论怎么运行Docker&#xff0c;它都是运行于内核层之上的。这个Docker镜像&#xff0c;是一个只读的镜像&#xff0c;位于第1层&#xff0c;它不能被修改或不能保存状态。 一个Docker镜像可以构建于另一个Docker镜像之上&…...

忘记 RAG:拥抱Agent设计,让 ChatGPT 更智能更贴近实际

RAG&#xff08;检索增强生成&#xff09;设计模式通常用于开发特定数据领域的基于实际情况的ChatGPT。 然而&#xff0c;重点主要是改进检索工具的效率&#xff0c;如嵌入式搜索、混合搜索和微调嵌入&#xff0c;而不是智能搜索。 这篇文章介绍了一种新的方法&#xff0c;灵感…...

利用路由懒加载和CDN分发策略,对Vue项目进行性能优化

目录 一、Vue项目 二、路由懒加载 三、CDN分发策略 四、如何对Vue项目进行性能优化 一、Vue项目 Vue是一种用于构建用户界面的JavaScript框架&#xff0c;它是一种渐进式框架&#xff0c;可以用于构建单页应用&#xff08;SPA&#xff09;和多页应用。Vue具有简单易学、灵…...

【Scala】1. 变量和数据类型

1. 变量和数据类型 1.1 for begining —— hello world 新建hello.scala文件&#xff0c;注意object名字与文件名一致。 object hello { def main(args:Array[String]): Unit { println("hello world!") } }运行后打印结果如下&#xff1a; hello world!Pr…...

何时以及如何选择制动电阻

制动电阻的选择是优化变频器应用的关键因素 制动电阻器在变频器中是如何工作的&#xff1f; 制动电阻器在 VFD 应用中的工作原理是将电机减速到驱动器设定的精确速度。它们对于电机的快速减速特别有用。制动电阻还可以将任何多余的能量馈入 VFD&#xff0c;以提升直流母线上的…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...