• 技术文章 >后端开发 >Golang

    如何搭建go-micro开发环境

    藏色散人藏色散人2020-08-12 13:58:50转载1368

    下面由Golang教程栏目给大家介绍搭建go-micro开发环境的方法,希望对需要的朋友有所帮助!

    最近因为要用到 go-micro,所以在学习微服务相关的内容,这一篇是记录 micro 的搭建过程。

    安装环境

    micro 提供了一个 runtime,在使用 go-micro 之前需要先安装它。有以下几种方式安装

    源码

    go get github.com/micro/micro/v2

    这种方式我装不上,不是网络的原因,不知道哪里有冲突。。。

    docker

    docker pull micro/micro

    二进制

    # MacOS
    curl -fsSL https://raw.githubusercontent.com/micro/micro/master/scripts/install.sh | /bin/bash
    
    # Linux
    wget -q  https://raw.githubusercontent.com/micro/micro/master/scripts/install.sh -O - | /bin/bash
    
    # Windows
    powershell -Command "iwr -useb https://raw.githubusercontent.com/micro/micro/master/scripts/install.ps1 | iex"

    推荐使用这种方式下载安装,把编译好的二进制包添加到环境变量就能直接使用了。不想用脚本安装可以在 github 的 release 页面下载

    https://github.com/micro/micro/releases

    测试一下

    现在已经安装好 micro 了,测试一下。

    micro web

    输出

    $ micro web2020-07-05 04:24:16  file=http/http.go:90 level=info service=web HTTP API Listening on [::]:80822020-07-05 04:24:16  file=v2@v2.9.1/service.go:200 level=info service=web Starting [service] go.micro.web2020-07-05 04:24:16  file=grpc/grpc.go:864 level=info service=web Server [grpc] Listening on [::]:264492020-07-05 04:24:16  file=grpc/grpc.go:697 level=info service=web Registry [mdns] Registering node: go.micro.web-b76a12a1-5226-429f-9633-ce304f179657

    现在访问localhost:8082 就可以查看 micro 的 web 页面了。

    安装 protoc

    protoc 是 protobuf 的编译器,而 protobuf 是一种用来传输数据的格式,类似 json、xml 这些。
    protoc 下载地址

    https://github.com/protocolbuffers/protobuf/releases

    下载好之后,bin 文件夹中有个 protoc 的可执行文件,把这个也添加到环境变量。(可以直接把它放到已经添加了环境变量的文件夹下就可以了,可以避免电脑里写满了各种环境变量,并且常用工具放到一个文件夹也方便管理)

    推荐:《go语言

    还有个 protoc-gen-go 也需要放进去,可以用下面的方式下载。

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

    example

    现在让我们写一个 demo 来练习一下。

    一共有三个文件,server.goclient.gogreeter.proto

    greeter.proto

    syntax = "proto3";package protos;service Greeter {
        rpc Hello (Request) returns (Response){};}message Request {
        string name = 1;}message Response {
        string greeting = 2;}

    server.go

    package mainimport (
        "context"
        "fmt"
        "github.com/micro/go-micro/v2")type Greeter struct {}func (g *Greeter) Hello(context context.Context, req *Request, rsp *Response) error {
        rsp.Greeting = "Hello " + req.Name    return nil}func main() {
        service := micro.NewService(
            micro.Name("greeter"),
        )
        service.Init()
    
        err := RegisterGreeterHandler(service.Server(), new(Greeter))
        if err != nil {
            fmt.Println(err)
        }
    
        if err := service.Run(); err != nil {
            fmt.Println(err)
        }}

    client.go

    package mainimport (
        "context"
        "fmt"
        "github.com/micro/go-micro/v2")func main() {
        service := micro.NewService(micro.Name("greeter.client"))
        service.Init()
    
        greeter := NewGreeterService("greeter", service.Client())
        rsp, err := greeter.Hello(context.TODO(), &Request{Name: "Zaun pianist"})
        if err != nil {
            fmt.Println(err)
        }
        fmt.Println(rsp.Greeting)}

    强烈建议使用 go mod 来管理依赖,项目更新速度很快,百度上的很多教程都不行了,安装过程各种错误

    这是我的 mod 文件

    module hello
    
    go 1.14require (
        github.com/golang/protobuf v1.4.0
        github.com/micro/go-micro/v2 v2.9.1
        google.golang.org/protobuf v1.22.0)

    注意,我的 greeter.proto 和 server.go、client.go 文件是放在同一个文件夹下面的

    编译greeter.proto

    protoc --micro_out=. --go_out=. greeter.proto

    编译完成之后,会生成两个 go 源代码文件:

    运行

    现在可以运行 server 了,这里因为 client 和 server 是放在同一个文件夹,也就是同一个包中,两个都有 main 函数,所以不能用 go run ./,至于为什么要加上另外两个,这个是 go 语言编译器的要求,必须要指明编译所需要用到的文件。

    go run server.go greeter.pb.go greeter.pb.micro.go

    可以用 micro 来查看当前正在运行的微服务

    micro list services

    也可以在 web 端查看

    micro web

    如果没有出错,这个时候是可以看到服务已经注册成功了。

    $ micro list services
    go.micro.web
    greeter

    测试

    现在可以运行客户端来测试一下了

    go run client.go greeter.pb.go greeter.pb.micro.go

    我在测试的时候出了问题,服务已经注册好了,但是 client 去调用的时候,缺返回了

    {"id":"go.micro.client","code":408,"detail":"context deadline exceeded","status":"Request Timeout"}panic: runtime error: invalid memory address or nil pointer dereference[signal 0xc0000005 code=0x0 addr=0x28 pc=0xeef454]

    检查一下服务的信息

    micro get service greeter
    $ micro get service greeter                                                                                    
    service  greeter                                                                                               
    
    version latest                                                                                                 
    
    ID      Address Metadata                                                                                       
    greeter-5d86321e-86f2-41a6-8230-f015466bf791    10.198.75.60:51395      broker=http,protocol=grpc,registry=mdns,server=grpc,transport=grpc                                                                                    
    
    Endpoint: Greeter.Hello                                                                                        
    
    Request: {                                                                                                     
            message_state MessageState {                                                                           
                    no_unkeyed_literals NoUnkeyedLiterals                                                          
                    do_not_compare DoNotCompare                                                                    
                    do_not_copy DoNotCopy                                                                          
                    message_info MessageInfo                                                                       
            }                                                                                                      
            int32 int32                                                                                            
            unknown_fields []uint8                                                                                 
            name string                                                                                            
    }                                                                                                              Response: {                                                                                                    
            message_state MessageState {                                                                           
                    no_unkeyed_literals NoUnkeyedLiterals                                                          
                    do_not_compare DoNotCompare                                                                    
                    do_not_copy DoNotCopy                                                                          
                    message_info MessageInfo                                                                       
            }                                                                                                      
            int32 int32                                                                                            
            unknown_fields []uint8                                                                                 
            greeting string                                                                                        
    }

    注意看里面的 IP 地址,注册到了 10.198.xx 去了,因此才会报错???
    因此在注册服务的时候,指定 IP 地址

    go run server.go greeter.pb.go greeter.pb.micro.go --server_address=localhost:8888

    这个时候再用 client 调用就不会出错了。

    $ go run client.go greeter.pb.go greeter.pb.micro.go
    Hello Zaun pianist

    以上就是如何搭建go-micro开发环境的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:learnku,如有侵犯,请联系admin@php.cn删除
    专题推荐:go golang
    上一篇:Golang中Bit数组如何实现(代码示例) 下一篇:Go 1.15 版本的优化清单【总结】
    PHP编程就业班

    相关文章推荐

    • 一起看看golang调用php7详解及实例• golang是多线程模式吗?• golang用什么开发工具?• Golang中Bit数组如何实现(代码示例)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网