前言
上一篇 咱们讲了服务注册的外部设计,写了一个服务的管理工具
type Server struct {serviceMap map[string]*service
options *Options
beforeMiddleware []MiddlewareFunc
afterMiddleware []MiddlewareFunc
beforeMiddlewarePath map[string][]MiddlewareFunc
afterMiddlewarePath map[string][]MiddlewareFunc}
这次咱们看看服务的配置如何写 才最优雅
先来看看 Options
type Options struct {
Protocol transport.Protocol
UseHttp bool
Uri string
nl net.Listener
ctx context.Context
options map[string]interface{} // 零散配置
Trace bool
readTimeout time.Duration
writeTimeout time.Duration
processChanSize int
MaximumLoad int64
RSAPublicKey []byte
RSAPrivateKey []byte
AuthFunc AuthFunc
Discovery discovery.Discovery
registryAddr string
weights float64
}
这里有十分多 能够填写的中央
如果咱们采纳 最原始的形式 这个配置就会十分的简短 不好保护
func NewServer(protocol transport.Protocol, useHttp bool, uri string, nl net.listener ...)
咱们当初引入一个新的设计形式
type Option func(options *Options)
咱们定义一个 办法, 这个办法的入参 就是 咱们下面看到配置的指针 咱们能够更具下面的参数定义多个相似的办法
func UseTCP(host string) Option {return func(options *Options) {
options.Uri = host
options.Protocol = transport.TCP
}
}
func UseUnix(addr string) Option {return func(options *Options) {
options.Uri = addr
options.Protocol = transport.UNIX
}
}
func UseKCP(host string) Option {return func(options *Options) {
options.Uri = host
options.Protocol = transport.KCP
}
}
当应用时 咱们只有传入多个 Option 办法 就能够实现对配置的设置
func (s *Server) Run(options ...Option) error {
for _, fn := range options {fn(s.options)
}
}
是不是就十分 清晰了呢 …