它是一個可插入的RPC框架,用於在Go中編寫微服務。開箱即用,您將收到:git
Go 微體系結構能夠描述爲三層堆棧github
頂層由客戶端-服務器模型和服務抽象組成。web
底層由如下類型的插件組成:算法
Go Micro
還提供了Sidecar
等功能。這使您能夠使用Go
之外的語言編寫的服務Sidecar提供服務註冊,gRPC編碼/解碼和HTTP處理程序。它支持多種語言。docker
最簡單的用法大概以下,結合net/http
標準庫監聽路由shell
package main import ( "github.com/micro/go-micro/web" "net/http" ) func main() { server := web.NewService(web.Address(":8081")) // 路由 server.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("hello go micro")) }) _ = server.Run() }
也能夠集成第三方web框架做爲路由json
gin
package main import ( "net/http" "github.com/gin-gonic/gin" "github.com/micro/go-micro/web" ) func main() { // 使用gin做爲路由 r := gin.Default() r.GET("/user", func(c *gin.Context) { c.String(http.StatusOK, "user api") }) server := web.NewService( web.Address(":8081"), // 端口 web.Metadata(map[string]string{"protocol": "http"}), // 元信息 web.Handler(r)) // 路由 _ = server.Run() }
微服務裏最重要的關鍵一步就是服務註冊bootstrap
經常使用的有consul、etcd、zookeeper、eurekaapi
咱們這裏使用consul服務器
這裏直接使用docker安裝
docker run -d --name=cs -p 8500:8500 consul agent -server -bootstrap -ui -client 0.0.0.0
而後再訪問端口8500,以下現實安裝成功
github.com/micro/go-micro/registry/consul
上面這個在1.14.0版本以後刪除了,要用這個github.com/micro/go-plugins/registry/consul
,或者換成etcd做爲註冊中心
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() { // 添加consul地址 cr := consul.NewRegistry( registry.Addrs("127.0.0.1:8500")) // 使用gin做爲router router := gin.Default() router.GET("/user", func(c *gin.Context) { c.String(http.StatusOK, "user api") }) // 初始化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() }
把上述代碼運行起來,再去consul
界面查看,發現productService
服務添加成功
而後把代碼停掉,再去consul
界面查看,productService
就沒了,很是方便
package main import ( "fmt" "log" "github.com/micro/go-micro/client/selector" "github.com/micro/go-micro/registry" "github.com/micro/go-plugins/registry/consul" ) func main() { // 1.鏈接到consul cr := consul.NewRegistry(registry.Addrs("127.0.0.1:8500")) // 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.Id, svc.Address, svc.Metadata) }
而後使用goland先啓動服務註冊中的productService
的微服務,再啓動服務發現中的代碼。
服務發現將會輸出以下,服務發現成功: