服务注册&发现原理
注册中心选型
选项模式介绍
问题描述
type Options struct{
StrOption1 string
StrOption2 string
StrOption3 string
IntOption1 int
IntOption2 int
IntOption3 int
}
解决方案一
func InitOptions1(strOption1 string,strOption2 string,strOption3 string,
IntOption1 int,IntOption2 int,IntOption3 int){
options := &Options{}
options.StrOption1 = strOption1
options.StrOption2 = strOption2
options.StrOption3 = strOption3
options.IntOption1 = IntOption1
options.IntOption2 = IntOption1
options.IntOption3 = IntOption1
fmt.Printf("init options1:%#v \n",options)
return
}
解决方案二
func InitOptions2(opts ...interface{}){
options := Options{}
for index,opt := range opts{
switch index{
case 0:
str,ok := opt.(string)
if !ok {
return
}
options.StrOption1 = str
case 1:
str,ok := opt.(string)
if !ok {
return
}
options.StrOption2 = str
case 2:
str,ok := opt.(string)
if !ok {
return
}
options.StrOption3 = str
case 3:
val,ok := opt.(int)
if !ok {
return
}
options.IntOption1 = val
case 4:
val,ok := opt.(int)
if !ok {
return
}
options.IntOption2 = val
case 5:
val,ok := opt.(int)
if !ok {
return
}
options.IntOption3 = val
}
}
解决方案三(选项模式)
type Option func(opts *Options)
func InitOption3(opts ...Option){
option := &Option{}
for _,opt := range opts{
opt(options)
}
fmt.Printf("init option3:%#v \n",options)
}
func WithStringOption1(str string) Option{
return func(opts *Options){
opts.StrOption1 = str
}
}
func WithStringOption2(str string) Option{
return func(opts *Options){
opts.StrOption2 = str
}
}
注册组件设计
目标
支持多注册中心
支持可扩展
基于接口的设计思路
基于插件的设计思路
接口定义
import(
"context"
)
type Register interface{
Init(opts ...Option)
Register(ctx context.Context,service *Service)
Unregister(ctx context.Context,service *Service)
}
数据结构定义
package register
//服务抽象
type Service struct{
Name string
Node []*Node
}
//服务节点的抽象
type Node struct{
Id string
IP string
Port int
}
基于插件的设计思路
插件抽象
1.实现了Registry接口,就是一个注册插件
2.基于etcd的注册插件
3.基于consul的注册插件
4.基于zookeeper的注册插件
插件管理
1.提供RegisterPlugin函数,用来注册插件
2.基于名字对插件进行管理
3.插件初始化,通过名字对插件进行初始化
插件查找
1.通过名字查找到对应的插件,并返回
2.调用方通过返回的插件实现操作服务注册和发现
etcd注册插件开发
实现Register接口
服务注册