轻量级接口代理网关 PGW

MIT
Lua 查看源码»
Linux
2016-09-04
小飞有点不高兴

PGW(Proxy Gateway)

Proxy Gateway基于openresty(nginx-lua-module)开发,可以作为接口网关(api gateway)使用,整合业务模块接口,微服务治理聚合,通过web配置界面,能够轻松进行代理配置管理,支持负载均衡,服务器状态检测。包括以下特性

  • 支持多域名,可以配置多个出口域名,互不干扰

  • 代理分组(服务模块),可以按照业务模块进行分组

  • 负载均衡,可以给每组(每个业务模块)代理配置多台后端服务器,PGW会自动进行负载均衡

  • 服务器监控,将down掉的服务器自动剔除,恢复以后自动加入

  • 路径配置支持正则表达式对uri进行重写,例如 /user/([0-9]+)/profile /user/profile/$1,所有访问/user/用户id/profile 都将被映射到 /user/profile/用户id

  • 集群部署,PGW配置的MySQL数据库使用同一个就能达到集群效果,在任意一台PGW服务器上进行的配置都将在所有PGW服务器上生效

  • https配置,与nginx配置一致,修改nginx.conf文件

  • 高效,反向代理能力基本和原生nginx一致

安装

cd /usr/local/openresty/nginx
git clone https://github.com/ffay/proxygateway.git

然后把/usr/local/openresty/nginx/conf/nginx.conf 用源码中的nginx.conf替换即可

worker_processes  2;

events {
    worker_connections  102400;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    lua_shared_dict cache 10m;

    #换成你的实际路径,这里将源码中src目录加入到 lua_package_path
    lua_package_path '/usr/local/openresty/nginx/proxygateway/src/?.lua;;';

    #lua_code_cache off;

    upstream servers {
      server 127.0.0.1;
      balancer_by_lua_block{
        local balancer = require "balancer"
        balancer.balancing()
      }
    }

    init_worker_by_lua_block{
        require "init"
    }

    server {
        listen  80  default_server;
        server_name localhost;

        location / {
            set $backend_host '127.0.0.1';
            set $backend_port 80;
            set $newhost '';
            set $upstream 'http://servers';
            access_by_lua_block{
                local access = require "access"
                access.dispatch()
            }
            proxy_set_header Host $newhost;
            proxy_http_version 1.1;
            proxy_pass $upstream;
        }
        error_log logs/error.log;
    }

    #将源码中的 manage.conf 路径
    include /usr/local/openresty/nginx/proxygateway/manage.conf;
}
  • 配置manage.conf

server {
    listen 8081;
    server_name localhost;
    index index.html;
    location /api/v1 {
        access_by_lua_block{
            local access = require "manage.access"
            access.checkLogin()
        }
        content_by_lua_block{
          local ctl = require "manage.controller"
          ctl.run()
        }
    }

    location /static {
        #源码中html的实际路径
        root /usr/local/openresty/nginx/proxygateway/html;
    }

    location / {
        access_by_lua_block{
            local access = require "manage.access"
            access.checkLogin()
        }
        #源码中html的实际路径
        root /usr/local/openresty/nginx/proxygateway/html;
    }
}
  • 在PGW源码中 src/config.lua 进行管理员以及MySQL相关配置

  • 在数据库中运行pgw.sql脚本

  • 启动openresty(openresty安装目录/nginx/sbin/nginx)

  • 在浏览器中打开 http://PGW的IP:8081 ,如果是集群部署,打开任意一台的PGW管理界面进行配置即可,登录即可进行域名以及分组代理等配置管理,其中添加的域名需要解析到相应PGW的ip,如果前端还有负载均衡器(例如aws或aliyun的load balancing),域名直接解析到负载均衡器ip即可

