go-micro微服务框架使用--golang

吴德辉
2023-12-01

 

go-micro的简介:

可插入RPC分布式系统开发的框架,支持json,proto -rpc的编码方式,可使用consul或者其它方式的服务发现,默认是consul提供随机散列的负载均衡。

     1.服务发现  2.编码解码 3.服务端,客户端 4.发布订阅消息

 

以下是详情说明下:

1.安装 micro install

$ go get -u github.com/micro/micro

提示缺少golang/net ,text,tools,crypto, hashicorp/consul几个包,一般情况下是需要去github上把这些缺少的包都下全,micro才被安装成功

go get : 其实是go命令的下载与安装两步合并,

-u : 只更新已有的代码包

-v: 显示更新过程

2.首次如何使用micro,第一次可以利用micro命令自动生成一个模板srv工程(业务服务模块),也可以自己新建

$ micro new  example 

(默认为生成名为example的srv服务)

        —type “api” 

        —type “web”

        —type “srv”  

到此已经生成一个工程,工程下面包含一个proto文件夹,下面做详情说明

3.protoc 说明:

micro 依赖google的protobuf,这里要熟悉protoc的命令使用

$ protoc --proto_path=. --micro_out=. --go_out=.  ./greeter/greeter.proto

--proto_path等同于-I选项:

-IPATH, --proto_path=PATH  

Specify the directory in which to search for   imports.  May be specified multiple times;  directories will be searched in order.  If not  given, the current working directory is used.

--go_out : 生成.go文件后要存放的路径(这里应该是和.proto文件放在同一路径)

./greeter/greeter.proto : 这是我的.proto文件所在位置

报错:

--micro_out: protoc-gen-micro: 系统找不到指定的文件

提示下面protoc相关依赖包

$ go get github.com/micro/protoc-gen-micro

--go_out: protoc-gen-go: 系统找不到指定的文件。

$ go get -u github.com/golang/protobuf/protoc-gen-go

下载完成之后,再次运行以上命令

$ protoc --proto_path=. --micro_out=. --go_out=.  ./greeter/greeter.proto

protoc-gen-micro: program not found or is not executable

--micro_out: protoc-gen-micro: Plugin failed with status code 1.

 

需要通过如下方式解决

$ protoc \
--plugin=protoc-gen-go=${GOPATH}/bin/protoc-gen-go \
--plugin=protoc-gen-micro=${GOPATH}/bin/protoc-gen-micro \
--proto_path=${GOPATH}/src:. \
--micro_out=. --go_out=. \
proto/*.proto

运行make后再对应目录下生成这两个文件

生成example.micro.go

生成example.pb.go

protobuf使用介绍得差不多,后面要把服务跑起来

运行micro

直接go run main.go即可,把服务端的代码跑起来

package main

import (
    "context"
    "fmt"
    micro "github.com/micro/go-micro"
    proto "../greeter"
)

type Greeter struct{}

func (g *Greeter) Call(ctx context.Context, req *proto.HelloRequest, rsp *proto.HelloResponse) error {
        fmt.Println("11")
        rsp.Greeting = "Hello " + req.Name
        return nil
}

func main() {

    // Create a new service. Optionally include some options here.
        service := micro.NewService(
        micro.Name("greeter"),
    )
    // Init will parse the command line flags.
    service.Init()
// Register handler
    proto.RegisterGreeterHandler(service.Server(), new(Greeter))
// Run the server
    if err := service.Run(); err != nil {
        fmt.Println(err)
    }
}

传参方式 : 1.可以在创建时传入 (构造的方式)  2.可以用命令行方式 (micro.Flags() ) 与go原生接收命令行参数相同

  如何调用服务端代码

方式一客户端调用(再跑一个相同的服务,main.go文件改成以下方式)

通过protobuf方式进行调用,跨语言

package main
import (
    "context"
    "fmt"
    proto "../greeter"
    "github.com/micro/go-micro"
)
func main() {
    // Create a new service. Optionally include some options here.
    service := micro.NewService(micro.Name("greeter.client"))
    service.Init()
// Create new greeter client
    greeter := proto.NewGreeterService("greeter", service.Client())
// Call the greeter,通过protobuf生成的函数进行调用其它微服务

    rsp, err := greeter.Hello(context.TODO(), &proto.HelloRequest{Name: "John"})
    if err != nil {
        fmt.Println(err)
    }
    // Print response
    fmt.Println(rsp.Greeting)
}

方式二

以上启动的srv服务都是不能被http直接调用,需要再启动micro api 

$ micro api 

通过http调用  http://localhost:8080/rpc

{ "service": "go.exb",  "method": "Example.Call", "request": {"name": "John”} }

也可以通过micro call命令调用服务

$ ./micro call go.exa Example.Call '{"name": "John”}'

go.exb  : namespace

Example.Call : 服务端代码实现的接口

 

如果需要使用consul的话,可以用以下方式起动集群或者单机调式

consul 集群启动

$ ./consul agent -server -bootstrap-expect 2 -data-dir=data \
-node=n1 -bind=192.168.0.240 -client=0.0.0.0 &

$ ./consul join 192.168.0.112
$ ./consul join 192.168.0.122

consul 单机启动

$ ./consul agent -dev -client 0.0.0.0 -ui

agent 运行一个consul agent

join 将agent加入到consul集群

连接远程consul

--registry_address=127.0.0.1:8500 为远程注册中心地址与端口

$ go run .\service.go --registry_address=127.0.0.1:8500

$ go run client.go --registry_address=127.0.0.1:8500

 

最后奉上最重要的就是文档  micro官方文档  ,   golang相关micro doc

总结的正确姿势:

a.安装micro:具体步骤下面都有了,go get 下载报错,请自行github下载到gopath下面即可

b.可以使用micro new <工程名> 生成模板,工程目录下Makefile 和dockerfile都已经配置好了,如果使用模板请忽略下面手写的代码

c.使用make build && make run  执行makefile文件里面命令

d.make命令没有报错的话,这时工程就可以运行了,可以用go run main.go 把工程跑起来

e.使用用micro list serivces 查看是否运行成功

f.使用 micro call 调用微服务

 

 类似资料: