1,引入外部框架gin生成web API
go版本为1.14
go-micro升级到1.14之后的一些变动和安装方式,确保你开启了go module模式
先装 go get github.com/micro/go-micro 然后装plugins go get github.com/micro/go-plugins
1,如果出现
请参考 这个帖子: https://github.com/golang/go/issues/34394
解决方法:在go.mod里加入 replace github.com/gogo/protobuf v0.0.0-20190410021324-65acae22fc9 => github.com/gogo/protobuf v0.0.0-20190723190241-65acae22fc9d 然后再执行安装:go get github.com/micro/go-plugins
2,如果出现
则可以这样: 首先安装 (注意后面的@master) go get github.com/lucas-clemente/quic-go@master 然后在go.mod里面找到 版本号 譬如是 github.com/lucas-clemente/quic-go v0.7.1-0.20191025234737-672328ca3059 然后 在go.mod里加入 replace github.com/lucas-clemente/quic-go => github.com/lucas-clemente/quic-go v0.7.1-0.20191025234737-672328ca3059
此时可以再次执行go get github.com/micro/go-micro (注意不要加-u)
有可能你会发现 go-plugins 木有consul相关内容;
那就只能这样了: go get github.com/micro/go-plugins@master
Github地址: https://github.com/micro/go-micro
本课程一律使用go module的方式 安装
package main import ( "github.com/gin-gonic/gin" "github.com/micro/go-micro/web" ) func main(){ ginRouter:=gin.Default() ginRouter.Handle("GET","/user", func(context *gin.Context) { context.String(200,"user api") }) ginRouter.Handle("GET","/news", func(context *gin.Context) { context.String(200,"news api") }) server:=web.NewService( web.Address(":8001"), web.Handler(ginRouter), ) server.Run() }
2,服务注册:快速把服务注册到etcd中
package main import ( "github.com/gin-gonic/gin" "github.com/micro/go-micro/registry" "github.com/micro/go-micro/registry/etcd" "github.com/micro/go-micro/web" ) func main(){ etcdReg := etcd.NewRegistry(registry.Addrs("127.0.0.1:2379")) ginRouter:=gin.Default() ginRouter.Handle("GET","/user", func(context *gin.Context) { context.String(200,"user api") }) ginRouter.Handle("GET","/news", func(context *gin.Context) { context.String(200,"news api") }) server:=web.NewService( web.Name("api.jtthink.com.prodservice"), web.Address(":8001"), web.Handler(ginRouter), web.Registry(etcdReg), ) server.Run() }
web.bat
set MICRO_REGISTRY=etcd set MICRO_REGISTRY_ADDRESS=localhost:2379 set MICRO_API_NAMESPACE=api.jtthink.com micro web
4,模拟运行API(主站API、商品API) 服务注册 服务发现
服务注册
首选编写服务端 服务注册到go-micro中
package ProdService import "strconv" type ProdModel struct { ProdID int ProdName string } func NewProd(id int,pname string ) *ProdModel { return &ProdModel{ProdName:pname,ProdID:id} } func NewProdList(n int) []*ProdModel { ret:=make([]*ProdModel,0) for i:=0;i<n;i++{ ret=append(ret,NewProd(100+i,"prodname"+strconv.Itoa(100+i))) } return ret }
package main import ( "github.com/gin-gonic/gin" "github.com/micro/go-micro/registry" "github.com/micro/go-micro/registry/etcd" "github.com/micro/go-micro/web" "gomicro.jtthink.com/ProdService" ) func main(){ etcdReg := etcd.NewRegistry(registry.Addrs("127.0.0.1:2379")) ginRouter:=gin.Default() v1Group:=ginRouter.Group("/v1") { v1Group.Handle("GET","/prods", func(context *gin.Context) { context.JSON(200,ProdService.NewProdList(5)) }) } server:=web.NewService( web.Name("prodservice"), web.Address(":8001"), web.Handler(ginRouter), web.Registry(etcdReg), ) server.Run() }
go run ./prod_main.go
服务发现
获取consul服务列表、selector随机选择
test.go
package main import ( "fmt" "github.com/micro/go-micro/client/selector" "github.com/micro/go-micro/registry" "github.com/micro/go-micro/registry/etcd" "log" ) func main() { etcdReg := etcd.NewRegistry(registry.Addrs("127.0.0.1:2379")) getService,err:=etcdReg.GetService("prodservice") if err!=nil{ log.Fatal(err) } next:=selector.Random(getService) node,err:=next() if err!=nil{ log.Fatal(err) } fmt.Println(node.Id,node.Address,node.Metadata) }
D:\gocode1.14.3\gocode\go-micro>go run test.go 6925a735-58c3-4148-92fa-d560d80d3bb7 192.168.1.101:8001 map[]