go-grpc 简单实现

595 阅读1分钟

安装grpc  参考 https://www.cnblogs.com/leisurelylicht/p/Go-an-zhuanggRPC.html

安装protobuf 参考  https://blog.csdn.net/u013457167/article/details/83864436

1.  hello.proto文件

syntax = "proto3"; // 指定proto版本
package hello;     // 指定默认包名

// 定义Hello服务
service Hello {
    // 定义SayHello方法
    rpc SayHello(HelloRequest) returns (HelloResponse) {}
}

// HelloRequest 请求结构
message HelloRequest {
    string name = 1;
}

// HelloResponse 响应结构
message HelloResponse {
    string message = 1;
}

在当前文件下执行命令,生成hello.pd.go文件:

protoc --go_out=plugins=grpc:./ ./hello.protos

hello.pd.go 文件的部分内容

// HelloServer is the server API for Hello service.
type HelloServer interface {
	// 定义SayHello方法
	SayHello(context.Context, *HelloRequest) (*HelloResponse, error)
}

// HelloClient is the client API for Hello service.
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type HelloClient interface {
	// 定义SayHello方法
	SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloResponse, error)
}

2. 编写服务端代码

package main

import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	"google.golang.org/grpc/grpclog"
	pd "hello/myproto"
	"net"
)

const(
	Address = "127.0.0.1:9999"
)


//定义结构体
type helloService struct{}

//结构体实现HelloServer接口中SayHello方法
func (h *helloService)SayHello(ctx context.Context, in *pd.HelloRequest)(*pd.HelloResponse, error)  {

	fmt.Println(in.Name, "请求服务")
	res := new(pd.HelloResponse)
	res.Message = "hello" + " " + in.Name

	return res, nil
}


func main() {

	var (
		HelloService = helloService{}
		listen net.Listener
		err error
		)

	//建立tcp连接
	if listen, err = net.Listen("tcp", Address); err != nil{
		grpclog.Fatalln(err)
	}

	//实例化grpc server
	s := grpc.NewServer()

	//注册HelloService
	pd.RegisterHelloServer(s, &HelloService)

	//开启服务监听
	s.Serve(listen)

}


3. 编写客户端代码

package main

import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	"google.golang.org/grpc/grpclog"
	pd "hello/myproto"
)

const (
	Address = "127.0.0.1:9999"
)

func main() {

	var(
		conn *grpc.ClientConn
		err error
		res *pd.HelloResponse
	)

	//建立连接
        //grpc.WithInsecure()忽略证书认证
	if conn, err = grpc.Dial(Address, grpc.WithInsecure()); err != nil{
		grpclog.Fatalln(err)
	}

	//初始化客户端
	c := pd.NewHelloClient(conn)

	//实例化HelloRequest
	req := pd.HelloRequest{Name:"zhe"}

	//调用HelloClient接口中SayHello方法
	if res, err = c.SayHello(context.Background(), &req); err !=nil{
		grpclog.Error(err)
	}

	fmt.Print(res.Message)


}