概述
微服務示例所用框架為Go-micro和Gin的開發框架,示例主要分為服務端go-provider服務提供者和客戶端go-consumer服務消費者,服務端go-provider主要是通過protobuf定義服務接口,并使用gRPC作為底層傳輸;客戶端主要是基于Gin的web框架,通過外部Http接口調用觸發內部RPC調用遠程服務端go-provider的服務。注冊中心采用nacos作為服務發現和治理。
代碼所依賴的環境變量如下:
| 環境變量名 | 是否必填 | 說明 |
| NacosAddr | 是 | nacos注冊中心(ip+port) |
| NamespaceId | 是 | nacos命名空間 |
| Username | 是 | nacos用戶名 |
| PwCode | 是 | nacos密碼(未加密) |
| APM_TOKEN | 否 | 接入APM所需TOKEN |
| APM_ENDPOINT | 否 | 接入APM節點 |
| SERVICE_NAME | 是 | 接入APM上報節點(項目code.環境code.應用實例名) |
說明
如果用戶要接入APM,創建應用實例時,應用實例名要和應用名一致,否則鏈路上報可能不成功
Go-Provider
創建microService服務,定義服務名:go-provider,注冊中心支持consul、nacos等,這里使用nacos注冊中心,同時注冊了一個user服務,通過暴露50051端口提供外部服務。
參考代碼如下:
nacosAddr := os.Getenv(utils.NacosAddr)
namespaceId := os.Getenv(utils.NamespaceId)
username := os.Getenv(utils.Username)
pwCode := os.Getenv(utils.PwCode)
registry := nacos.NewRegistry(nacos.WithAddress(addrs), nacos.WithClientConfig(config))
// 初始化 OpenTelemetry Tracer
shutdown := apm.InitProviderHttp()
defer shutdown()
ip, err2 := utils.GetContainerIP()
if err2 != nil {
log.Errorf("GetContainerIP err:%v", err2)
}
// Create service
srv := micro.NewService(
micro.Name(service),
micro.Version(version),
micro.Address(ip+":50051"),
micro.Registry(registry),
micro.WrapHandler(utils.MicroGoMicroServerTrace()),
)
srv.Init()
// Register handler
err := pb.RegisterUserHandler(srv.Server(), new(handler.User))
if err != nil {
fmt.Println("RegisterUserHandler err: ", err)
return
}
Go-Consumer
首先創建microClient的客戶端服務,通過pb生成的遠程服務端grpc服務,注入遠程服務名:go-provider,暴露8080端口,服務內部解析請求參數,調用遠程服務返回響應結果。
參考代碼如下:
nacosAddr := os.Getenv(NacosAddr)
namespaceId := os.Getenv(NamespaceId)
username := os.Getenv(Username)
pwCode := os.Getenv(PwCode)
registry := nacos.NewRegistry(nacos.WithAddress(addrs), nacos.WithClientConfig(config))
// 構建完整的服務地址
microService := micro.NewService(
micro.Name(service),
micro.Version(version),
micro.Registry(registry)
)
getService, err := registry.GetService("go-provider")
if err != nil {
fmt.Printf("GetService err:%v\n\n", err)
}
microService.Init()
客戶端服務定義完成之后,通過Gin服務框架對外提供Restful的服務。
flag.Parse()
shutdown := apm.InitProviderHttp()
defer shutdown()
router := gin.Default()
// 使用OpenTelemetry中間件
router.Use(otelgin.Middleware("go-consumer"))
router.Static("/home", "view")
r1 := router.Group("/api")
{
r1.GET("/user", func(c *gin.Context) {
controller.GetUserInfo(c)
})
}
router.Run(":8080")
鏡像包上傳
將客戶端和服務端構建鏡像之后,登錄用戶所在集群,可以在云容器引擎界面進入容器鏡像服務菜單。
登錄云容器引擎控制臺,左側菜單欄選擇“容器鏡像服務>實例列表”。
點擊“實例名稱”進入實例詳情,左側菜單欄點擊“鏡像倉庫”,創建鏡像倉庫,填寫鏡像倉庫信息。
命名空間:倉庫命名空間
倉庫名稱:鏡像名稱
倉庫類型: 選擇公開
3. 點擊“訪問憑證”,拿到賬號和密碼,登錄集群推送鏡像。
云容器實例開通
選擇云容器引擎->創建集群,開通云容器引擎實例。
前提條件
已創建對應技術棧類型的項目,并且與云容器引擎的環境關聯。
已創建支持應用性能監控的技術棧版本。
應用實例創建
登錄微服務云應用控制臺,左側菜單欄選擇“應用運維>容器應用實例>應用發布>應用實例”,點擊左側頂部“創建應用實例”,填寫應用實例基本信息。
在基本信息中選擇鏡像部署,在點擊“下一步”來到“部署配置“,填寫部署配置信息。
選擇集群以及鏡像,這里以go-consumer:1.0.0的demo鏡像為例,在“監控及治理方案“選項中勾選“接入應用性能監控”。
點擊“環境變量”,設置環境變量信息。
5. 點擊下一步,創建應用實例,最后發布部署。
6. 部署成功后,進入對應的容器應用實例的“應用總覽”,在“容器組Pod”欄下,選擇對應pod的“終端“,點擊進入云容器引擎終端控制臺。
7. 在終端控制臺中執行curl 127.0.0.1:8080/api/user?name=helloworld命令,輸出
{
"errno": "0",
"errmsg": "成功",
"data": {
"name": "helloworld"
}
}
則表示微服務調用成功。
8. 鏈路調用校驗,在指定容器應用實例選擇“應用監控>調用鏈查詢”,即可看到對應調用鏈路,表示應用性能監控正常。