1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
| package main
import (
"errors"
"flag"
"fmt"
etcd "github.com/go-micro/plugins/v4/registry/etcd"
micro "go-micro.dev/v4"
registry "go-micro.dev/v4/registry"
"go-micro.dev/v4/selector"
"io"
"net"
"time"
)
var (
port = flag.String("port", "8080", "")
address = registry.Addrs("127.0.0.1:2379")
etcdRegistry = etcd.NewRegistry(address)
)
var (
_ = micro.Address
)
func GetServiceAddr(serviceName string) (address string, err error) {
//var retryCount int
for retryCount := 0; retryCount < 5; retryCount++ {
servers, err := etcdRegistry.GetService(serviceName)
if err != nil {
continue
}
//var services []*registry.Service
//for _, value := range servers {
// services = append(services, value)
//}
next := selector.RoundRobin(servers)
for node, err := next(); err == nil; {
address = node.Address
}
if len(address) > 0 {
return address, nil
}
time.Sleep(time.Second * 1)
}
return "", errors.New("not found")
}
func Handle(conn net.Conn) {
addr, err := GetServiceAddr("starter")
fmt.Println("to: ", addr)
remote, err := net.Dial("tcp", addr)
if err != nil {
return
}
go io.Copy(remote, conn)
go io.Copy(conn, remote)
}
func main() {
var server, err = net.Listen("tcp", ":5000")
if err != nil {
panic(err)
}
// 这里可以换成 reverse_proxy,也可以自定义拦截器
for {
cli, err := server.Accept()
if err != nil {
continue
}
go Handle(cli)
}
}
|