diff --git a/README.md b/README.md index 2283f3b..c265bd8 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,8 @@ One day, I needed to add TCP NAT traversal to [my project](https://github.com/pi So why not write a package to make this more elegant? proxylite was born. Its main features are listed below: 1. Easy to integrate into code. Both server and client structures are provided. Just import this package then register tunnels whenever you want. -2. Dynamic on-demand reverse proxy with online user number control. -3. Service registration and discovery. +2. Dynamic on-demand reverse proxy with serivce controlling (maxOnline, maxServe and deadline). +3. Service discovery and status display. 4. Customized hooks are support. (Under development) ## Concepts @@ -44,7 +44,7 @@ func main() { } ``` -These code create a proxylite server, and add avaliable outer port 9930-9932 (Note that it is not 9930 and 9932, but from 9930 to 9932), then run the server. The server is blocked listening on port 9939, inner client will dial this port and server discovery also bind this port. +These code create a proxylite server, and add available outer port 9930-9932 (Note that it is not 9930 and 9932, but from 9930 to 9932), then run the server. The server is blocked listening on port 9939, inner client will dial this port and server discovery also bind this port. Then, we create a inner client: ```golang @@ -98,12 +98,12 @@ Then we get the registration entry if the registration is success. Finally we wa ```golang func NewProxyLiteServer(portIntervals ...[2]int) *ProxyLiteServer ``` -Create a Proxy server with avaliable ports intervals. +Create a Proxy server with available ports intervals. ```golang func (s *ProxyLiteServer) AddPort(from, to int) bool ``` -Create a Proxy server with avaliable ports intervals. Return false if port is invalid. +Create a Proxy server with available ports intervals. Return false if port is invalid. ```golang func (s *ProxyLiteServer) SetLogger(logger *log.Logger) @@ -123,14 +123,14 @@ func NewProxyLiteClient(serverAddr string) *ProxyLiteClient Create a inner client binding with a proxy server. ```golang -func (c *ProxyLiteClient) AvaliablePorts() ([]int, bool) +func (c *ProxyLiteClient) AvailablePorts() ([]int, bool) ``` -Get avaliable ports from proxy server. +Get available ports from proxy server. ```golang func (c *ProxyLiteClient) AnyPort() (int, bool) ``` -Get a random avaliable port from proxy server. +Get a random available port from proxy server. ```golang type ServiceInfo struct { @@ -183,7 +183,7 @@ Set customized logrus logger for the inner client. ```golang func AskFreePort(addr string) ([]int, error) ``` -Ask avaliable free port from proxy server with given address. +Ask available free port from proxy server with given address. ```golang diff --git a/README_ZH.md b/README_ZH.md index 1f5a91a..8d63c12 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -16,8 +16,8 @@ 那为什么不编写一个包来使这变得更加优雅呢?proxylite 应运而生。它的主要特点如下: 1. 易于集成到代码中。提供了服务器和客户端结构。只需导入此包,然后在需要时注册隧道。 -2. 动态按需反向代理,带有在线用户数量控制。 -3. 服务注册和发现。 +2. 动态按需反向代理,带有丰富的服务控制(在线用户数量,总服务次数,失效时间)。 +3. 服务发现和服务状态呈现。 4. 支持自定义钩子。(开发中) ## 概念 @@ -126,7 +126,7 @@ func NewProxyLiteClient(serverAddr string) *ProxyLiteClient 创建一个与代理服务器绑定的内部客户端。 ```golang -func (c *ProxyLiteClient) AvaliablePorts() ([]int, bool) +func (c *ProxyLiteClient) AvailablePorts() ([]int, bool) ``` 从代理服务器获取可用端口。 diff --git a/client.go b/client.go index c33e797..eb69fff 100644 --- a/client.go +++ b/client.go @@ -11,7 +11,7 @@ import ( log "github.com/sirupsen/logrus" ) -// RegisterEntry entry to discribe a single service registration +// RegisterEntry entry to describe a single service registration type RegisterEntry struct { // Basic Info Info RegisterInfo @@ -28,7 +28,7 @@ type ProxyLiteClient struct { ready bool serverAddr string lock sync.RWMutex - avaliablePorts map[uint32]struct{} + availablePorts map[uint32]struct{} registered map[uint32]*RegisterEntry logger *log.Logger } @@ -38,7 +38,7 @@ func NewProxyLiteClient(serverAddr string) *ProxyLiteClient { client := &ProxyLiteClient{ ready: false, serverAddr: serverAddr, - avaliablePorts: map[uint32]struct{}{}, + availablePorts: map[uint32]struct{}{}, registered: map[uint32]*RegisterEntry{}, logger: log.New(), } @@ -50,13 +50,13 @@ func NewProxyLiteClient(serverAddr string) *ProxyLiteClient { } client.ready = true for _, port := range ports { - client.avaliablePorts[port] = struct{}{} + client.availablePorts[port] = struct{}{} } return client } -// AvaliablePorts Get avaliable ports from proxy server. -func (c *ProxyLiteClient) AvaliablePorts() ([]uint32, bool) { +// availablePorts Get available ports from proxy server. +func (c *ProxyLiteClient) AvailablePorts() ([]uint32, bool) { ports, err := AskFreePort(c.serverAddr) if err != nil { c.ready = false @@ -64,26 +64,26 @@ func (c *ProxyLiteClient) AvaliablePorts() ([]uint32, bool) { } c.ready = true for _, port := range ports { - c.avaliablePorts[port] = struct{}{} + c.availablePorts[port] = struct{}{} } return ports, true } -// AnyPort Get a random avaliable port from proxy server. +// AnyPort Get a random available port from proxy server. func (c *ProxyLiteClient) AnyPort() (uint32, bool) { if c.ready { - for port := range c.avaliablePorts { + for port := range c.availablePorts { return port, true } return 0, false } - _, ok := c.AvaliablePorts() + _, ok := c.AvailablePorts() if !ok { return 0, false } - for port := range c.avaliablePorts { + for port := range c.availablePorts { return port, true } return 0, false @@ -187,7 +187,7 @@ func (c *ProxyLiteClient) RegisterInnerService(info RegisterInfo, ctrl ControlIn for !serviceEnd { if inner == nil { // no inner service. send user close - c.logTunnelMessage(info.Name, "NOSRV", fmt.Sprintf("service not avaliable, uid[%d] [%v]", uid, err)) + c.logTunnelMessage(info.Name, "NOSRV", fmt.Sprintf("service not available, uid[%d] [%v]", uid, err)) n = 0 writeUidWithCloseUnsafe(buf[8:], uid) serviceEnd = true @@ -296,7 +296,7 @@ func (c *ProxyLiteClient) logTunnelMessage(service, header, msg string) { c.logger.Infof("[%s] [%s] %s", service, header, msg) } -// AskFreePort Ask avaliable free port from proxy server with given address. +// AskFreePort Ask available free port from proxy server with given address. func AskFreePort(addr string) ([]uint32, error) { conn, err := net.Dial("tcp", addr) if err != nil { diff --git a/example/client/main.go b/example/client/main.go index ca5856d..5952a20 100644 --- a/example/client/main.go +++ b/example/client/main.go @@ -9,7 +9,7 @@ import ( func main() { client := proxylite.NewProxyLiteClient(":9933") - log.Print(client.AvaliablePorts()) + log.Print(client.AvailablePorts()) log.Print(client.ActiveServices()) log.Print(client.AnyPort()) log.Print(client.AnyPort()) @@ -23,13 +23,13 @@ func main() { Message: "redis kv", }, proxylite.ControlInfo{ - MaxServeConn: 2, + MaxServeConn: 2, MaxServeCount: 4, - MaxServeTime: 600, + MaxServeTime: 600, }, )) - log.Print(client.AvaliablePorts()) + log.Print(client.AvailablePorts()) log.Print(client.ActiveServices()) log.Print(client.GetRegisterEntryByPort(9931)) log.Print(client.GetRegisterEntryByName("redis")) @@ -41,7 +41,7 @@ func main() { } <-entry.Done time.Sleep(time.Microsecond * 10) - log.Print(client.AvaliablePorts()) + log.Print(client.AvailablePorts()) log.Print(client.ActiveServices()) log.Print(client.GetRegisterEntryByPort(9931)) log.Print(client.GetRegisterEntryByName("redis")) diff --git a/protocol.go b/protocol.go index 995e1b9..3e819ba 100644 --- a/protocol.go +++ b/protocol.go @@ -22,10 +22,10 @@ const ( TypeDataSegment = 64 ) -// AskFreePortReq Ask avaliable free ports request +// AskFreePortReq Ask available free ports request type AskFreePortReq struct{} -// AskFreePortRsp Ask avaliable free ports response +// AskFreePortRsp Ask available free ports response type AskFreePortRsp struct { Ports []uint32 } diff --git a/proxylite_test.go b/proxylite_test.go index bebdc24..00e4ad1 100644 --- a/proxylite_test.go +++ b/proxylite_test.go @@ -22,7 +22,7 @@ func readn(c net.Conn, n int) ([]byte, error) { return buf, nil } -func writen(c net.Conn, data []byte, n int) error { +func written(c net.Conn, data []byte, n int) error { offset := 0 for offset < n { @@ -48,7 +48,7 @@ func newTcpEchoServer(addr string, pken int) error { if err != nil { break } - err = writen(c, data, pken) + err = written(c, data, pken) if err != nil { break } @@ -113,7 +113,7 @@ func TestBasicUsage(t *testing.T) { msg := "hello123" var data []byte for i := 0; i < 10; i++ { - err := writen(user, []byte(msg), 8) + err := written(user, []byte(msg), 8) if err != nil { t.Error("write 1, ", err) } @@ -174,7 +174,7 @@ func TestCancel(t *testing.T) { msg := "hello123" var data []byte for i := 0; i < 10; i++ { - err := writen(user, []byte(msg), 8) + err := written(user, []byte(msg), 8) if err != nil { t.Error("write 1, ", err) } @@ -240,7 +240,7 @@ func TestMultiplex(t *testing.T) { t.Logf("user[%d] is %s\n", i, user.LocalAddr().String()) var data []byte for j := 0; j < 10; j++ { - err := writen(user, []byte(msg), 8) + err := written(user, []byte(msg), 8) if err != nil { emsg := fmt.Sprintf("[%d][%d]write 1: %v", i, j, err) errmsg <- emsg @@ -320,7 +320,7 @@ func TestMultiplexMaxTimeControl(t *testing.T) { t.Logf("user[%d] is %s\n", i, user.LocalAddr().String()) var data []byte for j := 0; j < 10; j++ { - err := writen(user, []byte(msg), 8) + err := written(user, []byte(msg), 8) if err != nil { emsg := fmt.Sprintf("[%d][%d]write 1: %v", i, j, err) errmsg <- emsg @@ -395,7 +395,7 @@ func TestMultiplexMaxCountControl(t *testing.T) { msg := fmt.Sprintf("[%d]hello", i) var data []byte for j := 0; j < 10; j++ { - err := writen(user, []byte(msg), 8) + err := written(user, []byte(msg), 8) if err != nil { emsg := fmt.Sprintf("[%d][%d]write 1: %v", i, j, err) errmsg <- emsg @@ -475,7 +475,7 @@ func TestMultiplexMaxConnControl(t *testing.T) { t.Logf("user[%d] is %s\n", i, user.LocalAddr().String()) var data []byte for j := 0; j < 10; j++ { - err := writen(user, []byte(msg), 8) + err := written(user, []byte(msg), 8) if err != nil { emsg := fmt.Sprintf("[%d][%d]write 1: %v", i, j, err) errmsg <- emsg diff --git a/server.go b/server.go index e30c1fe..9577425 100644 --- a/server.go +++ b/server.go @@ -34,7 +34,7 @@ type ProxyLiteServer struct { logger *log.Logger } -// NewProxyLiteServer Create a Proxy server with avaliable ports intervals. +// NewProxyLiteServer Create a Proxy server with available ports intervals. func NewProxyLiteServer(portIntervals ...[2]int) *ProxyLiteServer { server := &ProxyLiteServer{ all: map[uint32]struct{}{}, @@ -48,7 +48,7 @@ func NewProxyLiteServer(portIntervals ...[2]int) *ProxyLiteServer { return server } -// AddPort Add avaliable ports intervals for server. Return false if port is invalid. +// AddPort Add available ports intervals for server. Return false if port is invalid. func (s *ProxyLiteServer) AddPort(from, to int) bool { if from <= 0 || to > 65535 { return false @@ -296,12 +296,12 @@ func (s *ProxyLiteServer) startTunnel(tn *tunnel) { } // if MaxServeCount is set not zero, only serve MaxServeCount users. - var comming, leaving *sem.Weighted + var coming, leaving *sem.Weighted var finiteServeCount bool = false lastFinish := sync.WaitGroup{} if tn.ctrl.MaxServeCount > 0 { finiteServeCount = true - comming = sem.NewWeighted(int64(tn.ctrl.MaxServeCount)) + coming = sem.NewWeighted(int64(tn.ctrl.MaxServeCount)) leaving = sem.NewWeighted(int64(tn.ctrl.MaxServeCount) - 1) // last one leave, close tunnel lastFinish.Add(1) } @@ -417,7 +417,7 @@ func (s *ProxyLiteServer) startTunnel(tn *tunnel) { } if finiteServeCount { // All users have been come. - if !comming.TryAcquire(1) { + if !coming.TryAcquire(1) { lastFinish.Wait() // wait last user finish break }