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语言中,存在一个函数的概念,有人也将其翻译为子程序。 在数学中,函数是一个完成特定功能的公式࿰…...
jmeter-问题一:关于线程组,线程数,用户数详解
文章目录 jmeter参数介绍1.线程数2.准备时长(Ramp-up)3.循环次数4.same user on each iteratio5.调度器 场景一:当你的线程组中线程数为1,循环为1场景二:当你的线程组中线程数为2,循环为1场景三:当你的线程组中线程数为1ÿ…...
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 进行测试 附:ConfigurationProperties 注解的介绍及使用 一、什么是 SDK 1. 定义:软件开发工具包 Software Development Kit 2. 用于开发特定软件或应用程序的工…...
CSS transition(过渡效果)详解
CSS过渡效果(Transition)是一种在CSS3中引入的动画效果,它允许开发者在元素状态变化时(如鼠标悬停、类更改等)平滑地改变CSS属性值,从而创建出平滑的动画效果。过渡效果可以应用于多种CSS属性,如…...
Android13多媒体框架概览
Android13多媒体框架概览 Android 多媒体框架 Android 多媒体框架旨在为 Java 服务提供可靠的接口。它是一个系统,包括多媒体应用程序、框架、OpenCore 引擎、音频/视频/输入的硬件设备,输出设备以及一些核心动态库,比如 libmedia、libmedi…...
一文读懂:MybatisPlus从入门到进阶
快速入门 简介 在项目开发中,Mybatis已经为我们简化了代码编写。 但是我们仍需要编写很多单表CURD语句,MybatisPlus可以进一步简化Mybatis。 MybatisPlus官方文档:https://www.baomidou.com/,感谢苞米豆和黑马程序员。 Mybat…...
C语言--------指针(1)
0.指针&指针变量 32位平台,指针变量是4个字节(32bit/84)--------x86 64位平台,指针变量是8个字节(64bit/88)--------x64 编号指针地址;我们平常讲的p是指针就是说p是一个指针变量; ************只要…...
Vite 下一代的前端工具链,前端开发与构建工具
一、Vite 简介 官方中文网站:Vite | 下一代的前端工具链 官方定义: Vite,下一代的前端工具链,为开发提供极速响应。 Vue3.4版本,Vue新版本使用Vite构建、开发、调试、编译。 Vite的优势 极速的服务启动 使用原生…...
【SpringBoot】FreeMarker视图渲染
目录 一、FreeMarker 简介 1.1 什么是FreeMarker? 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…...
巴尔加瓦算法图解:算法运用。
树 如果能将用户名插入到数组的正确位置就好了,这样就无需在插入后再排序。为此,有人设计了一种名为二叉查找树(binary search tree)的数据结构。 每个node的children 都不大于两个。对于其中的每个节点,左子节点的值都比它小,…...
Docker的镜像和容器的区别
1 Docker镜像 假设Linux内核是第0层,那么无论怎么运行Docker,它都是运行于内核层之上的。这个Docker镜像,是一个只读的镜像,位于第1层,它不能被修改或不能保存状态。 一个Docker镜像可以构建于另一个Docker镜像之上&…...
忘记 RAG:拥抱Agent设计,让 ChatGPT 更智能更贴近实际
RAG(检索增强生成)设计模式通常用于开发特定数据领域的基于实际情况的ChatGPT。 然而,重点主要是改进检索工具的效率,如嵌入式搜索、混合搜索和微调嵌入,而不是智能搜索。 这篇文章介绍了一种新的方法,灵感…...
利用路由懒加载和CDN分发策略,对Vue项目进行性能优化
目录 一、Vue项目 二、路由懒加载 三、CDN分发策略 四、如何对Vue项目进行性能优化 一、Vue项目 Vue是一种用于构建用户界面的JavaScript框架,它是一种渐进式框架,可以用于构建单页应用(SPA)和多页应用。Vue具有简单易学、灵…...
【Scala】1. 变量和数据类型
1. 变量和数据类型 1.1 for begining —— hello world 新建hello.scala文件,注意object名字与文件名一致。 object hello { def main(args:Array[String]): Unit { println("hello world!") } }运行后打印结果如下: hello world!Pr…...
何时以及如何选择制动电阻
制动电阻的选择是优化变频器应用的关键因素 制动电阻器在变频器中是如何工作的? 制动电阻器在 VFD 应用中的工作原理是将电机减速到驱动器设定的精确速度。它们对于电机的快速减速特别有用。制动电阻还可以将任何多余的能量馈入 VFD,以提升直流母线上的…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
