转载

Golang-grpc 加 gateway(二)运行(protoc ,gateway,swagger)

项目代码

https://github.com/hao1990/test_grpc

代码基本是来自官方的演示代码

开始吧 继续上一篇的 "hello.proto"

Golang-grpc 加 gateway(一)(protoc ,gateway,swagger)

下面代码, 和github中有略微不同,这里只留下一些必要的代码,配置相关的都暂时去掉

启动 grpc service

在hello.proto 中定义了 HelloService

// Hello服务
service HelloService {
    // 接口SayHello
    rpc SayHello (HelloRequest) returns (HelloReply){
        option (google.api.http) = {
            post:"/v1/examples/sayhello"
            body:"*"
        };
    }
}

需要在go中实现这个服务和服务中的方法

实现定义的服务

代码 service/service.go

定义 一个HelloService 都结构体

type HelloService struct {
}

//  SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error)
func (s *HelloService) SayHello(ctx context.Context, in *hello.HelloRequest) (*hello.HelloReply, error) {
    log.Printf("Received: %v", in.Name)
    var messge string = fmt.Sprintf("Hello , %v ; your age is %d", in.Name, in.Age)
    return &hello.HelloReply{Message: messge}, nil
}

启动服务 main方法

func main() {
    lis, err := net.Listen("tcp", "127.0.0.1:50123")
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    grpcService := grpc.NewServer()
    pb.RegisterHelloServiceServer(grpcService, &HelloService{})
    if err := grpcService.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}

运行

go run service/service.go

调用服务

代码 client/client.go

必要的代码

func main() {
    // Set up a connection to the server.
    conn, err := grpc.Dial("127.0.0.1:50123", grpc.WithInsecure())
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()
    c := pb.NewHelloServiceClient(conn)

    // Contact the server and print out its response.
    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()
    r, err := c.SayHello(ctx, &pb.HelloRequest{Name: "haohao_client", Age: 20})
    if err != nil {
        log.Fatalf("could not greet: %v", err)
    }
    log.Printf("Greeting: %s", r.Message)
}

测试下,另启一个终端

go run client/client.go

可以看到 service 的终端输出

Received: haohao_client

client的终端输出了

Hello , haohao_client ; your age is 20

gateway

其实gateway的代码也很少的

看官方github中第6步就几行代码“6.Write an entrypoint”

https://github.com/grpc-ecosystem/grpc-gateway

代码 /gateway/main.go

必要的代码就是 newGateway()方法

func newGateway(ctx context.Context, opts ...runtime.ServeMuxOption) (http.Handler, error) {
    mux := runtime.NewServeMux(runtime.WithMarshalerOption(runtime.MIMEWildcard, &runtime.JSONPb{OrigName: true, EmitDefaults: true}))
    dialOpts := []grpc.DialOption{grpc.WithInsecure()}

    //注册 hello service
    err := gw.RegisterHelloServiceHandlerFromEndpoint(ctx, mux, *endpoint, dialOpts)
    if err != nil {
        return nil, err
    }
    return mux, nil
}

以后添加服务后,只需要在这里注册新的服务即可

主要“gw.RegisterHelloServiceHandlerFromEndpoint”这里,这方法是在自动生成的代码 hello.pb.gw.go中的。

当添加了新服务时只要在下面继续 Register。如 gw.Register*****HandlerFromEndpoint

可以在 hello.pb.gw.go 中看到 这个方法:

func RegisterHelloServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) {
    ....
}

其他代码时运行 swagger的

运行一下看看

cd进入 gateway目录

然后

go run main.go

在浏览器打开

http://127.0.0.1:8123/swagger

看到

Golang-grpc 加 gateway(二)运行(protoc ,gateway,swagger)

image.png

点开接口输入内容测试下

Golang-grpc 加 gateway(二)运行(protoc ,gateway,swagger)

image.png

好了

结束

入门测试没问题了

原文  https://studygolang.com/articles/18859
正文到此结束
Loading...