Go-micro学习笔记
-目录-
Go-micro
原理


Service通过Register注册到服务中心,Client通过Selector模块选择Service并进行负载均衡,从注册中心拿到服务节点然后通过节点信息通过Transport定义的通信协议来进行通信。
详细介绍
整个Go Micro 都是有这8个interface构成的。
- Transport 服务通信接口
- Codec 传输编码与解码
- Registry 服务注册于发现,如consul
- Selector 客户端级别的负载均衡,当有客户端向服务发送请求时, selector根据不同的算法从Registery中的主机列表,得到可用的Service节点,进行通信
- Broker 消息发布和订阅,可以使服务订阅某个主题,当有信息发布时,所有的监听服务都会收到信息,根据你的需要做相应的行为
- Client 是请求服务的接口,他封装Transport和Codec进行rpc调用,也封装了Brocker进行信息的发布
- Server 监听等待rpc请求,监听Broker的订阅信息
- Service Service是Client和Server的封装,他包含了一系列的方法使用初始值去初始化Service和Client,使我们可以很简单的创建一个rpc服务
操作
使用micro new创建项目
new命令:
--namespace "go.micro" 命名空间(首部)e.g com.example
--type "srv" 服务类型 e.g api, fnc, srv, web
--fqdn 全限定域名 服务的全名称包括命名空间和别名 e.g com.example.srv.service (defaults to namespace.type.alias)
--alias 给项目名称起别名 (末尾)
--plugin [--plugin option --plugin option] Specify plugins e.g --plugin=registry=etcd:broker=nats or use flag multiple times
后端服务先在consul上注册,然后前端需要调用时根据后端服务注册时的名字,调用服务。
前端:
// main.go
// 注册路由
service.HandleFunc("/example/call", handler.ExampleCall)
// handler.ExampleCall()
//根据服务调用,因为之前引入了service的微服务的Protobuf包,所以可以直接调用生成的方法
//service的微服务的Protobuf包可谓是又当又立,既定义了注册服务方法,又定义了获取服务方法,又定义了这些方法所用到的数据类型
//根据名称获取服务 后面的client是服务通讯协议可以是grpc(消息编码解码是Protobuf)
exampleClient := example.NewExampleService("go.micro.srv.test_srv", client.DefaultClient)
//返回的值也是service里的微服务Protobuf包定义的消息类型
rsp, err := exampleClient.Call(context.TODO(), &example.Request{
Name: request["name"].(string),
})
后端:
// New Service
service := micro.NewService(
micro.Name("go.micro.srv.test_srv"),
micro.Version("latest"),
)
// Initialise service
service.Init()
// Register Handler
//service注册服务,有服务名称,和实现方法的一个struct,或者说是有一系列方法的类
example.RegisterExampleHandler(service.Server(), new(handler.Example))