micro如何实现插件化

介绍

micro微服务框架,基于go语言的可插拔的微服务框架,官方github:micro微服务框架github地址,主要有两部分组成:

  • go-micro 微服务的核心架构;
  • micro 基于go-micro开发的一套工具集,操作go-micro

go-micro 主要有六个包,以下是官方对这六个包说明

  • server :Server包是使用编写服务的构建包,可以命名服务,注册请求处理器,增加中间件等等。服务构建在以上说的包之上,提供独立的接口来服务请求。现在服务的构建是RPC系统,在未来可能还会有其它的实现。服务端允许定义多个不同的编码来服务不同的编码消息
  • client :客户端提供接口来创建向服务端的请求。与服务端类似,它构建在其它包之上,它提供独立的接口,通过注册中心来基于名称发现服务,基于选择器(selector)来负载均衡,使用transport、broker处理同步、异步消息
  • broker :Broker提供异步通信的消息发布/订阅接口。对于微服务系统及事件驱动型的架构来说,发布/订阅是基础。一开始,默认我们使用收件箱方式的点到点HTTP系统来最小化依赖的数量。但是,在go-plugins是提供有消息代理实现的,比如RabbitMQ、NATS、NSQ、Google Cloud Pub Sub等等。
  • register :注册提供了服务发现机制来解析服务名到地址上。它可以使用Consul、etcd、zookeeper、dns、gossip等等提供支持。服务使用启动注册关机卸载的方式注册。服务可以选择性提供过期TTL和定时重注册来保证服务在线,以及在服务不在线时把它清理掉
  • selector :选择器是构建在注册这上的负载均衡抽象。它允许服务被过滤函数过滤掉不提供服务,也可以通过选择适当的算法来被选中提供服务,算法可以是随机、轮询(客户端均衡)、最少链接(leastconn)等等。选择器通过客户端创建语法时发生作用。客户端会使用选择器而不是注册表,因为它提供内置的负载均衡机制
  • transport :Transport是服务与服务之间同步请求/响应的通信接口。和Golang的net包类似,但是提供更高级的抽象,请允许我们可以切换通信机制,比如http、rabbitmq、websockets、NATs。传输也支持双向流,这一强大的功能使得客户端可以向服务端推送数据

如何实现插件化

以上六个包,也可以理解为go-micro的核心六个服务,这六个服务都是可以插件化开发的,每个包下面都有一个与包同名的go文件定义了服务的接口,通过实现接口来实现插件,以server举例:
server.go 中的接口定义如下:

// Server is a simple micro server abstraction
type Server interface {
	Options() Options
	Init(...Option) error
	Handle(Handler) error
	NewHandler(interface{}, ...HandlerOption) Handler
	NewSubscriber(string, interface{}, ...SubscriberOption) Subscriber
	Subscribe(Subscriber) error
	Start() error
	Stop() error
	String() string
}

go-micro中 server的默认实现是 micro 官方实现的基于http的rpc服务:rpc_server.go 文件,此外,micro 官方提供了一些其他的实现,这些插件都在go-plugins包里面,github地址:go-plugins
我们可以具体看看其中的server的grpc插件,go-plugins 目录下的server包里面就是关于server模块的插件,这里有两个,一个grpc实现,基于google开源的grpc实现,另一个是基于http协议的实现:

重点关注下grpc/grpc.go 文件,这是server接口的实现都在grpc.go文件里面;grpc.go 有段代码需要注意下:

func init() {
	encoding.RegisterCodec(jsonCodec{})
	encoding.RegisterCodec(bytesCodec{})
	//在替换插件的时候,就是通过导入包的时候,执行init() 方法,将新的插件加入到默认的服务队列
	cmd.DefaultServers["grpc"] = NewServer
}

cmd.DefaultServers 是一个map存储了所有的servers插件,我们的插件的替换,都是先将插件添加到map中,然后在启动服务的时候指定插件。我们可以在cmd包里看到默认支持的server:

DefaultBrokers = map[string]func(...broker.Option) broker.Broker{
		"http":   http.NewBroker,
		"memory": memory.NewBroker,
	
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值