【网关开发】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平 ...
随机推荐
- 浅触go中的单元测试
对于一个写好的功能模块,我们还需要对其进行单元测试,确保该模块不会出现其他bug,或者输出不是期望结果 对于一个go程序,主要设计以下命令: 执行测试 go test -v / go test 执行某 ...
- Unrecognized SSL message, plaintext connection?
报错:Unrecognized SSL message, plaintext connection? 修改:把 requestContext.setScheme(Scheme.HTTPS);修改为 r ...
- 移动端Android跟ios兼容性问题,反人类!!!
一.查询参数编码问题 我们在日常开发中,有时候会遇到拼接参数特别多的情况,那么就会导致一行代码特别长.那么为了美观呢,有的同学会进行换行处理,如下代码: 可以看到我红色框出来的地方就是经过了手动的回车 ...
- Serilog文档翻译系列(三) - 基础配置
Serilog 使用简单的 C# API 来配置日志记录.当需要外部配置时,可以(慎用)通过使用 Serilog.Settings.AppSettings 包或 Serilog.Settings.Co ...
- 通过C#在Word中插入或删除分节符
在Word中,分节符是一种强大的工具,用于将文档分成不同的部分,每个部分可以有独立的页面设置,如页边距.纸张方向.页眉和页脚等.正确使用分节符可以极大地提升文档的组织性和专业性,特别是在长文档中,需要 ...
- 欢迎加入d3shop,一个DDD实战项目
背景 整个<老肖的领域驱动设计之路>系列关于认知的核心部分已经基本闭环,但纸上得来终觉浅,还是需要通过实际操作来体会和验证我们的观点,接下来,我将通过一个实战项目来带着大家一起体验从需求到 ...
- parser.add_argument
parser.add_argument 在解析参数时,有个地方很值得注意. --dict-name,会把dict-name解析为变量dict_name.也就是说会把破折号转成下划线.
- CSS & JS Effect – Styling Select
参考 YouTube – Custom select menu - CSS only 原装 select 的缺点 这是一个原装 select design 它最大的问题是没有 spacing. bor ...
- CSS – Dimension min-content, max-content, fit-content
前言 无意间在 practice 的时候看到视频使用, 以前没有听过. 它有点像 Figma 的 hug content, 据说 CSS 2.1 也是有类似的概念, 只是没有被正式纳入 CSS 里. ...
- ts 的 declare 用途
declare namespace API { /** 新增数据集合 */ type CreateDataSet = { createdAt: string; dname: string; headI ...