mirror of
https://github.com/bolucat/Archive.git
synced 2025-12-24 13:28:37 +08:00
Update On Fri Jun 7 01:07:23 CEST 2024
This commit is contained in:
@@ -15,7 +15,7 @@ After=network.target
|
||||
|
||||
[Service]
|
||||
LimitNOFILE=65535
|
||||
ExecStart=/root/ehco -c ""
|
||||
ExecStart=ehco -c ""
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/Ehco1996/ehco/internal/conn"
|
||||
"github.com/Ehco1996/ehco/pkg/node_metric"
|
||||
"github.com/Ehco1996/ehco/pkg/metric_reader"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
@@ -39,7 +39,7 @@ type cmgrImpl struct {
|
||||
lock sync.RWMutex
|
||||
cfg *Config
|
||||
l *zap.SugaredLogger
|
||||
mr node_metric.Reader
|
||||
mr metric_reader.Reader
|
||||
|
||||
// k: relay label, v: connection list
|
||||
activeConnectionsMap map[string][]conn.RelayConn
|
||||
@@ -54,7 +54,7 @@ func NewCmgr(cfg *Config) Cmgr {
|
||||
closedConnectionsMap: make(map[string][]conn.RelayConn),
|
||||
}
|
||||
if cfg.NeedMetrics() {
|
||||
cmgr.mr = node_metric.NewReader(cfg.MetricsURL)
|
||||
cmgr.mr = metric_reader.NewReader(cfg.MetricsURL)
|
||||
}
|
||||
return cmgr
|
||||
}
|
||||
|
||||
@@ -3,9 +3,9 @@ package cmgr
|
||||
var DummyConfig = &Config{}
|
||||
|
||||
type Config struct {
|
||||
SyncURL string `json:"sync_url,omitempty"`
|
||||
MetricsURL string `json:"metrics_url,omitempty"`
|
||||
SyncInterval int `json:"sync_interval,omitempty"` // in seconds
|
||||
SyncURL string
|
||||
MetricsURL string
|
||||
SyncInterval int // in seconds
|
||||
}
|
||||
|
||||
func (c *Config) NeedSync() bool {
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"github.com/Ehco1996/ehco/internal/conn"
|
||||
"github.com/Ehco1996/ehco/internal/constant"
|
||||
myhttp "github.com/Ehco1996/ehco/pkg/http"
|
||||
"github.com/Ehco1996/ehco/pkg/node_metric"
|
||||
"github.com/Ehco1996/ehco/pkg/metric_reader"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
@@ -26,9 +26,9 @@ type VersionInfo struct {
|
||||
}
|
||||
|
||||
type syncReq struct {
|
||||
Version VersionInfo `json:"version"`
|
||||
Node node_metric.NodeMetrics `json:"node"`
|
||||
Stats []StatsPerRule `json:"stats"`
|
||||
Version VersionInfo `json:"version"`
|
||||
Node metric_reader.NodeMetrics `json:"node"`
|
||||
Stats []StatsPerRule `json:"stats"`
|
||||
}
|
||||
|
||||
func (cm *cmgrImpl) syncOnce(ctx context.Context) error {
|
||||
|
||||
@@ -3,6 +3,7 @@ package conf
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/url"
|
||||
|
||||
"github.com/Ehco1996/ehco/internal/constant"
|
||||
|
||||
@@ -11,10 +12,17 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
ProtocolHTTP = "http"
|
||||
ProtocolTLS = "tls"
|
||||
ProtocolHTTP = "http"
|
||||
ProtocolTLS = "tls"
|
||||
WS_HANDSHAKE_PATH = "handshake"
|
||||
WS_QUERY_REMOTE_ADDR = "remote_addr"
|
||||
)
|
||||
|
||||
type WSConfig struct {
|
||||
Path string `json:"path,omitempty"`
|
||||
RemoteAddr string `json:"remote_addr,omitempty"`
|
||||
}
|
||||
|
||||
type Config struct {
|
||||
Listen string `json:"listen"`
|
||||
ListenType string `json:"listen_type"`
|
||||
@@ -22,9 +30,28 @@ type Config struct {
|
||||
TCPRemotes []string `json:"tcp_remotes"`
|
||||
UDPRemotes []string `json:"udp_remotes"`
|
||||
|
||||
Label string `json:"label,omitempty"`
|
||||
MaxConnection int `json:"max_connection,omitempty"`
|
||||
BlockedProtocols []string `json:"blocked_protocols,omitempty"`
|
||||
Label string `json:"label,omitempty"`
|
||||
MaxConnection int `json:"max_connection,omitempty"`
|
||||
BlockedProtocols []string `json:"blocked_protocols,omitempty"`
|
||||
WSConfig *WSConfig `json:"ws_config,omitempty"`
|
||||
}
|
||||
|
||||
func (r *Config) GetWSHandShakePath() string {
|
||||
if r.WSConfig != nil && r.WSConfig.Path != "" {
|
||||
return r.WSConfig.Path
|
||||
}
|
||||
return WS_HANDSHAKE_PATH
|
||||
}
|
||||
|
||||
func (r *Config) GetWSRemoteAddr(baseAddr string) (string, error) {
|
||||
addr, err := url.JoinPath(baseAddr, r.GetWSHandShakePath())
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
if r.WSConfig != nil && r.WSConfig.RemoteAddr != "" {
|
||||
addr += fmt.Sprintf("?%s=%s", WS_QUERY_REMOTE_ADDR, r.WSConfig.RemoteAddr)
|
||||
}
|
||||
return addr, nil
|
||||
}
|
||||
|
||||
func (r *Config) Validate() error {
|
||||
|
||||
@@ -19,12 +19,12 @@ func (r *Relay) UniqueID() string {
|
||||
return r.cfg.Label
|
||||
}
|
||||
|
||||
func NewRelay(cfg *conf.Config, connMgr cmgr.Cmgr) (*Relay, error) {
|
||||
base := transporter.NewBaseTransporter(cfg, connMgr)
|
||||
s, err := transporter.NewRelayServer(cfg.ListenType, base)
|
||||
func NewRelay(cfg *conf.Config, cmgr cmgr.Cmgr) (*Relay, error) {
|
||||
s, err := transporter.NewRelayServer(cfg, cmgr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
r := &Relay{
|
||||
relayServer: s,
|
||||
cfg: cfg,
|
||||
|
||||
@@ -19,10 +19,11 @@ import (
|
||||
)
|
||||
|
||||
type baseTransporter struct {
|
||||
cfg *conf.Config
|
||||
l *zap.SugaredLogger
|
||||
|
||||
cmgr cmgr.Cmgr
|
||||
cfg *conf.Config
|
||||
tCPRemotes lb.RoundRobin
|
||||
l *zap.SugaredLogger
|
||||
}
|
||||
|
||||
func NewBaseTransporter(cfg *conf.Config, cmgr cmgr.Cmgr) *baseTransporter {
|
||||
|
||||
@@ -3,7 +3,9 @@ package transporter
|
||||
import (
|
||||
"net"
|
||||
|
||||
"github.com/Ehco1996/ehco/internal/cmgr"
|
||||
"github.com/Ehco1996/ehco/internal/constant"
|
||||
"github.com/Ehco1996/ehco/internal/relay/conf"
|
||||
"github.com/Ehco1996/ehco/pkg/lb"
|
||||
)
|
||||
|
||||
@@ -14,8 +16,8 @@ type RelayClient interface {
|
||||
RelayTCPConn(c net.Conn, handshakeF TCPHandShakeF) error
|
||||
}
|
||||
|
||||
func NewRelayClient(relayType string, base *baseTransporter) (RelayClient, error) {
|
||||
switch relayType {
|
||||
func newRelayClient(base *baseTransporter) (RelayClient, error) {
|
||||
switch base.cfg.TransportType {
|
||||
case constant.RelayTypeRaw:
|
||||
return newRawClient(base)
|
||||
case constant.RelayTypeWS:
|
||||
@@ -27,7 +29,7 @@ func NewRelayClient(relayType string, base *baseTransporter) (RelayClient, error
|
||||
case constant.RelayTypeMTCP:
|
||||
return newMtcpClient(base)
|
||||
default:
|
||||
panic("unsupported transport type")
|
||||
panic("unsupported transport type" + base.cfg.TransportType)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,8 +38,9 @@ type RelayServer interface {
|
||||
Close() error
|
||||
}
|
||||
|
||||
func NewRelayServer(relayType string, base *baseTransporter) (RelayServer, error) {
|
||||
switch relayType {
|
||||
func NewRelayServer(cfg *conf.Config, cmgr cmgr.Cmgr) (RelayServer, error) {
|
||||
base := NewBaseTransporter(cfg, cmgr)
|
||||
switch cfg.ListenType {
|
||||
case constant.RelayTypeRaw:
|
||||
return newRawServer(base)
|
||||
case constant.RelayTypeWS:
|
||||
@@ -49,6 +52,6 @@ func NewRelayServer(relayType string, base *baseTransporter) (RelayServer, error
|
||||
case constant.RelayTypeMTCP:
|
||||
return newMtcpServer(base)
|
||||
default:
|
||||
panic("unsupported transport type")
|
||||
panic("unsupported transport type" + cfg.ListenType)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ func newRawServer(base *baseTransporter) (*RawServer, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
relayer, err := NewRelayClient(base.cfg.TransportType, base)
|
||||
relayer, err := newRelayClient(base)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -80,6 +80,7 @@ func (s *RawServer) ListenAndServe() error {
|
||||
return err
|
||||
}
|
||||
go func(c net.Conn) {
|
||||
defer c.Close()
|
||||
if err := s.RelayTCPConn(c, s.relayer.TCPHandShake); err != nil {
|
||||
s.l.Errorf("RelayTCPConn error: %s", err.Error())
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
|
||||
"github.com/gobwas/ws"
|
||||
"github.com/labstack/echo/v4"
|
||||
"go.uber.org/zap"
|
||||
|
||||
"github.com/Ehco1996/ehco/internal/conn"
|
||||
"github.com/Ehco1996/ehco/internal/constant"
|
||||
@@ -37,7 +38,11 @@ func newWsClient(base *baseTransporter) (*WsClient, error) {
|
||||
|
||||
func (s *WsClient) TCPHandShake(remote *lb.Node) (net.Conn, error) {
|
||||
t1 := time.Now()
|
||||
wsc, _, _, err := s.dialer.Dial(context.TODO(), remote.Address+"/handshake/")
|
||||
addr, err := s.cfg.GetWSRemoteAddr(remote.Address)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
wsc, _, _, err := s.dialer.Dial(context.TODO(), addr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -68,10 +73,13 @@ func newWsServer(base *baseTransporter) (*WsServer, error) {
|
||||
},
|
||||
}
|
||||
e := web.NewEchoServer()
|
||||
e.Use(web.NginxLogMiddleware(zap.S().Named("ws-server")))
|
||||
|
||||
e.GET("/", echo.WrapHandler(web.MakeIndexF()))
|
||||
e.GET("/handshake/", echo.WrapHandler(http.HandlerFunc(s.HandleRequest)))
|
||||
e.GET(base.cfg.GetWSHandShakePath(), echo.WrapHandler(http.HandlerFunc(s.HandleRequest)))
|
||||
|
||||
s.e = e
|
||||
relayer, err := NewRelayClient(base.cfg.TransportType, base)
|
||||
relayer, err := newRelayClient(base)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -57,7 +57,11 @@ func (c *MwssClient) initNewSession(ctx context.Context, addr string) (*smux.Ses
|
||||
|
||||
func (s *MwssClient) TCPHandShake(remote *lb.Node) (net.Conn, error) {
|
||||
t1 := time.Now()
|
||||
mwssc, err := s.muxTP.Dial(context.TODO(), remote.Address+"/handshake/")
|
||||
addr, err := s.cfg.GetWSRemoteAddr(remote.Address)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
mwssc, err := s.muxTP.Dial(context.TODO(), addr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -81,7 +85,7 @@ func newMwssServer(base *baseTransporter) (*MwssServer, error) {
|
||||
WssServer: wssServer,
|
||||
muxServerImpl: newMuxServer(base.cfg.Listen, base.l.Named("mwss")),
|
||||
}
|
||||
s.e.GET("/handshake/", echo.WrapHandler(http.HandlerFunc(s.HandleRequest)))
|
||||
s.e.GET(base.cfg.GetWSHandShakePath(), echo.WrapHandler(http.HandlerFunc(s.HandleRequest)))
|
||||
return s, nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user