-
Notifications
You must be signed in to change notification settings - Fork 33
/
config.go
225 lines (187 loc) · 7.17 KB
/
config.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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
package drpc
import (
"errors"
"github.com/gogf/gf/v2/util/gconv"
"github.com/osgochina/dmicro/drpc/codec"
"github.com/osgochina/dmicro/drpc/message"
"github.com/osgochina/dmicro/drpc/socket"
"github.com/osgochina/dmicro/utils"
"math"
"net"
"strconv"
"time"
)
// EndpointConfig 端点的配置
type EndpointConfig struct {
// 网络类型; tcp, tcp4, tcp6, unix, unixpacket, kcp or quic"
Network string `json:"network" comment:"网络类型; tcp, tcp4, tcp6, unix, unixpacket"`
//作为服务端角色时,要监听的服务器本地IP
ListenIP string `json:"listen_ip" comment:"作为服务端角色时,要监听的服务器本地IP"`
//作为服务端角色时,需要监听的本地端口号
ListenPort uint16 `json:"listen_port" comment:"作为服务端角色时,需要监听的本地端口号"`
//作为服务器角色时候,本地监听地址
listenAddr net.Addr
//作为客户端角色时,请求服务端时候,本地使用的地址
LocalIP string `json:"local_ip" comment:"作为客户端角色时,请求服务端时候,本地使用的地址"`
//作为客户端角色时,请求服务端时候,本地使用的地址端口号
LocalPort uint16 `json:"local_port" comment:"作为客户端角色时,请求服务端时候,本地使用的地址端口号"`
//作为客户端角色时,请求服务端时候,本地使用的地址端口
localAddr net.Addr
// 默认的消息体编码格式
DefaultBodyCodec string `json:"default_body_codec" comment:"默认的消息体编码格式"`
//默认session会话生命周期
DefaultSessionAge time.Duration `json:"default_session_age" comment:"默认session会话生命周期"`
//默认单次请求生命周期
DefaultContextAge time.Duration `json:"default_context_age" comment:"默认单次请求生命周期"`
//外部配置慢处理定义时间
SlowCometDuration time.Duration `json:"slow_comet_duration" comment:"慢处理定义时长"`
//慢处理定义时间
slowCometDuration time.Duration
//是否打印会话中请求的 body或 metadata
PrintDetail bool `json:"print_detail" comment:"是否打印请求的详细信息,body和metadata"`
// 作为客户端角色时,请求服务端的超时时间
DialTimeout time.Duration `json:"dial_timeout" comment:"作为客户端角色时,请求服务端的超时时间"`
// 仅限客户端角色使用,链接中断时候,试图链接服务端的最大重试次数。
RedialTimes int `json:"redial_times" comment:"仅限客户端角色使用,链接中断时候,试图链接服务端的最大重试次数。"`
//仅限客户端角色使用 试图链接服务端时候,重试的时间间隔.
RedialInterval time.Duration `json:"redial_interval" comment:"仅限客户端角色使用 试图链接服务端时候,重试的时间间隔."`
//该配置是否已经初始化检查
checked bool
}
// ListenAddr 获取本地监听地址,服务器角色
func (that *EndpointConfig) ListenAddr() net.Addr {
_ = that.check()
return that.listenAddr
}
// LocalAddr 获取本地地址,客户端角色
func (that *EndpointConfig) LocalAddr() net.Addr {
_ = that.check()
return that.localAddr
}
// 初始化检查,判断配置是否有误
func (that *EndpointConfig) check() (err error) {
if that.checked {
return nil
}
that.checked = true
if that.Network == "" {
that.Network = "tcp"
}
if that.LocalIP == "" {
that.LocalIP = "0.0.0.0"
}
if that.LocalPort <= 0 {
that.LocalPort = 0
}
//如果监听的ip为空,且设置的LocalIP不为空,则默认使用LocalIP,这样就可以兼容低版本只有LocalIP的情况
if that.ListenIP == "" && that.LocalIP != "" {
that.ListenIP = that.LocalIP
}
if that.ListenPort <= 0 {
that.ListenPort = 0
}
//先初始化一个基础的本地地址,LocalPort为0的时候表示随机获取
that.localAddr, err = that.newAddr(that.Network, that.LocalIP, gconv.String(that.LocalPort))
if err != nil {
return err
}
//获取本地监听地址,
//network 可以赋值也可以使用默认
//LocalIP 可以赋值也可以使用默认
//ListenPort 可以使用0,随机获取
that.listenAddr = utils.NewFakeAddr(that.Network, that.ListenIP, gconv.String(that.ListenPort))
//慢请求的配置值,请求消耗时间大于该值,被定义为慢请求,默认为最大数字
that.slowCometDuration = math.MaxInt64
//如果外部设置了该事件,则使用外部设置时间
if that.SlowCometDuration > 0 {
that.slowCometDuration = that.SlowCometDuration
}
if len(that.DefaultBodyCodec) == 0 {
that.DefaultBodyCodec = DefaultBodyCodec().Name()
}
//作为客户端,链接服务器重试间隔时间,默认为100毫秒
if that.RedialInterval <= 0 {
that.RedialInterval = time.Millisecond * 100
}
return nil
}
//返回网络地址
func (that *EndpointConfig) newAddr(network, ip, port string) (net.Addr, error) {
switch network {
default:
return nil, errors.New(" Invalid network config, refer to the following: tcp, tcp4, tcp6, unix, unixpacket, kcp or quic")
case "tcp", "tcp4", "tcp6":
return net.ResolveTCPAddr(network, net.JoinHostPort(ip, port))
case "unix", "unixpacket":
return net.ResolveUnixAddr(network, ip)
case "kcp", "udp", "udp4", "udp6", "quic":
udpAddr, err := net.ResolveUDPAddr("udp", net.JoinHostPort(ip, port))
if err != nil {
return nil, err
}
n := "kcp"
if network == "quic" {
n = "quic"
}
a := utils.NewFakeAddr(n, ip, strconv.Itoa(udpAddr.Port))
a.SetUdpAddr(udpAddr)
return a, nil
}
}
//默认消息体编码格式
var defaultBodyCodec codec.Codec = new(codec.JSONCodec)
// DefaultBodyCodec 获取当前默认消息体编码格式
func DefaultBodyCodec() codec.Codec {
return defaultBodyCodec
}
// SetDefaultBodyCodec 设置默认消息体编码格式
func SetDefaultBodyCodec(codecName string) error {
c, err := codec.GetByName(codecName)
if err != nil {
return err
}
defaultBodyCodec = c
return nil
}
// DefaultProtoFunc 默认传输协议
var DefaultProtoFunc = socket.DefaultProtoFunc
// SetDefaultProtoFunc 设置默认传输协议
var SetDefaultProtoFunc = socket.SetDefaultProtoFunc
// GetReadLimit 获取消息最大长度限制
var GetReadLimit = message.MsgSizeLimit
// SetReadLimit 设置消息最大长度限制
var SetReadLimit = message.SetMsgSizeLimit
// SetSocketKeepAlive 开启关闭死链检测
var SetSocketKeepAlive = socket.SetKeepAlive
// SetSocketKeepAlivePeriod 死链检测间隔时间
var SetSocketKeepAlivePeriod = socket.SetKeepAlivePeriod
// SocketReadBuffer 获取链接读缓冲区长度
var SocketReadBuffer = socket.ReadBuffer
// SetSocketReadBuffer 设置链接读缓冲区长度
var SetSocketReadBuffer = socket.SetReadBuffer
// SocketWriteBuffer 获取链接写缓冲区长度
var SocketWriteBuffer = socket.WriteBuffer
// SetSocketWriteBuffer 设置链接写缓冲区长度
var SetSocketWriteBuffer = socket.SetWriteBuffer
// SetSocketNoDelay 开启关闭no delay算法
var SetSocketNoDelay = socket.SetNoDelay
// 判断是否使用quic协议
func asQUIC(network string) string {
switch network {
case "quic":
return "udp"
default:
return ""
}
}
// 判断是否使用kcp协议
func asKCP(network string) string {
switch network {
case "kcp":
return "udp"
case "udp", "udp4", "udp6":
return network
default:
return ""
}
}