【网关开发】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平 ...
随机推荐
- RGB、HSV和HSL颜色空间
这个文章写的很清楚了 https://zhuanlan.zhihu.com/p/67930839
- 像 Mysql 和 MongoDB 这种大型软件在设计上都是精益求精的,它们为什么选择B树,B+树这些数据结构?
为什么 MongoDB (索引)使用B-树而 Mysql 使用 B+树? B 树与 B+ 树,其比较大的特点是:B 树对于特定记录的查询,其时间复杂度更低.而 B+ 树对于范围查询则更加方便,另外 B ...
- redis zset 使用场景
前文,我们讨论过redis 的数据结构及使用场景.可参考: 参考: 总结篇4:redis 核心数据存储结构及核心业务模型实现应用场景 https://www.cnblogs.com/yizhiamum ...
- 使用 `Roslyn` 分析器和修复器对.cs源代码添加头部注释
之前写过两篇关于Roslyn源生成器生成源代码的用例,今天使用Roslyn的代码修复器CodeFixProvider实现一个cs文件头部注释的功能, 代码修复器会同时涉及到CodeFixProvide ...
- HTML & CSS – Styling Scrollbar
前言 Scrollbar 能 styling 的东西不多 (尤其是 IOS 基本上只能 display:none 而已),但有时候我们不得不 styling. 这里记入我自己在项目中修改过的 scro ...
- RxJS 系列 – Mathematical and Aggregate Operators
前言 前几篇介绍过了 Creation Operators Filtering Operators Join Creation Operators Error Handling Operators T ...
- DOM & BOM – Input File, Drag & Drop File, File Reader, Blob, ArrayBuffer, File, UTF-8 Encode/Decode, Download File
前言 之前写过 2 篇关于读写文件和二进制相关的文章 Bit, Byte, ASCII, Unicode, UTF, Base64 和 ASP.NET Core – Byte, Stream, Dir ...
- ASP.NET Core – Swagger OpenAPI (Swashbuckle)
前言 Swagger (OpenAPI) 是一套 Web API 文档规范. ASP.NET Core 有 2 个 Library 可用来实现 Swagger. Swashbuckle 和 NSwag ...
- [TK] CF1526B I Hate 1111
给定一个数,将它表示成若干个形如 \(11,111,1111\cdots\) 之类的数之和,判断有没有可行解 考虑到一种贪心,即从高位开始依次向下减去每位数字,判断还能不能减动,减不动或者没减完就报告 ...
- ARM64中的ASID地址空间标识符
1. 从ARM32到ARM64 从ARM32到ARM64不止将处理器从32位升级到了64位,还有许多性能的技术也得到了极大的提升,光是个头长了可不行啊!能耐也得跟着长啊!哈哈哈 1.1 ARM32的T ...