管理配置

  • 域(域名)管理,可以任意添加多个域名,默认域 localhost 在该域下的配置,直接访问IP生效,PGW通过域名进行配置隔离,每个域名下的配置互不干扰,需要将域名解析到PGW的IP

  • 服务模块,每个域名下面可以添加多个服务模块,用于将接口按业务模块进行分组

  • 后端服务器,每个服务模块下面可以配置多台后端服务器,可以为每台服务器指定权重,负载均衡时会按权重进行接口请求分发,支持http以及https代理

  • 代理路径(uri)配置,每个服务模块下可配置多个代理uri规则,配置规则类似nginx location的配置,配置实例

     Request uri      Original uri                                          说明
                /                /将所有对PGW某个域下的请求转发到后端服务器
                /u                /user将所有对PGW某个域下/u开头的请求重写成/user后转发到后端服务器,例如,请求 /u/1001 转发到后端服务器为 /user/1001
                /topic/([0-9]+)/([0-9]+)                /topic?uid=$1&tid=$2支持正则匹配,请求 /topic/1001/2002 转发到后端服务器为 /topic?uid=1001&tid=2002
/t%?tid=(.*)/topic?tid=$1支持正则匹配,Request uri中如果有 ? 出现,需要在前面加上 %,用于转义问号

所有接口映射配置必须以 / 开头,同一个域下面 Request uri 不能重复,Request uri字符串越长匹配优先级越高

演示地址

https://a.fengfei.org/ 用户名/密码 admin/admin

添加域名后,请将域名cname解析到 fengfei.org 然后可在你添加的域名下做代理配置

其中配置的一个google代理,欢迎测试 https://fengfei.org/

后续

  • 认证检测

  • 访问频率控制

  • IP黑白名单

  • 数据统计

  • 欢迎提出更多功能

的码云指数为
超过 的项目
加载中

评论(1)

小微b
小微b
学习一下

暂无资讯

暂无问答

只有IT人才能读懂的西游记(下)

五、唐王素酒送三藏 玄奘这个网络包要发出了。 太宗设朝,聚集文武,要去送行。李世民送给玄奘三个东西。 上一节说了太宗是应用层,关注保大唐江山永固,玄奘是TCP层,要通过坚定的意志到达西...

04/17 17:35
0
0
多核处理器下的快速包处理软件架构FastGate

陈首席,各位弯曲的老友们,大家好。关注弯曲多年,受益颇深。我们来自ASTRI(香港应用科技研究院),是一群热爱系统设计的大宋子民,所在的项目组专注于多核处理器下的快速包处理的软件研发...

2013/06/20 12:51
412
0
只有程序员能看懂的西游记

这是一个有关计算机网络协议的故事。 一、我佛造经传极乐 话说我佛如来为度化天下苍生,有三藏真经,可劝人为善。 就如图中所示,真经所藏之处,在于云端。佛祖所管辖之下,有四个区域Regio...

02/14 21:34
23
0
MEC技术简介

导读 MEC通常用于描述将服务推向网络边缘的概念,与雾计算等其他术语存在冲突,随着这项技术与5G、容器等基础设施技术联系在一起,其中各种混淆也越来越多。本文从电信公司的角度揭开这一技术...

2018/09/01 22:22
20
0
linux之sed命令详解

linux之sed命令详解 听语音 分步阅读 主要介绍下linux中sed命令的一些应用,sed主要用来对文件进行一些处理,比如打印,追加,删除,替换等,我这边只对使用率比较高的一些参数进行介绍 方法...

2018/05/18 10:07
16
0
自定义hive的Inputformat

项目背景: 本公司需要处理一份数据,这份数据有这样的特点,一行数据长度是1924个,一共有88个字段,且知道每个字段按顺序的长度。但是如果直接创建表的话也是行的,只不过写很复杂的正则表...

2014/08/29 10:42
837
0
详解5G:关键能力、关键技术、应用场景、网络架构、经济影响

未来,5G将渗透到未来社会的各个领域,以用户为中心构建全方位的信息生态系统。 5G,第五代移动电话行动通信标准,也称第五代移动通信技术,也是4G之后的延伸。作为新一代信息通讯发展的主要...

02/26 21:50
2
0
js代码大全5【学习参考】

JS代码判断集锦(之二) <INPUT TYPE="button" value="登录" tabindex="4"> <INPUT TYPE="button" value="注册" tabindex="4"> function trim(inputstr) //去处空格,在获取客户端录入的表单信...

2014/10/05 11:48
16
0
web前端开发必读

event.srcElement.setCapture(); event.srcElement.releaseCapture(); 事件按键 event.keyCode event.shiftKey event.altKey event.ctrlKey 事件返回值 event.returnValue 鼠标位置 event.x ...

2012/03/13 10:07
278
2

没有更多内容

加载失败,请刷新页面

返回顶部
顶部