Go-Micro微服务框架速学

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
}
D:\gocode1.14.3\gocode\go-micro\ProdService\ProdModels.go
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[]

 

猜你喜欢

转载自www.cnblogs.com/sunlong88/p/12952907.html