• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Go-Micro微服务框架速学

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

 

3,模拟运行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[]

 

4,使用内置命令参数启动,注册多个服务

Go-micro 内置了 一些参数,可以在启动时 指定,这样就不用写死了

譬如地址: 我们可以 这样运行 go run prod_main.go --server_address :8001 别忘了,加上 server.Init()

server:=web.NewService(
		web.Name("prodservice"),
		//web.Address(":8001"),
		web.Handler(ginRouter),
		web.Registry(etcdReg),
		)

	server.Init()
	server.Run()

  

开启多个服务,用轮训方式获取服务

服务端:

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.Init()
    server.Run()

}

启动服务 并注册服务

go run prod_main.go --server_address :8001

go run prod_main.go --server_address :8002

go run prod_main.go --server_address :8003

客户端:

用轮训方式调用服务

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"
    "time"
)

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)

    for {
        etcdReg := etcd.NewRegistry(registry.Addrs("127.0.0.1:2379"))
        getService,err:=etcdReg.GetService("prodservice")
        if err!=nil{
            log.Fatal(err)
        }
        next:=selector.RoundRobin(getService)
        node,err:=next()
        if err!=nil{
            log.Fatal(err)
        }
        fmt.Println( node.Address)
        time.Sleep(time.Second*1)
    }
}

 

D:\gocode1.14.3\gocode\go-micro>go run  test.go
192.168.1.101:8002
192.168.1.101:8001
192.168.1.101:8003
192.168.1.101:8002
192.168.1.101:8001
192.168.1.101:8003

 

启动web管理界面:

web.bat

set MICRO_REGISTRY=etcd
set MICRO_REGISTRY_ADDRESS=localhost:2379
set MICRO_API_NAMESPACE=prodservice
micro web

 

5,服务调用:基本方式调用 Api(http api)

 

package main

import (
    "fmt"
    "github.com/micro/go-micro/v2/client/selector"
    "github.com/micro/go-micro/v2/registry/etcd"
    "github.com/micro/go-micro/v2/registry"
    "io/ioutil"
    "log"
    "net/http"
)

func callAPI(addr string,path string,method string) (string,error)  {
    req,_:=http.NewRequest(method,"http://"+addr+path,nil)
    client:=http.DefaultClient
    res,err:=client.Do(req)
    if err!=nil{
        return "",err
    }
    defer res.Body.Close()
    buf,_:= ioutil.ReadAll(res.Body)
    return string(buf),nil
}
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)

    callRes,err:=callAPI(node.Address,"/v1/prods","GET")
    if err!=nil{
        log.Fatal(err)
    }
    fmt.Println(callRes)

    //for {
    //    etcdReg := etcd.NewRegistry(registry.Addrs("127.0.0.1:2379"))
    //    getService,err:=etcdReg.GetService("prodservice")
    //    if err!=nil{
    //        log.Fatal(err)
    //    }
    //    next:=selector.RoundRobin(getService)
    //    node,err:=next()
    //    if err!=nil{
    //        log.Fatal(err)
    //    }
    //    fmt.Println( node.Address)
    //    time.Sleep(time.Second*1)
    //}
}

返回结果:

D:\gocode1.14.3\gocode\go-micro>go run  test.go
0b93cd42-ba4d-4dcc-afee-73eb00e87547 192.168.1.101:8002 map[]
[{"ProdID":100,"ProdName":"prodname100"},{"ProdID":101,"ProdName":"prodname101"},{"ProdID":102,"ProdName":"prodname102"},
{"ProdID":103,"ProdName":"prodna me103"},{"ProdID":104,"ProdName":"prodname104"}]

 

 服务调用_ 使用插件、调用http api的正规姿势(初步)

 使用插件

 

https://github.com/micro/go-plugins

这里面包含了很多go-micro可选插件。譬如服务注册中心要选择etcd、eureka等,就需要使用到插件(当然,手工玩耍也行)

安装go get github.com/micro/go-plugins
这个不多说了

 

http 包

对应的http调用包: import myhttp "github.com/micro/go-plugins/client/http " 此包除了有 http client基本功能,还支持Selector参数,

自动选取服务,并支持json、protobuf等数据格式

 

 

 

 

 

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
深入理解GO语言之内存详解发布时间:2022-07-10
下一篇:
go 版本 gRPC 环境搭建(3.0正式版)发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap