这篇文章主要是微服务客户端,函数,发布订阅...的实践。

想了解微服务服务端定义的请看我上一篇文章基于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实战