它是一个可插入的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
的微服务,再启动服务发现中的代码。
服务发现将会输出以下,服务发现成功: