这篇文章主要是微服务客户端,函数,发布订阅...的实践。
想了解微服务服务端定义的请看我上一篇文章基于Golang的微服务——Micro实践(一)
在 Micro 架构中, 一个完整的请求流程是:
api-gateway => [customer-api | customer-web ] => customer-srv
其中 api-gateway 是 有 micro 工具直接提供的, customer-(api | web | srv) 则是 micro中的开发概念.
在 micro 中, 服务分为三种类型:
- srv:srv 是标准的 RPC 服务, 也可以叫做后端服务, 开发人员通常写的就是这种类型. 在 Micro 的设想中, 这一服务永远不会面向用户,属于内部服务.
- api:提供 HTTP 到 RPC 的转换服务, API 网关默认情况下会将请求转发给它来处理.
- web:Micro 认为 web 也可以当做微服务来创建.
附一张图演示这SRV, API, WEB三者之间的关系:

定义客户端
popularclient.go
package main
import (
"context"
"fmt"
micro "github.com/micro/go-micro"
proto "popular/proto"
)
func main() {
// 定义服务,可以传入其它可选参数
service := micro.NewService(micro.Name("popular.client"))
service.Init()
// 创建新的客户端
popular := proto.NewGreeterService("popular", service.Client())
// popular
rsp, err := popular.Ping(context.TODO(), &proto.PingRequest{Name: "winyh"})
if err != nil {
fmt.Println(err)
}
// 打印响应请求
fmt.Println(rsp.Popularing)
}
复制代码
运行客户端
go run client.go
复制代码
输出内容为:
Ping winyh
复制代码
定义Function
Function是指接收一次请求,执行后便退出的服务
main.go
package main
import (
"context"
"fmt"
micro "github.com/micro/go-micro"
proto "popular/proto"
)
type Popular struct{}
func (g *Popular) Ping(ctx context.Context, req *proto.PingRequest, rsp *proto.PingResponse) error {
rsp.Popularing = "Ping " + req.Name
return nil
}
func main() {
// 创建新的服务,这里可以传入其它选项。
service := micro.NewService(
micro.Name("popular"),
)
// 初始化方法会解析命令行标识
service.Init()
// 注册处理器
proto.RegisterPopularHandler(service.Server(), new(Popular))
// 运行服务
if err := service.Run(); err != nil {
fmt.Println(err)
}
/********* == 函数定义 == *********/
// 创建新函数
fnc := micro.NewFunction(
micro.Name("popular"),
)
// 初始化命令行
fnc.Init()
// 注册handler
fnc.Handle(new(Popular))
// 运行服务
fnc.Run()
}
复制代码
发布与订阅
Go-micro 给事件驱动架构内置了消息代理(broker)接口。发布与订阅像RPC一样操控生成的protobuf消息。这些消息会自动编/解码并通过代理发送.
[这部分我得理解下...],先写我之前练手的一个小项目 基于Golang的开发框架Gin实战