转发换库

This commit is contained in:
Liujian
2021-08-05 20:16:52 +08:00
parent 7d8aba8b3e
commit e34eb23754
9 changed files with 85 additions and 47 deletions

View File

@@ -37,7 +37,8 @@ func main() {
client := &fasthttp.Client{ReadTimeout: 30 * time.Second, MaxConnsPerHost: 4000}
err := http.ListenAndServe(":8082", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
req := fasthttp.AcquireRequest()
req.SetRequestURI("http://172.18.189.60/")
req.Header.SetMethod("POST")
req.SetRequestURI("http://47.95.203.198:8080/Web/Test/params/print")
var resp fasthttp.Response
err := client.Do(req, &resp)
//status, resp, err := fasthttp.Get(nil, "http://172.18.189.60/")
@@ -50,6 +51,7 @@ func main() {
fmt.Println("请求没有成功:", resp.StatusCode())
return
}
fmt.Println(string(resp.Header.Header()))
w.WriteHeader(resp.StatusCode())
w.Write(resp.Body())

View File

@@ -6,7 +6,6 @@ import (
goku_plugin "github.com/eolinker/goku-standard-plugin"
access_field "github.com/eolinker/goku-eosc/node/common/access-field"
"github.com/eolinker/goku-eosc/utils"
)

View File

@@ -3,6 +3,10 @@ package http_context
import (
"io/ioutil"
"net/http"
"strconv"
"strings"
"github.com/valyala/fasthttp"
)
//ResponseReader 响应结构体
@@ -35,12 +39,27 @@ func newResponseReader(response *http.Response) *ResponseReader {
}
//NewResponseReader 新增ResponseReader
func NewResponseReader(header http.Header, statusCode int, status string, body []byte) *ResponseReader {
func NewResponseReader(header *fasthttp.ResponseHeader, statusCode int, body []byte) *ResponseReader {
r := new(ResponseReader)
r.Header = NewHeader(header)
r.CookiesHandler = newCookieHandle(header)
tmpHeader := http.Header{}
hs := strings.Split(string(header.Header()), "\r\n")
for i, h := range hs {
if i == 0 {
continue
}
values := strings.Split(h, ":")
vLen := len(values)
if vLen < 2 {
tmpHeader.Set(values[0], "")
} else {
tmpHeader.Set(values[0], values[1])
}
}
r.Header = &Header{header: tmpHeader}
//r.CookiesHandler = newCookieHandle(header)
r.StatusHandler = NewStatusHandler()
r.SetStatus(statusCode, status)
r.SetStatus(statusCode, strconv.Itoa(statusCode))
// if response.ContentLength > 0 {
// body, _ := ioutil.ReadAll(response.body)
// r.BodyHandler = NewBodyHandler(body)

View File

@@ -5,9 +5,11 @@ import (
"crypto/tls"
"errors"
"io"
"net"
"net/http"
"net/url"
"strings"
"github.com/valyala/fasthttp"
http_context "github.com/eolinker/goku-eosc/node/http-context"
@@ -19,27 +21,31 @@ import (
var Version = "2.0"
var (
transport = &http.Transport{TLSClientConfig: &tls.Config{
//transport = &http.Transport{TLSClientConfig: &tls.Config{
// InsecureSkipVerify: false,
//},
// DialContext: (&net.Dialer{
// Timeout: 30 * time.Second, // 连接超时时间
// KeepAlive: 60 * time.Second, // 保持长连接的时间
// }).DialContext, // 设置连接的参数
// MaxIdleConns: 500, // 最大空闲连接
// IdleConnTimeout: 60 * time.Second, // 空闲连接的超时时间
// ExpectContinueTimeout: 30 * time.Second, // 等待服务第一个响应的超时时间
// MaxIdleConnsPerHost: 100, // 每个host保持的空闲连接数
//}
httpClient = &fasthttp.Client{
TLSConfig: &tls.Config{
InsecureSkipVerify: false,
},
DialContext: (&net.Dialer{
Timeout: 30 * time.Second, // 连接超时时间
KeepAlive: 60 * time.Second, // 保持长连接的时间
}).DialContext, // 设置连接的参数
MaxIdleConns: 500, // 最大空闲连接
IdleConnTimeout: 60 * time.Second, // 空闲连接的超时时间
ExpectContinueTimeout: 30 * time.Second, // 等待服务第一个响应的超时时间
MaxIdleConnsPerHost: 100, // 每个host保持的空闲连接数
}
httpClient = &http.Client{
Transport: transport,
MaxConnsPerHost: 4000,
}
)
//SetCert 设置证书配置
func SetCert(skip int, clientCerts []tls.Certificate) {
tlsConfig := &tls.Config{InsecureSkipVerify: skip == 1, Certificates: clientCerts}
transport.TLSClientConfig = tlsConfig
httpClient.TLSConfig = tlsConfig
}
//Request http-proxy 请求结构体
@@ -102,7 +108,6 @@ func newRequest(method string, URL *url.URL) (*Request, error) {
urlPath = URL.Scheme + "://" + URL.Host + URL.Path
r := &Request{
client: httpClient,
method: method,
url: urlPath,
headers: make(map[string][]string),
@@ -144,15 +149,20 @@ func (r *Request) SetTimeout(timeout time.Duration) {
}
//Send 发送请求
func (r *Request) Send(ctx *http_context.Context) (*http.Response, error) {
req := r.HTTPRequest()
req.Header.Set("Accept-Encoding", "gzip")
func (r *Request) Send(ctx *http_context.Context) (*fasthttp.Response, error) {
req := fasthttp.AcquireRequest()
req.SetRequestURI(r.url)
req.Header.SetMethod(r.method)
req.Header = parseHeaders(r.headers)
req.Header.Set("Accept-Encoding", "gzip")
r.client.Timeout = r.timeout
httpResponse, err := r.client.Do(req)
resp := fasthttp.AcquireResponse()
defer fasthttp.ReleaseResponse(resp) // 用完需要释放资源
return httpResponse, err
err := httpClient.Do(req, resp)
return resp, err
}
//QueryParams 获取query参数
@@ -183,19 +193,26 @@ func (r *Request) SetRawBody(body []byte) {
}
// 解析请求头
func parseHeaders(headers map[string][]string) http.Header {
h := http.Header{}
func parseHeaders(headers map[string][]string) fasthttp.RequestHeader {
h := fasthttp.RequestHeader{}
hasAccept := false
hasAgent := false
for key, values := range headers {
key = strings.ToLower(key)
for _, value := range values {
if key == "accept" {
hasAccept = true
}
if key == "user-agent" {
hasAgent = true
}
h.Add(key, value)
}
}
_, hasAccept := h["Accept"]
if !hasAccept {
h.Add("Accept", "*/*")
}
_, hasAgent := h["User-Agent"]
if !hasAgent {
h.Add("User-Agent", "goku-requests/"+Version)
}

View File

@@ -5,14 +5,14 @@ import (
"net/url"
"time"
"github.com/eolinker/goku-eosc/node/http-proxy/backend"
"github.com/valyala/fasthttp"
http_context "github.com/eolinker/goku-eosc/node/http-context"
http_proxy_request "github.com/eolinker/goku-eosc/node/http-proxy/http-proxy-request"
)
//DoRequest 构造请求
func DoRequest(ctx *http_context.Context, uri string, timeout time.Duration) (backend.IResponse, error) {
func DoRequest(ctx *http_context.Context, uri string, timeout time.Duration) (*fasthttp.Response, error) {
if uri == "" {
return nil, fmt.Errorf("invaild url")
}
@@ -54,5 +54,5 @@ func DoRequest(ctx *http_context.Context, uri string, timeout time.Duration) (ba
return nil, err
}
return NewResponse(response)
return response, nil
}

View File

@@ -7,8 +7,9 @@ import (
"strings"
"time"
"github.com/valyala/fasthttp"
http_proxy "github.com/eolinker/goku-eosc/node/http-proxy"
"github.com/eolinker/goku-eosc/node/http-proxy/backend"
"github.com/eolinker/goku-eosc/utils"
"github.com/eolinker/eosc/log"
@@ -184,13 +185,13 @@ func (s *serviceWorker) Handle(w http.ResponseWriter, r *http.Request, router se
ctx.SetBody([]byte(err.Error()))
return err
}
ctx.SetProxyResponseHandler(http_context.NewResponseReader(response.Header(), response.StatusCode(), response.Status(), response.Body()))
ctx.SetProxyResponseHandler(http_context.NewResponseReader(&response.Header, response.StatusCode(), response.Body()))
return nil
}
func (s *serviceWorker) send(ctx *http_context.Context, serviceDetail service.IServiceDetail) (backend.IResponse, error) {
func (s *serviceWorker) send(ctx *http_context.Context, serviceDetail service.IServiceDetail) (*fasthttp.Response, error) {
if s.upstream == nil {
var response backend.IResponse
var response *fasthttp.Response
var err error
path := utils.TrimPrefixAll(ctx.ProxyRequest.TargetURL(), "/")
for doTrice := serviceDetail.Retry() + 1; doTrice > 0; doTrice-- {

View File

@@ -4,7 +4,7 @@ import (
"errors"
"fmt"
"github.com/eolinker/goku-eosc/node/http-proxy/backend"
"github.com/valyala/fasthttp"
"github.com/eolinker/goku-eosc/upstream"
@@ -99,8 +99,8 @@ func (h *httpUpstream) CheckSkill(skill string) bool {
}
//Send 请求发送,忽略重试
func (h *httpUpstream) Send(ctx *http_context.Context, serviceDetail service.IServiceDetail) (backend.IResponse, error) {
var response backend.IResponse
func (h *httpUpstream) Send(ctx *http_context.Context, serviceDetail service.IServiceDetail) (*fasthttp.Response, error) {
var response *fasthttp.Response
var err error
path := utils.TrimPrefixAll(ctx.ProxyRequest.TargetURL(), "/")

View File

@@ -3,7 +3,7 @@ package upstream_http_anonymous
import (
"fmt"
"github.com/eolinker/goku-eosc/node/http-proxy/backend"
"github.com/valyala/fasthttp"
"github.com/eolinker/goku-eosc/service"
@@ -23,8 +23,8 @@ type httpUpstream struct {
}
//send 请求发送,忽略重试
func (h *httpUpstream) Send(ctx *http_context.Context, serviceDetail service.IServiceDetail) (backend.IResponse, error) {
var response backend.IResponse
func (h *httpUpstream) Send(ctx *http_context.Context, serviceDetail service.IServiceDetail) (*fasthttp.Response, error) {
var response *fasthttp.Response
var err error
path := utils.TrimPrefixAll(ctx.ProxyRequest.TargetURL(), "/")
for doTrice := serviceDetail.Retry() + 1; doTrice > 0; doTrice-- {

View File

@@ -2,8 +2,8 @@ package upstream
import (
http_context "github.com/eolinker/goku-eosc/node/http-context"
"github.com/eolinker/goku-eosc/node/http-proxy/backend"
"github.com/eolinker/goku-eosc/service"
"github.com/valyala/fasthttp"
)
//CheckSkill 检测目标技能是否符合
@@ -13,5 +13,5 @@ func CheckSkill(skill string) bool {
//IUpstream 实现了负载发送请求方法
type IUpstream interface {
Send(ctx *http_context.Context, serviceDetail service.IServiceDetail) (backend.IResponse, error)
Send(ctx *http_context.Context, serviceDetail service.IServiceDetail) (*fasthttp.Response, error)
}