Go:服务注册组件开发

服务注册&发现原理

           

注册中心选型

选项模式介绍

问题描述

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接口

服务注册

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值