# common api gateway **Repository Path**: funlake/api-gateway ## Basic Information - **Project Name**: common api gateway - **Description**: No description available - **Primary Language**: Go - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-11-25 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 安装 ##### 环境 - go1.8+ - godep `go get github.com/tools/godep` - 将项目clone至$GOPATH/src下 ##### 运行 `godep go build .` ##### 启动 `./gateway` ps : 服务监听端口可在conf目录下的app.conf修改 ##### Redis相关 - 连接 依次设置redis连接所需的环境变量`REDIS_ETC1_HOST`,`REDIS_ETC1_PORT`,`REDIS_ETC1_PASSWORD` - 路由 假设要对http://api-open-dev.etcchebao.com/xxx/yyy 注册路由 `HSET gateway:proxy zzz api-open-dev/xxx/yyy` ,意即网关设置路由为`zzz`,转发到`http://api-open-dev.etcchebao.com/xxx/yyy` - 访问 假设启动端口为8081,则访问`http://127.0.0.1:8081/zzz`,如无问题,则会转发 - acl权限控制 `HSET gateway:acl 10001_zzz true` 表示10001的用户对zzz路由有请求权限 > ps : 设置`HSET gateway:aclignore zzz true` 表示zzz路由直接穿过acl判定,无需再判断是否带了access_token > ps:没有设置acl的路由,将直接通过,如若转发的业务接口无需access_token,则用户为默认值:`__ALL__`,zzz如果无需access_token,则需`HSET gateway:acl __ALL___zzz true`配置公共访问权限, - 限流控制 `HSET gateway:ratelimit 10001_zzz '{"s" : "3,3","m" : "100,100","h" : "1000,1000","d" : "6000,6000"}'` 以上表示10001用户对于zzz路由,每秒允许最多3次请求,每分钟最多100,每小时最多1000,每天最多6000 `PS`:限流用到令牌桶算法,假设1分钟允许10次请求,则可设置一个能存10个令牌,且每隔1分钟往里再放10个令牌的令牌桶,假设1分钟内消耗多于10个令牌,则被限流。故令牌桶有两个参数,一个是大小(size),一个是每一分钟往桶里放的令牌个数(rate) 所以redis中存的"s":"3,3"意思是秒令牌桶的rate=3,size=3 - 熔断控制 `conf/app.json` 有三个设置控制熔断的配置,`upstream_timeout_second` 表示服务超时时间,以秒为单位,`upstream_timeout_limit` 表示超时几次视为熔断,`upstream_block_retry_rate`表示穿透熔断的几率,比如100,意思是有1%(1/100)的几率穿透熔断拦截,探查后端 接口是否恢复,一旦恢复,则熔断结束 - 接口合并 调用例子 `curl -d '[{"m":"GET","api":"access_token","params":"a=1"},{"m":"POST","api":"sleep","params":""}]' http://127.0.0.1:8081/merge`