提交 de15a85c 编写于 作者: E eoLinker API Management

V2.0.2

上级 dcc0db4f
...@@ -73,28 +73,38 @@ GoKu API Gateway CE,支持OpenAPI与微服务管理,支持私有云部署, ...@@ -73,28 +73,38 @@ GoKu API Gateway CE,支持OpenAPI与微服务管理,支持私有云部署,
## 更新日志 ## 更新日志
#### V1.0.0(2018/4/17) #### V2.0.2(2018/5/7)
新增 修复
1. “网关概况”新增监控信息,方便监控API运行状况,包括:请求总数、成功请求数、失败请求数、每分钟实时访问次数等; 1、修复请求路径带参数时,匹配路径失败;
2. “权限控制”新增策略组,每个策略组下包括鉴权方式、IP黑白名单、流量控制三大模块; 2、修复proxy_method配置必须大写的问题,现支持不区分大小写。
3. 强化鉴权方式,包括Basic Auth、API Key、无认证;
4. 强化流量控制,支持允许访问时间段与禁止访问时间段;
5. 强化流量控制,支持设置每秒最大访问次数、每分钟最大访问次数、每小时最大访问次数、每天最大访问次数。
#### V2.0.1(2018/5/4)
优化: 优化:
1. 全面优化界面; 1. 优化网关的错误提示。
2. 优化访问性能。
其他:
1. 加入开源声明。 修复:
#### V1.0.1(2018/4/17) 1. 修复访问网关根路径时,报越界错误。
#### V2.0.0(2018/5/4)
新增:
1. 通过配置文件修改网关配置;
2. 新增全局IP黑白名单;
3. 参数新增支持json类型。
优化:
1. 架构优化,减少第三方依赖,提升网关性能;
2. 弃置mysql、redis数据库的使用,改用配置文件方式读取文件配置。
#### V1.0.3(2018/4/20)
修复: 修复:
1. 某个脚本的编码错误 1. 修复“鉴权方式”编辑页错位问题
#### V1.0.2(2018/4/19) #### V1.0.2(2018/4/19)
新增: 新增:
...@@ -107,29 +117,25 @@ GoKu API Gateway CE,支持OpenAPI与微服务管理,支持私有云部署, ...@@ -107,29 +117,25 @@ GoKu API Gateway CE,支持OpenAPI与微服务管理,支持私有云部署,
2. 修复mysql5.7环境下,sql脚本执行失败; 2. 修复mysql5.7环境下,sql脚本执行失败;
3. 修复访问网关后端服务时,请求提示错误的问题。 3. 修复访问网关后端服务时,请求提示错误的问题。
#### V1.0.3(2018/4/20 #### V1.0.1(2018/4/17
修复: 修复:
1. 修复“鉴权方式”编辑页错位问题 1. 某个脚本的编码错误
#### V2.0.0(2018/5/4) #### V1.0.0(2018/4/17)
新增: 新增:
1. 通过配置文件修改网关配置; 1. “网关概况”新增监控信息,方便监控API运行状况,包括:请求总数、成功请求数、失败请求数、每分钟实时访问次数等;
2. 新增全局IP黑白名单; 2. “权限控制”新增策略组,每个策略组下包括鉴权方式、IP黑白名单、流量控制三大模块;
3. 参数新增支持json类型。 3. 强化鉴权方式,包括Basic Auth、API Key、无认证;
4. 强化流量控制,支持允许访问时间段与禁止访问时间段;
优化: 5. 强化流量控制,支持设置每秒最大访问次数、每分钟最大访问次数、每小时最大访问次数、每天最大访问次数。
1. 架构优化,减少第三方依赖,提升网关性能;
2. 弃置mysql、redis数据库的使用,改用配置文件方式读取文件配置。
#### V2.0.1(2018/5/4)
优化: 优化:
1. 优化网关的错误提示。 1. 全面优化界面;
2. 优化访问性能。
修复 其他
1. 修复访问网关根路径时,报越界错误。 1. 加入开源声明。
\ No newline at end of file
package middleware package middleware
import ( import (
"fmt"
"net/http" "net/http"
"strings" "strings"
"goku-ce/goku" "goku-ce/goku"
...@@ -9,7 +10,7 @@ import ( ...@@ -9,7 +10,7 @@ import (
) )
func Mapping(g *goku.Goku,res http.ResponseWriter, req *http.Request) (bool,string){ func Mapping(g *goku.Goku,res http.ResponseWriter, req *http.Request) (bool,string){
url := req.RequestURI url := InterceptURL(req.RequestURI,"?")
requestURI := strings.Split(url,"/") requestURI := strings.Split(url,"/")
if len(requestURI) == 2 { if len(requestURI) == 2 {
if requestURI[1] == "" { if requestURI[1] == "" {
...@@ -22,6 +23,7 @@ func Mapping(g *goku.Goku,res http.ResponseWriter, req *http.Request) (bool,stri ...@@ -22,6 +23,7 @@ func Mapping(g *goku.Goku,res http.ResponseWriter, req *http.Request) (bool,stri
return false,"Lack StrategyID" return false,"Lack StrategyID"
} }
} }
fmt.Println(url)
gatewayAlias := requestURI[1] gatewayAlias := requestURI[1]
StrategyID := requestURI[2] StrategyID := requestURI[2]
urlLen := len(gatewayAlias) + len(StrategyID) + 2 urlLen := len(gatewayAlias) + len(StrategyID) + 2
...@@ -30,28 +32,28 @@ func Mapping(g *goku.Goku,res http.ResponseWriter, req *http.Request) (bool,stri ...@@ -30,28 +32,28 @@ func Mapping(g *goku.Goku,res http.ResponseWriter, req *http.Request) (bool,stri
if m.GatewayAlias == gatewayAlias{ if m.GatewayAlias == gatewayAlias{
for _,i := range m.StrategyList.Strategy{ for _,i := range m.StrategyList.Strategy{
if i.StrategyID == StrategyID{ if i.StrategyID == StrategyID{
flag = true flag = true
f,r := IPLimit(m,i,res,req) f,r := IPLimit(m,i,res,req)
if !f { if !f {
res.Write([]byte(r)) res.Write([]byte(r))
return false,r return false,r
} }
f,r = Auth(i,res,req) f,r = Auth(i,res,req)
if !f { if !f {
res.Write([]byte(r)) res.Write([]byte(r))
return false,r return false,r
} }
f,r = RateLimit(g,i) f,r = RateLimit(g,i)
if !f { if !f {
res.Write([]byte(r)) res.Write([]byte(r))
return false,r return false,r
} }
break break
} }
} }
} }
if flag { if flag {
for _,i := range m.ApiList.Apis{ for _,i := range m.ApiList.Apis{
if i.RequestURL == url[urlLen:]{ if i.RequestURL == url[urlLen:]{
...@@ -109,9 +111,9 @@ func CreateRequest(api conf.ApiInfo,i conf.BackendInfo,httpRequest *http.Request ...@@ -109,9 +111,9 @@ func CreateRequest(api conf.ApiInfo,i conf.BackendInfo,httpRequest *http.Request
return 500,[]byte("Fail to Parse Args"),make(map[string][]string) return 500,[]byte("Fail to Parse Args"),make(map[string][]string)
} }
backendMethod := api.ProxyMethod backendMethod := strings.ToUpper(api.ProxyMethod)
backenDomain := i.BackendPath + api.ProxyURL backenDomain := i.BackendPath + api.ProxyURL
requ,err := request.Method(strings.ToUpper(backendMethod),backenDomain) requ,err := request.Method(backendMethod,backenDomain)
for _, reqParam := range api.ProxyParams { for _, reqParam := range api.ProxyParams {
var param []string var param []string
switch reqParam.KeyPosition { switch reqParam.KeyPosition {
...@@ -124,7 +126,7 @@ func CreateRequest(api conf.ApiInfo,i conf.BackendInfo,httpRequest *http.Request ...@@ -124,7 +126,7 @@ func CreateRequest(api conf.ApiInfo,i conf.BackendInfo,httpRequest *http.Request
continue continue
} }
case "query": case "query":
param = httpRequest.Form[reqParam.Key] param = httpRequest.Form[reqParam.Key]
} }
if param == nil { if param == nil {
if reqParam.NotEmpty { if reqParam.NotEmpty {
...@@ -166,11 +168,15 @@ func CreateRequest(api conf.ApiInfo,i conf.BackendInfo,httpRequest *http.Request ...@@ -166,11 +168,15 @@ func CreateRequest(api conf.ApiInfo,i conf.BackendInfo,httpRequest *http.Request
for key, values := range backendHeaders { for key, values := range backendHeaders {
requ.SetHeader(key, values...) requ.SetHeader(key, values...)
} }
for key, values := range backendQueryParams { for key, values := range backendQueryParams {
fmt.Println(key)
fmt.Println(values)
requ.SetQueryParam(key, values...) requ.SetQueryParam(key, values...)
} }
for key, values := range backendFormParams { for key, values := range backendFormParams {
fmt.Println(key)
fmt.Println(values)
requ.SetFormParam(key, values...) requ.SetFormParam(key, values...)
} }
if api.ProxyBodyType == "raw" { if api.ProxyBodyType == "raw" {
...@@ -201,3 +207,14 @@ func CreateRequest(api conf.ApiInfo,i conf.BackendInfo,httpRequest *http.Request ...@@ -201,3 +207,14 @@ func CreateRequest(api conf.ApiInfo,i conf.BackendInfo,httpRequest *http.Request
return res.StatusCode(), res.Body(),httpResponseHeader return res.StatusCode(), res.Body(),httpResponseHeader
} }
func InterceptURL(str, substr string) string {
result := strings.Index(str, substr)
var rs string
if result != -1{
rs = str[:result]
}else {
rs = str
}
return rs
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册