内容简介:昨天「去哪儿」开源了自研的 IM本篇分析的是核心基于 OpenResty,利用 lua 扩展 NGINX 本身的能力,增加
前言
昨天「去哪儿」开源了自研的 IM Startalk ,作为一个在 IM 领域划水了一段时间的人,也想了解下其他人是如何去考虑 IM 设计,所以就开始了源码阅读之旅。接下来会用几篇文章简单分析一下。
本篇分析的是 HTTP 负载均衡 .
基于 OpenResty 增加相关能力
核心基于 OpenResty,利用 lua 扩展 NGINX 本身的能力,增加
- 上游服务探活
- 用户鉴权
- 用户级黑白名单
- 频率限制
上游监控
使用 https://github.com/openresty/lua-resty-upstream-healthcheck 做 upstreams 的探活,并生成报告页面。
鉴权
对 /newapi/
和 /package/qtapi/
会做鉴权。
or.server.location.package.qtapi.conf
location /newapi/ {
rewrite_by_lua_file /home/work/openresry/nginx/lua_app/checks/qim/checkchains.lua;
proxy_pass http://im_http_service_api/im_http_service/newapi/;
proxy_set_header Host $host;
proxy_set_header X-Real-Scheme $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
checks/qim/checkchains.lua
中会从 HTTP Headers 中取出 qcookie
解析成一个 dict [ code
],再从 dict 中拿出 q_ckey
的值 [ code
]。 q_ckey
包含了 user
, t
, 和 key
[ code
],根据 user
的信息从 redis 中取出 hkeys
,检查 md5(hash_key + t)
和 key
是否相等,相等则认为验证通过。
从解析逻辑可以看到:
1. qcookie
的格式为 {key1}={val1};{key2}={val2}...
,即以 ;
分隔每个键值对, =
分隔键和值。
2. q_ckey
的值是一个由 base64 编码过的 {key1}={val1}&{key2}={val2}...
格式的值。
Questions:
-
ckeycheck.lua#L92
在进行 key 计算的时候,调用的是
hkeys,而不是拿出 hash value?
Learned:
用户级黑白名单
OR 也针对 /newapi/
和 /package/qtapi/
做用户级别黑白名单
处理过程大致为:
-
和同样的步骤,从
qcookie拿出user_id -
如果
user_id在 hardcode 的黑名单中,直接返回拒绝请求;如果user_id在 hardcode 的白名单,直接放行, 不会 进行频率检查。
频率限制
频率限制会以 HTTP method
, HTTP request body
, request url
三者的联合摘要作为 contentmd5
再和 RemoteAddr(IP)
连接作为 redis key 查询。
如果超过设置的 limit ,就会返回拒绝请求,否则在 redis 内加 1 并设置一个过期时间。
补充
在 NGINX 配置
中可以看到 /search/
是没有进行上面提及的校验。
这部分 location 的校验散落在各个业务上游逻辑里,例如 search 的检查: https://github.com/qunarcorp/qtalk_search/blob/master/utils/authorization.py
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 使用动态分析技术分析 Java
- 使用动态分析技术分析 Java
- 案例分析:如何进行需求分析?
- 深度分析ConcurrentHashMap原理分析
- 如何分析“数据分析师”的岗位?
- EOS源码分析(3)案例分析
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Modern PHP(中文版)
Josh Lockhart / 安道 / 中国电力出版社 / 2015-9 / 39
PHP正在重生,不过所有PHP在线教程都过时了,很难体现这一点。通过这本实用的指南,你会发现,借助面向对象、命名空间和不断增多的可重用的组件库,PHP已经成为一门功能完善的成熟语言。 本书作者Josh Lockhart是“PHP之道”的发起人,这是个受欢迎的新方案,鼓励开发者使用PHP最佳实践。Josh通过实践揭示了PHP语言的这些新特性。你会学到关于应用架构、规划、数据库、安全、测试、调试......一起来看看 《Modern PHP(中文版)》 这本书的介绍吧!