/
server.go
128 lines (105 loc) · 2.37 KB
/
server.go
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
server.go
grpc server 封装
sam
2023-01-30
*/
package srd
import (
"errors"
"fmt"
"github.com/zituocn/logx"
"google.golang.org/grpc"
"net"
)
var (
grpcScheme = "grpc"
)
type GrpcServer struct {
Listener net.Listener
Server *grpc.Server
ServerName string
port int
etcdEndpoints []string
lease int64
isRegister bool
}
// NewGrpcServer 返回新的grpc register
func NewGrpcServer(opt *GrpcServerOption) (*GrpcServer, error) {
if opt.Port == 0 {
return nil, errors.New("[grpc] need port")
}
if opt.IsRegister && len(opt.EtcdEndpoints) == 0 {
return nil, errors.New("[grpc] need etcd endpoint")
}
if opt.Lease < 1 {
opt.Lease = 3
}
listener, err := net.Listen("tcp", opt.address())
if err != nil {
return nil, err
}
g := grpc.NewServer()
server := &GrpcServer{
Listener: listener,
Server: g,
ServerName: opt.ServerName,
etcdEndpoints: opt.EtcdEndpoints,
port: opt.Port,
lease: opt.Lease,
isRegister: opt.IsRegister,
}
return server, nil
}
// Run 运行
func (s *GrpcServer) Run() {
go func() {
logx.Infof("[grpc] [%s] start grpc service listen on :%d", s.ServerName, s.port)
err := s.Server.Serve(s.Listener)
if err != nil {
logx.Errorf("[grpc] failed to listen: %s", err.Error())
}
}()
go func() {
if s.isRegister {
logx.Info("[grpc] start registration ...")
addr, err := GetLocalIP()
if err != nil {
logx.Errorf("[grpc] get location ip error : %s", err.Error())
return
}
val := fmt.Sprintf("%s:%d", addr, s.port)
_, err = NewRegister(&RegisterOption{
EtcdEndpoints: s.etcdEndpoints,
Schema: grpcScheme,
Lease: s.lease,
Key: s.ServerName,
Val: val,
})
if err != nil {
logx.Errorf("[grpc] register failed: %s", err.Error())
return
}
logx.Info("[grpc] service registered successfully")
}
}()
}
// GrpcServerOption grpc register 参数
type GrpcServerOption struct {
// grpc ServerName 服务名
ServerName string
// 端口
Port int
// IP地址
IP string
// EtcdEndpoints etcd地址,如果为多个地址时,需要集群部署etcd
EtcdEndpoints []string
// Lease etcd 租约续期时间
Lease int64
// IsRegister 是否注册到etcd
// 为true时,可不填写传入ip地址
IsRegister bool
}
func (o *GrpcServerOption) address() string {
return fmt.Sprintf("%s:%d", o.IP, o.Port)
}