社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
最近学了个微服务的新框架,根据自己的理解,梳理了下这个框架,做了个架构图
Micro 工具集:管理和micro框架的包,可以启动API网关,指定处理器,提供了服务创建模版等功能,并且micro工具集的各个模块是可插拔的插件化开发模式
go-micro: micro 框架的核心基础服务,也是可插拔化的
关于这两个模块的介绍,可以看我的这篇博客:micro如何实现插件化
API 网关,是服务对外暴露的唯一接口,micro 为我们提供了多种处理模式来处理来到的http请求,对应图中的handler,下面是每个handler 的介绍(引用官方):
除了这几种处理器的方式外,micro Api 网关还提供了一个直接访问service 方式,即图中的rpc 方式,这种方式是通过访问 http:ip:8080/rpc, 然后在post 提交的内容指定 服务路径的方式,绕过 micro web、micro api 等 直接访问servcies,例如:
curl -d 'service=go.micro.srv.greeter' -----服务路径
-d 'method=Say.Hello' -------处理方法
-d 'request={"name": "John"}' --------请求参数
http://localhost:8080/rpc
micro web 和 micro api 是我们业务逻辑的实现,可以是网站后台,可以是restful api ,通常对services的调用,都是通过web和api的间接调用,是我们提供给外部调用的服务模块;services 是我们内部的rpc微服务,可以是一些通用的、核心的服务组件或者些其他的我们希望对外封闭的东西,比如:游戏充值,跨游戏之间的服务调用等。micro client 是我们services的客户端,micro web,micro api 等都是通过client 调用 services。
这部分是框架的基础模块了,包括服务的发现、注册;发布订阅订阅功能;负载均衡;同步通信协议;异步通信;通信元数据的编码方式;(引用官网的介绍)
注册(Registry)
注册提供了服务发现机制来解析服务名到地址上。它可以使用Consul、etcd、zookeeper、dns、gossip等等提供支持。服务使用启动注册关机卸载的方式注册。服务可以选择性提供过期TTL和定时重注册来保证服务在线,以及在服务不在线时把它清理掉。
选择器(Selector)
选择器是构建在注册这上的负载均衡抽象。它允许服务被过滤函数过滤掉不提供服务,也可以通过选择适当的算法来被选中提供服务,算法可以是随机、轮询(客户端均衡)、最少链接(leastconn)等等。选择器通过客户端创建语法时发生作用。客户端会使用选择器而不是注册表,因为它提供内置的负载均衡机制。
传输(Transport)
Transport是服务与服务之间同步请求/响应的通信接口。和Golang的net包类似,但是提供更高级的抽象,请允许我们可以切换通信机制,比如http、rabbitmq、websockets、NATs。传输也支持双向流,这一强大的功能使得客户端可以向服务端推送数据。
代理(Broker)
Broker提供异步通信的消息发布/订阅接口。对于微服务系统及事件驱动型的架构来说,发布/订阅是基础。一开始,默认我们使用收件箱方式的点到点HTTP系统来最小化依赖的数量。但是,在go-plugins是提供有消息代理实现的,比如RabbitMQ、NATS、NSQ、Google Cloud Pub Sub等等。
编码(Codec)
编码包用于在消息传输到两端时进行编码与解码,可以是json、protobuf、bson、msgpack等等。与其它编码方式不同,我们支持RPC格式。所以我们有JSON-RPC、PROTO-RPC、BSON-RPC等格式。
编码包把客户端与服务端的编码隔离开来,并提供强大的方法来集成其它系统,比如gRPC、Vanadium等等。
Server(服务端)
Server包是使用编写服务的构建包,可以命名服务,注册请求处理器,增加中间件等等。服务构建在以上说的包之上,提供独立的接口来服务请求。现在服务的构建是RPC系统,在未来可能还会有其它的实现。服务端允许定义多个不同的编码来服务不同的编码消息。
Client(客户端)
客户端提供接口来创建向服务端的请求。与服务端类似,它构建在其它包之上,它提供独立的接口,通过注册中心来基于名称发现服务,基于选择器(selector)来负载均衡,使用transport、broker处理同步、异步消息。
上面的这些组件都可以在micro中,从更高的角度看成是服务(Service)
这是micro框架提供的一些插件,我们知道go-micro是可插拔化的,想server、registry、broker等六个基础服务都是可以被替换的,go-plugins 就是这些相关插件的一个集合,也可以根据自己需求自己去实现,关于插件的开发可以通过前面提到那边博客了解下
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!