本章节阐述go-micro 服务发现原理
go-micro架构
下图来自go-micro官方
阅读本文前你可能需要进行如下知识储备
- golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境,
- golang微服务框架go-micro 入门笔记2.1 micro工具之micro api
- golang微服务框架go-micro 入门笔记2.2 micro工具之micro web
- golang微服务框架go-micro 入门笔记2.3 micro工具之消息订阅和发布
Service
实现如下接口的,都是Service
type Service interface {
Init(...Option)
Options() Options
Client() client.Client
Server() server.Server
Run() error
String() string
}
我们根据常见的service初始化流程来理解这个接口
func main() {
// New Service
service := micro.NewService(
micro.Name("go.micro.srv.broker"),
micro.Version("latest"),
)
// Initialise service
service.Init()
// Register Struct as Subscriber
micro.RegisterSubscriber("go.micro.srv.broker", service.Server(), new(subscriber.Broker))
// Register Function as Subscriber
micro.RegisterSubscriber("go.micro.srv.broker", service.Server(), subscriber.Handler)
// Run service
if err := service.Run(); err != nil {
log.Fatal(err)
}
}
micro.NewService
micro.NewService的函数调用关系如下
该函数主要是初始化一个service并设置service的常用属性属性,代码如下:
opt := micro.Options{
Broker: broker.DefaultBroker,
Cmd: cmd.DefaultCmd,
Client: client.DefaultClient,
Server: server.DefaultServer,
Registry: registry.DefaultRegistry
}
micro.Options全部属性包含如下几个方面
type micro.Options struct {
Broker broker.Broker //订阅事件用的
Cmd cmd.Cmd //命令行用的
Client client.Client //作为服务消费者,用来发送请求
Server server.Server //作为服务提供者用来监听请求
Registry registry.Registry //这个是服务发现支持
Transport transport.Transport //这是网络传递用的
// Before and After funcs
BeforeStart []func() error //服务start钱的回调函数
BeforeStop []func() error //服务stop后的回调函数
AfterStart []func() error //服务start后的回调函数
AfterStop []func() error //服务stop后的回调函数
// Other options for implementations of the interface
// can be stored in a context
Context context.Context //有时候服务需要携带一些参数,需要规定时间内返回,可以用这个来承载
}
我们可以通过micro.Options.Server.Options获得server的属性,实际上server还有其他的属性,server的全部参数属性如下
type server.Options struct {
Codecs map[string]codec.NewCodec //订阅事件用的
Broker broker.Broker //订阅事件用的
Registry registry.Registry //这个是服务发现支持
Transport transport.Transport //节点之间网络传递用的
Metadata map[string]string //传递一些k,v数据用
Name string //名称
Address string //服务地址
Advertise string //广播地址
Id string //服务ID
Version string //处理程序wrapper
HdlrWrappers []HandlerWrapper //网络处理程序封装
SubWrappers []SubscriberWrapper //订阅程序封装
// RegisterCheck runs a check function before registering the service
RegisterCheck func(context.Context) error //注册服务前的校验函数
// The register expiry time
RegisterTTL time.Duration //注册服务生命周期,过了这么长事件需要重新注册
// The interval on which to register
RegisterInterval time.Duration //多长时间注册一次
// The router for requests
Router Router //请求的路由表
// Other options for implementations of the interface
// can be stored in a context
Context context.Context //有时候服务需要携带一些参数,需要规定时间内返回,可以用这个来承载
}
如果server需要配置额外的属性,则调用属性配置函数来刷新配置。如Name()
运行结果是返回一个函数,因此最后通过server.Name(name)
来刷新这个函数,
micro.Name("go.micro.srv.broker"),
// Name of the service
func Name(n string) Option {
return func(o *Options) {
o.Server.Init(server.Name(n))
}
}
函数关系如下
注意最后的o.Name即设置service.Options.Name = name
micro.Version("latest")
也是一样的
service.Init
init 函数原型如下
func (s *service) Init(opts ...Option) {
// process options
for