# 快速上手

# 安装openresty

http://openresty.org/cn/installation.html

# 启动服务

git clone https://github.com/tech-microworld/ws-cloud-gateway.git
cd resty-gateway
git checkout v0.1 -b v0.1
# -g 'daemon off;是在前台运行,如果想后台运行可以去掉
openresty -p `pwd` -c conf/nginx.conf -g 'daemon off;'

# 向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

# 发送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

# 请求转发规则

0.x 版本约定了url转发规则,修改路由前缀需要修改配置文件 lualib/my/config.luaopen_api_prefixinner_api_prefix 两个参数

local config = {
    test = {
        appName = "resty-gateway",
        discovery = {
            etcd = {
                http_host = "http://192.168.1.102:2379",
                etcdctl_api = "3",
                api_prefix = "/v3",
                service_register_path = "/micros/service"
            },
            open_api_prefix = "/open/api",
            inner_api_prefix = "/inner/api"
        }
    },
    prod = {}
}
  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个服务(当然也要考虑实际情况,是否符合实际项目要求)。

# 源码解析

  • 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

    模拟认证服务