1. Hello World

2. 概述

这是使用 Go Micro 的 helloworld 示例. 我们将翻阅完整的内容.

2.1. 编写服务

使用 Go Micro 编写服务非常简单. 它提供了快速移动的框架, 而无需首先了解所有内容. 下面是一个简单的问候器服务示例, 我们将贯穿其中.

examples/service 上查找完整的代码示例.

2.1.1. 服务协议

微服务的关键要求之一是强定义接口. Micro 使用 protobuf 来实现这一目标.

在这里我们使用 Hello 方法定义 Greeter 处理程序. 它使用一个字符串参数来获取请求和响应.

syntax = "proto3";

service Greeter {
    rpc Hello(Request) returns (Response) {}
}

message Request {
    string name = 1;
}

message Response {
    string greeting = 2;
}

2.1.2. 生成原型

编写原型定义后, 我们必须使用带有 micro plugin 的 protoc 编译它.

protoc --proto_path=$GOPATH/src:. --micro_out=. --go_out=. path/to/greeter.proto

2.1.3. 实现服务

现在, 我们已经定义了实现服务所需的服务接口.

下面是问候器服务的代码. 它执行以下操作:

  1. 实现为 Greeter 处理程序定义的接口
  2. 初始化一个 micro.Service
  3. 注册 Greeter 处理器
  4. 运行服务
package main

import (
    "context"
    "fmt"

    micro "github.com/micro/go-micro/v2"
    proto "github.com/micro/examples/service/proto"
)

type Greeter struct{}

func (g *Greeter) Hello(ctx context.Context, req *proto.Request, rsp *proto.Response) error {
    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)
    }
}

2.1.4. 运行服务

现在使用 Go 运行示例. 如果您正在使用示例代码, 请执行以下操作:

go run examples/service/main.go

这应该会输出类似如下的内容

2019-11-13 21:39:38.327452 I | Transport [http] Listening on [::]:32945
2019-11-13 21:39:38.327548 I | Broker [http] Connected to [::]:38955
2019-11-13 21:39:38.328095 I | Registry [mdns] Registering node: greeter-39373107-5ae7-42a2-b5e2-ebebf7eafbd9

2.1.5. 编写客户端

一旦我们有了服务, 我们实际上需要一种方法来查询它. 这是微服务的核心, 因为我们不仅服务, 而且消耗其他服务. 下面是查询问候器服务的客户端代码.

生成的原型包括一个问候器客户端, 以减少样板代码.

package main

import (
    "context"
    "fmt"

    micro "github.com/micro/go-micro/v2"
    proto "github.com/micro/examples/service/proto"
)

func main() {
    // Create a new service
    service := micro.NewService(micro.Name("greeter.client"))
    // Initialise the client and parse command line flags
    service.Init()

    // Create new greeter client
    greeter := proto.NewGreeterService("greeter", service.Client())

    // Call the greeter
    rsp, err := greeter.Hello(context.TODO(), &proto.Request{Name: "John"})
    if err != nil {
        fmt.Println(err)
    }

    // Print response
    fmt.Println(rsp.Greeting)
}

现在运行客户端

go run client.go

输出应该会简单地打印响应的内容

Hello John

results matching ""

    No results matching ""