這篇文章主要是微服務客戶端,函數,發佈訂閱...的實踐。git
想了解微服務服務端定義的請看我上一篇文章基於Golang的微服務——Micro實踐(一)github
在 Micro 架構中, 一個完整的請求流程是:web
api-gateway => [customer-api | customer-web ] => customer-srv後端
其中 api-gateway 是 有 micro 工具直接提供的, customer-(api | web | srv) 則是 micro中的開發概念.api
在 micro 中, 服務分爲三種類型:bash
附一張圖演示這SRV, API, WEB三者之間的關係:架構
在popular
項目目錄下新建文件 client.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是指接收一次請求,執行後便退出的服務
只須要稍微改造下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實戰