這篇文章主要是微服務客戶端,函式,釋出訂閱...的實踐。
想了解微服務服務端定義的請看我上一篇文章基於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三者之間的關係:
定義客戶端
在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
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實戰