铁匠 铁匠
首页
golang
java
架构
常用算法
  • Java
  • nginx
  • 系统运维
  • 系统安全
  • mysql
  • redis
参考文档
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

铁匠

不予评判的专注当下
首页
golang
java
架构
常用算法
  • Java
  • nginx
  • 系统运维
  • 系统安全
  • mysql
  • redis
参考文档
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 概览

  • 设计模式

  • 性能优化

  • 分布式

  • 网关

    • openresty

      • OpenResty从入门到开发一个网关服务
        • 简介
        • 入门教程
        • 网关服务开发
          • 整体架构
          • 源码解析
          • 运行测试
          • todo
      • openresty 测试框架 test::nginx 安装
  • 流量治理

  • 数据治理

  • 云原生

  • 架构
  • 网关
  • openresty
FengJianxin
2020-02-23
目录

OpenResty从入门到开发一个网关服务

原文连接:https://blog.fengjx.com/openresty/gateway/ (opens new window)

# 简介

OpenResty(也称为 ngx_openresty)是一个全功能的 Web 应用服务器。它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项。

通过揉和众多设计良好的 Nginx 模块,OpenResty 有效地把 Nginx 服务器转变为一个强大的 Web 应用服务器,基于它开发人员可以使用 Lua 编程语言对 Nginx 核心以及现有的各种 Nginx C 模块进行脚本编程,构建出可以处理一万以上并发请求的极端高性能的 Web 应用。

ngx_openresty 目前有两大应用目标:

  1. 通用目的的 web 应用服务器。在这个目标下,现有的 web 应用技术都可以算是和 OpenResty 或多或少有些类似,比如 Nodejs, PHP 等等。ngx_openresty 的性能(包括内存使用和 CPU 效率)算是最大的卖点之一。
  2. Nginx 的脚本扩展编程,用于构建灵活的 Web 应用网关和 Web 应用防火墙。有些类似的是 NetScaler。其优势在于 Lua 编程带来的巨大灵活性。

引用自:OpenResty最佳实践 (opens new window)

# 入门教程

  • OpenResty 最佳实践 (opens new window)
  • 跟我学OpenResty(Nginx+Lua)开发 (opens new window)

目前已经有大佬写了很完整的教程,没有必要重复造轮子了,我觉得这两个是最好的。更多openresty相关资料可以看这里https://blog.fengjx.com/awesome/#lua-openresty (opens new window)

# 网关服务开发

# 整体架构

整体架构

服务启动时,将自己的节点信息注册到etcd,包括:服务名称、ip、端口

网关服务从etcd监听服务节点信息变更,保存到缓存中,从客户端请求的url中提取服务名称,通过服务名称查找节点信息,将请求转发到后端服务

关于etcd的使用,这里不再阐述

url规范

  1. 对外api前缀:/open/api/service_name/**,后端服务路由:/open/api/**
  2. 对内api前缀:/inner/api/service_name/**,后端服务路由:/**

例如/open/api/user/fav会转发到user服务的/open/api/fav接口;/inner/api/user/info会转发到user服务的/info接口。通过url规范我们就能很轻易的做api鉴权,而不需要将对外api和对内api部署成2个服务(当然也要考虑实际情况,是否符合实际项目要求)。

# 源码解析

github: https://github.com/tech-microworld/ws-cloud-gateway (opens new window) (tag v0.1)

  • init_by_lua_file "lua/init.lua"

    初始化项目配置

  • init_worker_by_lua_file "lua/init_worker.lua"

    初始化服务发现组件,监听服务节点变更信息

  • rewrite_by_lua_file 'lua/rewrite.lua'

    1. 生成requestId,方便链路跟踪和问题排查
    2. 解析请求服务名称
    3. 重写后端请求url,去掉服务名
  • access_by_lua_file 'lua/gateway.lua'

    通过服务发现组件查询服务节点信息

  • balancer_by_lua_file 'lua/server_rr.lua'

    通过查询到的节点信息,轮训其中一个节点,将请求转发到后端服务

  • user.conf

    模拟用户服务

  • auth.conf

    模拟认证服务

# 运行测试

安装openresty: http://openresty.org/cn/installation.html (opens new window)

启动服务

git clone git@github.com:tech-microworld/ws-cloud-gateway.git
cd ws-cloud-gateway
# 切换到 tag v0.1
git checkout -b v0.1 v0.1
# -g 'daemon off;是在前台运行,如果想后台运行可以去掉
openresty -p `pwd` -c conf/nginx.conf -g 'daemon off;'
1
2
3
4
5
6

向etcd注册节点信息,当然实际情况是在服务启动的时候自动注册的,这里为了测试,手动模拟的服务注册过程

# 注册user服务
etcdctl put /micros/service/user/127.0.0.1:1024 1
etcdctl put /micros/service/user/127.0.0.1:1025 1

# 注册auth服务
etcdctl put /micros/service/auth/127.0.0.1:1026 1
etcdctl put /micros/service/auth/127.0.0.1:1027 1
1
2
3
4
5
6
7

发送http请求

# 测试auth服务
curl http://localhost:10000/open/api/auth/login
curl http://localhost:10000/inner/api/auth/has-login

# 测试user服务
curl http://localhost:10000/inner/api/user/fav
curl http://localhost:10000/inner/api/user/info
1
2
3
4
5
6
7

# todo

  • [x] 服务发现,动态路由
  • [x] 自动生成requestId,方便链路跟踪
  • [ ] 动态ip防火墙
  • [ ] 限流器
  • [ ] 用户登录认证
  • [ ] 接口协议加解密
#openresty#网关#微服务
Last Updated: 2024/04/23, 01:30:37
zookeeper经典使用场景
openresty 测试框架 test::nginx 安装

← zookeeper经典使用场景 openresty 测试框架 test::nginx 安装→

最近更新
01
go-kit学习指南 - 多协议支持
04-19
02
go-kit学习指南 - 中间件
04-19
03
go-kit开发微服务 - 服务注册与发现
04-19
更多文章>
Theme by Vdoing | Copyright © 2016-2024 铁匠 | 粤ICP备15021633号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式