1. 服務註冊
1.1 程式碼演示
還是跟上一篇:go微服務(一) - go micro入門一樣使用consul
package main
import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/micro/go-micro/registry"
"github.com/micro/go-micro/web"
"github.com/micro/go-plugins/registry/consul"
)
func main() {
// 1.新增consul地址
cr := consul.NewRegistry(
registry.Addrs("127.0.0.1:8500"))
// 2.使用gin作為router
router := gin.Default()
router.GET("/user", func(c *gin.Context) {
c.String(http.StatusOK, "user api")
})
// 3.初始化go micro
server := web.NewService(
web.Name("productService"), // 當前微服務服務名
web.Registry(cr), // 註冊到consul
web.Address(":8081"), // 埠
web.Metadata(map[string]string{"protocol": "http"}), // 元資訊
web.Handler(router)) // 路由
_ = server.Run()
}
1.2 在go run的時候傳入服務註冊的引數
上面為了演示簡便,直接將服務註冊的服務名
和埠
等寫死在程式碼裡,但是實際運用場景不可能這麼寫,所以我們一般會
- 把這部分定義在配置檔案裡
- 使用go micro提供的功能,可以在
go run
的時候傳入引數
下面演示下如何在go run
的時候傳入引數
第一步
在原來的服務註冊的基礎程式碼上新增server.Init()
加上這個就會解析cli命令中的引數
如下導航到原始碼看下具體的實現,就是新增了Init()
方法之後,會將我們傳入的cli命令的特定引數,進行註冊,優先順序高於程式碼定義的
第二步
這裡選擇改變下服務註冊的埠,即在main包路徑下執行以下命令,且開兩個tab執行兩次
# tab1
go run productService_main.go --server_address :8088
# tab2
go run productService_main.go --server_address :8089
如下執行成功:
然後去consul介面檢視,兩個例項都註冊成功:
2. 服務發現均衡負載
2.1 均衡負載演算法
go-micro的服務發現的演算法由github.com/micro/go-micro/client/selector
下的selector
提供,目前提供了兩種演算法
- RoundRobin(輪詢演算法)
- Random(隨機演算法)
2.2 服務發現均衡負載的演示
使用上一節的方式,服務註冊部分,同時啟動了以下三個埠的productService
服務
- 8088
- 8089
- 8090
然後在服務發現部分:
- 使用
selector.Random
來隨機發現服務 - 使用for迴圈來持續獲取
- 列印出當前獲取到的服務例項的埠
func main() {
// 1.連線到consul
cr := consul.NewRegistry(registry.Addrs("127.0.0.1:8500"))
// 使用for迴圈持續獲取
for {
// 2.根據service name獲取對應的微服務列表
services, err := cr.GetService("productService")
if err != nil {
log.Fatal("cannot get service list")
}
// 3.使用random隨機獲取其中一個例項
next := selector.Random(services)
svc, err := next()
if err != nil {
log.Fatal("cannot get service")
}
fmt.Println("[測試輸出]:", svc.Address)
time.Sleep(time.Second * 1)
}
}
所以輸出的例項埠可以看如下,隨機獲取到三個埠中的任意一個
這時候吧8090
埠的服務給關掉,再看下輸出,就不會有8090
埠的例項了