mirror of
https://github.com/eolinker/apinto
synced 2025-10-26 10:10:20 +08:00
提交
This commit is contained in:
@@ -1,83 +0,0 @@
|
||||
package proxy_mirror
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/eolinker/eosc/eocontext"
|
||||
)
|
||||
|
||||
var (
|
||||
errNoValidNode = errors.New("no valid node")
|
||||
)
|
||||
|
||||
type node struct {
|
||||
labels eocontext.Attrs
|
||||
id string
|
||||
ip string
|
||||
port int
|
||||
status eocontext.NodeStatus
|
||||
}
|
||||
|
||||
// newNode 创建新节点
|
||||
func newNode(labels map[string]string, id string, ip string, port int) eocontext.INode {
|
||||
return &node{labels: labels, id: id, ip: ip, port: port, status: eocontext.Running}
|
||||
}
|
||||
|
||||
// GetAttrs 获取节点属性集合
|
||||
func (n *node) GetAttrs() eocontext.Attrs {
|
||||
return n.labels
|
||||
}
|
||||
|
||||
// GetAttrByName 通过属性名获取节点属性
|
||||
func (n *node) GetAttrByName(name string) (string, bool) {
|
||||
v, ok := n.labels[name]
|
||||
return v, ok
|
||||
}
|
||||
|
||||
// IP 返回节点IP
|
||||
func (n *node) IP() string {
|
||||
return n.ip
|
||||
}
|
||||
|
||||
// Port 返回节点端口
|
||||
func (n *node) Port() int {
|
||||
return n.port
|
||||
}
|
||||
|
||||
// ID 返回节点ID
|
||||
func (n *node) ID() string {
|
||||
return n.id
|
||||
}
|
||||
|
||||
// Status 返回节点状态
|
||||
func (n *node) Status() eocontext.NodeStatus {
|
||||
return n.status
|
||||
}
|
||||
|
||||
// Labels 返回节点标签集合
|
||||
func (n *node) Labels() map[string]string {
|
||||
return n.labels
|
||||
}
|
||||
|
||||
// Addr 返回节点地址
|
||||
func (n *node) Addr() string {
|
||||
if n.port == 0 {
|
||||
return n.ip
|
||||
}
|
||||
return fmt.Sprintf("%s:%d", n.ip, n.port)
|
||||
}
|
||||
|
||||
// Up 将节点状态置为运行中
|
||||
func (n *node) Up() {
|
||||
n.status = eocontext.Running
|
||||
}
|
||||
|
||||
// Down 将节点状态置为不可用
|
||||
func (n *node) Down() {
|
||||
n.status = eocontext.Down
|
||||
}
|
||||
|
||||
// Leave 将节点状态置为离开
|
||||
func (n *node) Leave() {
|
||||
n.status = eocontext.Leave
|
||||
}
|
||||
@@ -1,13 +1,19 @@
|
||||
package proxy_mirror
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/eolinker/apinto/discovery"
|
||||
"github.com/eolinker/eosc/eocontext"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
var (
|
||||
errNoValidNode = errors.New("no valid node")
|
||||
)
|
||||
|
||||
type mirrorService struct {
|
||||
scheme string
|
||||
passHost eocontext.PassHostMod
|
||||
@@ -32,7 +38,7 @@ func newMirrorService(target, passHost, host string, timeout time.Duration) *mir
|
||||
port, _ = strconv.Atoi(portStr)
|
||||
}
|
||||
|
||||
inode := newNode(labels, fmt.Sprintf("%s:%d", ip, port), ip, port)
|
||||
inode := discovery.NewNode(labels, fmt.Sprintf("%s:%d", ip, port), ip, port)
|
||||
|
||||
var mode eocontext.PassHostMod
|
||||
switch passHost {
|
||||
|
||||
@@ -54,8 +54,8 @@ func (h *httpHandler) ServeHTTP(ctx eocontext.EoContext) {
|
||||
ctx = wsCtx
|
||||
}
|
||||
//set retry timeout
|
||||
ctx.WithValue(http_complete.KeyHttpRetry, h.retry)
|
||||
ctx.WithValue(http_complete.KeyHttpTimeout, h.timeout)
|
||||
ctx.WithValue(http_context.KeyHttpRetry, h.retry)
|
||||
ctx.WithValue(http_context.KeyHttpTimeout, h.timeout)
|
||||
|
||||
//Set Label
|
||||
ctx.SetLabel("api", h.routerName)
|
||||
|
||||
@@ -295,11 +295,8 @@ func (d *DubboContext) IsCloneable() bool {
|
||||
}
|
||||
|
||||
func (d *DubboContext) Clone() (eocontext.EoContext, error) {
|
||||
if !d.IsCloneable() {
|
||||
return nil, fmt.Errorf("%s %w", "DubboContext", eocontext.ErrEoCtxUnCloneable)
|
||||
}
|
||||
//TODO
|
||||
return nil, nil
|
||||
return nil, fmt.Errorf("%s %w", "DubboContext", eocontext.ErrEoCtxUnCloneable)
|
||||
}
|
||||
|
||||
func addrToIP(addr net.Addr) net.IP {
|
||||
|
||||
@@ -266,9 +266,6 @@ func (c *Context) IsCloneable() bool {
|
||||
}
|
||||
|
||||
func (c *Context) Clone() (eocontext.EoContext, error) {
|
||||
if !c.IsCloneable() {
|
||||
//TODO
|
||||
return nil, fmt.Errorf("%s %w", "GrpcContext", eocontext.ErrEoCtxUnCloneable)
|
||||
}
|
||||
//TODO
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
@@ -179,9 +179,7 @@ func (ctx *cloneContext) IsCloneable() bool {
|
||||
}
|
||||
|
||||
func (ctx *cloneContext) Clone() (eoscContext.EoContext, error) {
|
||||
|
||||
return nil, fmt.Errorf("%s %w", "HttpContext", eoscContext.ErrEoCtxUnCloneable)
|
||||
|
||||
}
|
||||
|
||||
var copyKey = struct{}{}
|
||||
|
||||
@@ -13,7 +13,7 @@ import (
|
||||
|
||||
eoscContext "github.com/eolinker/eosc/eocontext"
|
||||
http_service "github.com/eolinker/eosc/eocontext/http-context"
|
||||
uuid "github.com/google/uuid"
|
||||
"github.com/google/uuid"
|
||||
"github.com/valyala/fasthttp"
|
||||
)
|
||||
|
||||
@@ -185,19 +185,25 @@ func (ctx *HttpContext) IsCloneable() bool {
|
||||
}
|
||||
|
||||
func (ctx *HttpContext) Clone() (eoscContext.EoContext, error) {
|
||||
|
||||
copyContext := &cloneContext{
|
||||
org: ctx,
|
||||
proxyRequests: make([]http_service.IProxy, 0, 5),
|
||||
}
|
||||
copyContext := copyPool.Get().(*cloneContext)
|
||||
copyContext.org = ctx
|
||||
copyContext.proxyRequests = make([]http_service.IProxy, 0, 2)
|
||||
|
||||
req := fasthttp.AcquireRequest()
|
||||
ctx.fastHttpRequestCtx.Request.CopyTo(req)
|
||||
|
||||
copyContext.proxyRequest.reset(req, ctx.requestReader.remoteAddr)
|
||||
copyContext.proxyRequests = copyContext.proxyRequests[:0]
|
||||
copyContext.app = ctx.app
|
||||
copyContext.balance = ctx.balance
|
||||
copyContext.upstreamHostHandler = ctx.upstreamHostHandler
|
||||
copyContext.completeHandler = ctx.completeHandler
|
||||
copyContext.finishHandler = ctx.finishHandler
|
||||
|
||||
copyContext.labels = ctx.Labels()
|
||||
cloneLabels := make(map[string]string, len(ctx.labels))
|
||||
for k, v := range ctx.labels {
|
||||
cloneLabels[k] = v
|
||||
}
|
||||
copyContext.labels = cloneLabels
|
||||
|
||||
//记录请求时间
|
||||
copyContext.ctx = context.WithValue(ctx.Context(), copyKey, true)
|
||||
|
||||
@@ -10,6 +10,9 @@ var (
|
||||
pool = sync.Pool{
|
||||
New: newContext,
|
||||
}
|
||||
copyPool = sync.Pool{
|
||||
New: newCopyContext,
|
||||
}
|
||||
)
|
||||
|
||||
func newContext() interface{} {
|
||||
@@ -17,3 +20,9 @@ func newContext() interface{} {
|
||||
h.proxyRequests = make([]http_service.IProxy, 0, 5)
|
||||
return h
|
||||
}
|
||||
|
||||
func newCopyContext() interface{} {
|
||||
h := new(cloneContext)
|
||||
h.proxyRequests = make([]http_service.IProxy, 0, 5)
|
||||
return h
|
||||
}
|
||||
|
||||
@@ -86,9 +86,6 @@ func (w *WebsocketContext) IsCloneable() bool {
|
||||
}
|
||||
|
||||
func (w *WebsocketContext) Clone() (eoscContext.EoContext, error) {
|
||||
if !w.IsCloneable() {
|
||||
//TODO
|
||||
return nil, fmt.Errorf("%s %w", "WebsocketContext", eoscContext.ErrEoCtxUnCloneable)
|
||||
}
|
||||
//TODO
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user