go-grpc实践指南-02Hello gRPC

gRPC的基本使用非常简单,看完这部分的第一个示例就可以直接用了。但是在实际环境中,我们不会仅仅满足于能用,而是要更好的使用。一个完整的服务包括:授权认证、数据追踪、负载均衡...,我们从一个简单的项目开始,说明gRPC的基本使用姿势,然后一点点细化扩展,逐步深入完善,打造一个完整的RPC服务。

HelloGrpc

按照惯例,这里也从一个Hello项目开始,本项目定义了一个Hello Service,客户端发送包含字符串名字的请求,服务端返回Hello消息。
流程:

  • 编写.proto描述文件
  • 编译生成.pb.go文件
  • 服务端实现约定的接口并提供服务
  • 客户端按照约定调用.pb.go文件中的方法请求服务
    项目结构:
|—— hello/
    |—— client/
        |—— main.go   // 客户端
    |—— server/
        |—— main.go   // 服务端
|—— proto/
    |—— hello/
        |—— hello.proto   // proto描述文件
        |—— hello.pb.go   // proto编译后文件

Step1:编写描述文件:hello.proto

syntax = "proto3";

package hello;
option go_package = "./hello";

// 定义Hello服务
service Hello {
  // 定义SayHello方法
  rpc SayHello(HelloRequest) returns (HelloResponse) {}
}
// HelloRequest 请求结构
message HelloRequest {
  string name = 1;
}
// HelloResponse 响应结构
message HelloResponse {
  string message = 1;
}

hello.proto文件中定义了一个Hello Service,该服务包含一个SayHello方法,同时声明了HelloRequest和HelloResponse消息结构用于请求和响应。客户端使用HelloRequest参数调用SayHello方法请求服务端,服务端响应HelloResponse消息。一个最简单的服务就定义好了。

Step2:编译生成.pb.go文件

cd .\proto\hello\
protoc --go_out=plugins=grpc:. --go_opt=paths=source_relative .\hello.proto

在当前目录内生成的hello.pb.go文件,按照.proto文件中的说明,包含服务端接口HelloServer描述,客户端接口及实现HelloClient,及HelloRequest、HelloResponse结构体。

Step3:实现服务端接口 server/main.go

package main

import (
	"context"
	"google.golang.org/grpc"
	"my_grpc/proto/hello"
	"net"
)

type HelloService struct{
	hello.UnimplementedHelloServer
}

func (t *HelloService) SayHello(ctx context.Context, in *hello.HelloRequest) (*hello.HelloResponse, error) {
	return &hello.HelloResponse{Message: "hello " + in.Name}, nil
}
func main() {
	listen, _ := net.Listen("tcp", ":9000")
	gServer := grpc.NewServer()
	hello.RegisterHelloServer(gServer, &HelloService{})
	_ = gServer.Serve(listen)
}

服务端引入编译后的proto包,定义一个空结构用于实现约定的接口,接口描述可以查看hello.pb.go文件中的HelloServer接口描述。实例化grpc Server并注册HelloService,开始提供服务。

运行:go run main.go

Step4:实现客户端调用 client/main.go

package main

import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"my_grpc/proto/hello"
)

func main() {
	clientConn, _ := grpc.Dial(":9000", grpc.WithTransportCredentials(insecure.NewCredentials()))
	helloClient := hello.NewHelloClient(clientConn)
	reply, _ := helloClient.SayHello(context.Background(), &hello.HelloRequest{Name: "张三"})
	fmt.Println(reply)
}

客户端初始化连接后直接调用hello.pb.go中实现的SayHello方法,即可向服务端发起请求,使用姿势就像调用本地方法一样。

posted @ 2022-09-23 15:22  专职  阅读(74)  评论(0编辑  收藏  举报