【网关开发】Openresty使用cosocket API 发送http与tcp网络请求
背景
为网关提供健康检查功能时需要对节点发送http或者tcp探活请求。Openresty 提供cosocket来处理非阻塞IO。
实现
跟工程结合在一起,这里简单拼接数据结构
local function __default_check_alive(status)
return status >= 200 and status <= 299
end
local function debug_ctx()
local ctx = {
peer = {ip = '10.218.22.239', port = '8090'}, --目标机器
ahc = {
type = 'http',
timeout = 3,
check_http_send = "GET /ping HTTP/1.1\r\nHost: service_test.com\r\n\r\n", -- 发送的数据内容
},
status_check = __default_check_alive
}
return ctx
end
发送http请求
local stream_sock = ngx.socket.tcp -- 引入模块
local re_find = ngx.re.find
local function __check_http_peer(ahc, peer, status_check)
local ok
local req = ahc.check_http_send
local sock, err = stream_sock() -- 创建 TCP 的 cosocket 对象
if not sock then
ngx.log(ngx.ERR, "failed to create stream socket: " .. err)
return false, err
end
sock:settimeout(ahc.timeout * 1000) --设置超时时间
ok, err = sock:connect(peer.ip, peer.port) --建立连接
if not ok then
return false
end
local bytes, err = sock:send(req) --发送数据
if not bytes then
return false
end
local status_line, err = sock:receive() -- 接收数据
if not status_line then
if err == "timeout" then
sock:close() -- timeout errors do not close the socket.
end
return false
end
if status_check then
local from, to, err = re_find(status_line,
[[^HTTP/\d+\.\d+\s+(\d+)]], --利用正则获取status code
"joi", nil, 1)
if err then
ngx.log(ngx.ERR, "failed to parse status line: "..err)
end
if not from then
sock:close()
return false
end
local status = tonumber(status_line:sub(from, to))
if not status_check(status) then
-- ngx.log(ngx.ERR, status_line)
sock:close()
return false
end
end
sock:close()
return true
end
发送tcp请求
-- functional, check peer by tcp, returns bool indicate up or down
local function __check_tcp_peer(ahc, peer)
local ok
local sock, err = stream_sock()
if not sock then
ngx.log(ngx.ERR, "failed to create stream socket: " .. err)
return false, err
end
sock:settimeout(ahc.timeout * 1000)
ok, err = sock:connect(peer.ip, peer.port)
if not ok then
return false
end
sock:close()
return true
end
遇到的问题
API disabled in the context of init_worker_by_lua*
这是因为我使用的地方是在init_worker_by_lua阶段,这阶段是不允许使用cosocket的,除了这些阶段还有
set_by_lua、log_by_lua、header_filter_by_lua、body_filter_by_lua、init_by_lua* 都是不允许使用的
-- 修改调用
ngx.timer.at(0, function (p, self)
local ctx = down_peer_checker.debug_ctx()
ngx.log(ngx.INFO,"down_peer_checker check_peer "..tostring(down_peer_checker.check_peer(ctx)))
end)
HTTP/1.1 400 Bad Request
主要是请求字符串格式问题、
GET /ping HTTP/1.1\r\n Host: service_test.com\r\n 错误
GET /ping HTTP/1.1\r\nHost: service_test.com\r\n\r\n 正确
总结与思考
cosocket知识与参考文章:https://zhuanlan.zhihu.com/p/507329735
存在部分封装,源码地址 https://github.com/zhaoshoucheng/openresty/blob/main/pkg/lua_script/upstream/down_peer_checker.lua
转载自:https://www.cnblogs.com/zhaosc-haha/p/17069977.html
【网关开发】Openresty使用cosocket API 发送http与tcp网络请求的更多相关文章
- iOS开发--用户点击频繁,多个异步网络请求取消问题?
一.业务环境描述 当一个view同时添加两个tableView为subView的时候,两个tableView分别为mainTable和subTable. 当用户点击mainTable上的某一条数据时, ...
- Win(Phone)10开发第(3)弹,简单的Demo程序网络请求json解析列表显示
先分享一个由Json字符串直接生成解析对应的类的工具: jsonclassgenerator14 百度天气接口 下面是由一个小功能(又特么的是天气)的实现,记录下下UAP的流程和结构(其实跟之前一模一 ...
- python 学习笔记之手把手讲解如何使用原生的 urllib 发送网络请求
urllib.urlopen(url[,data[,proxies]]) : https://docs.python.org/2/library/urllib.html python 中默认自带的网络 ...
- 第三篇、微信小程序-网络请求API
wx.request(OBJECT)发起的是https请求.一个微信小程序,同时只能有5个网络请求连接. OBJECT参数说明: 效果图: net.js Page({ data:{ result:{} ...
- openresty开发系列11--openresty的api入门
openresty开发系列11--openresty的api入门 1)ngx_lua模块的hello world编辑nginx下conf配置文件nginx.conf# vi nginx.conf在se ...
- openresty开发系列1--网关API架构及选型
微服务架构在项目中的应用越来越多,我们知道在微服务架构风格中,一个大应用被拆分成为了多个小的服务系统提供出来,这些小的系统他们可以自成体系,也就是说这些小系统可以拥有自己的数据库,框架甚至语言等,这些 ...
- 微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍
微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍 一.为什么会有 API Gateway 网关 随着微服务架构的流行,很多公司把原有的单 ...
- 微服务架构学习与思考(11):开源 API 网关02-以 Java 为基础的 API 网关详细介绍
微服务架构学习与思考(11):开源 API 网关02-以 Java 为基础的 API 网关详细介绍 上一篇关于网关的文章: 微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Ngi ...
- 超越村后端开发(4:API开发)
1.users相关的api开发 1.在settings中添加APPID,SECRET 2.在apps/users/views.py内: from chaoyuecun.settings import ...
- CTP API开发之一:CTP API简介
官网下载CTP API 综合交易平台CTP(Comprehensive Transaction Platform)是由上海期货信息技术有限公司(上海期货交易所的全资子公司)开发的期货交易平台,CTP平 ...
随机推荐
- AI 视觉的应用|ZegoAvatar ⾯部表情随动技术解析
一.AI"卷"进实时互动 2021年,元宇宙概念席卷全球,国内各大厂加速赛道布局,通过元宇宙为不同的应用场景的相关内容生态进行赋能.针对"身份"." ...
- 低代码 + BI 数字化转型如何助力制造业供应链协同?
引言 在当今快速变化的商业环境中,制造业面临着前所未有的挑战和机遇.全球化竞争.消费者需求的快速变化.技术创新的加速以及不断增加的成本压力,都要求制造企业不断提高其供应链的效率和灵活性.供应链协同作为 ...
- RxJS 系列 – Error Handling Operators
前言 前几篇介绍过了 Creation Operators Filter Operators Join Creation Operators 这篇继续介绍 Error Handling Operato ...
- SpringBoot——简介&&入门
SpringBoot 简介 SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程 起步依赖 starter:SpringBoot中常见的 ...
- Windows应急响应-Auto病毒
目录 应急背景 分析样本 开启监控 感染病毒 查看监控 分析病毒行为 autorun.inf分析 2.异常连接 3.进程排查 4.启动项排查 查杀 1.先删掉autorun.inf文件 2.使用xue ...
- 墨天轮国产数据库沙龙 | 四维纵横姚延栋 :MatrixDB,All-in-One高性能时序数据库
分享嘉宾:姚延栋 北京四维纵横数据有限公司创始人.原Greenplum 北京研发中心总经理.Greenplum中国开源社区创始人.PostgreSQL中文社区常委.壹零贰肆数字基金会(非营利组织)联合 ...
- 7-11 leetcode 2619
请你编写一段代码实现一个数组方法,使任何数组都可以调用 array.last() 方法,这个方法将返回数组最后一个元素.如果数组中没有元素,则返回 -1 . ps:this 环境变量的使用 ,this ...
- 4.flask 源码解析:上下文
目录 一.flask 源码解析:上下文 1.1 上下文(application context 和 request context) 1.2 Update: 为什么要用 LocalProxy Flas ...
- 深入解析Spring AI框架:在Java应用中实现智能化交互的关键
今天我们的Spring AI源码分析主题即将结束.我已经对自己感兴趣的基本内容进行了全面的审视,并将这些分析分享给大家.如果你对这个主题感兴趣,可以阅读以下几篇文章.每篇文章都层层递进,深入探讨相关内 ...
- kotlin集合——>迭代器、区间与数列
1.迭代器 对于遍历集合元素,Kotlin 标准库支持 迭代器 的常用机制⸺对象可按顺序提供对元素的访问权限,而 不会暴露集合的底层结构.当需要逐个处理集合的所有元素(例如打印值或对其进行类似更新)时 ...