go实践十八 搭建grpc服务器和客户端

之前我们如果使用 protobuf : https://blog.csdn.net/daily886/article/details/98594066

现在我们使用protobuf作为数据流,搭建grpc服务器和客户端

目录结构如下: 
项目根目录是 grpc


grpc的目录结构
├── protobuf                            # proto文件统一存放目录
│   ├── helloworld.proto          # proto文件
├── server.go                          # grpc服务器端
├── client.go                           # grpc客户端

下面,我们根据目录结构,从上往下建立文件夹和文件

建立文件夹和文件 grpc/protobuf/helloworld.proto ,helloworld.proto 内容如下:

syntax = "proto3";

option objc_class_prefix = "HLW";

package helloworld;

// 定义一个greeter服务器,其中api 为sayhello
// 形式参数: hellorequest
// 返回参数: helloreply
service Greeter{
    // 发送一个问候
    rpc SayHello(HelloRequest) returns (HelloReply) {}

    /*

    rpc 接口的类型分为以下四种: A 为接收参数, B 为返回参数
    1. rpc GetFeature(Point) returns (Feature) {} 普通调用:A-B
    2. rpc ListFeatures(Rectangle) returns (stream Feature) {} 单向流:A - B(流)
    3. rpc RecordRoute(stream Point) returns (RouteSummary) {} 单向流:A(流) - B
    4. rpc RouteChat(stream RouteNote) returns (stream RouteNote) {} 双向流:A(流) - B(流)

    */

}

// 请求参数-根据自己需求定义
message HelloRequest{
    string name = 1;
}

// 返回参数-根据自己需求定义
message HelloReply{
    string message = 1;
}

//最后运行命令: protoc --go_out=plugins=grpc:. helloworld.proto 
//即可生成 pb 文件

建立文件 grpc/server.go ,server.go 内容如下:

package main

import (
	"google.golang.org/grpc"

	"fmt"
	"context"
	"net"

	pb "grpc/protobuf"
)

//服务器端口
const port = ":6664"

//定义struct 来实现我们自定义的 helloworld.proto 对应的服务
type myServer struct {

}

func (m *myServer) SayHello(ctx context.Context,in *pb.HelloRequest) (*pb.HelloReply,error){
	return &pb.HelloReply{Message:"请求server端成功!"}, nil
}

/*
首先我们必须实现我们自定义的 rpc 服务,例如: rpc SayHello() -在此我们可以实现自己的逻辑
创建监听listener
创建grpc 服务
将我们的服务注册到grpc 的server 中
启动grpc 服务,将我们自定义的监听信息传递给grpc 服务器
*/

func main(){
	//创建server 端监听端口
	list,err := net.Listen("tcp",port)
	if err != nil{
		fmt.Println(err)
	}

	//创建grpc 的server
	server := grpc.NewServer()
	//注册我们自定义的helloworld 服务
	pb.RegisterGreeterServer(server,&myServer{})

	//启动grpc 服务
	fmt.Println("grpc 服务启动...")
	server.Serve(list)

}

建立文件 grpc/client.go ,client.go 内容如下:

package main

import (
	"google.golang.org/grpc"

	"fmt"
	"context"

	pb "grpc/protobuf"

)

//与服务器对应的端口
const address = "127.0.0.1:6664"

/*
创建grpc 连接器
创建grpc 客户端,并将连接器赋值给客户端
向grpc 服务器发起请求
获取grpc 服务器返回的结果
*/
func main() {
	//创建一个grpc 连接器
	conn,err := grpc.Dial(address,grpc.WithInsecure())
	if err != nil{
		fmt.Println(err)
	}
	//当请求完毕后记得关闭连接,否则大量连接会占用资源
	defer conn.Close()

	//创建grpc 客户端
	c := pb.NewGreeterClient(conn)

	name := "我是客户端,正在请求服务器!!"
	//客户端向grpc 服务器发起请求
	result,err := c.SayHello(context.Background(),&pb.HelloRequest{Name:name})
	fmt.Println(name)
	if err != nil{
		fmt.Println("请求失败!!")
		return
	}
	//获取服务器返回的结果
	fmt.Println(result.Message)
}

切换到grpc/protobuf目录中,编译 .proto 文件,生成 Go 语言文件

[root@izj6c4jirdug8kh3uo6rdez grpc]# cd protobuf
[root@izj6c4jirdug8kh3uo6rdez protobuf]# protoc --go_out=plugins=grpc:. helloworld.proto
[root@izj6c4jirdug8kh3uo6rdez protobuf]# ll
total 12
-rw-r--r-- 1 root root 7112 Aug 30 15:29 helloworld.pb.go
-rw-r--r-- 1 root root  941 Aug 30 15:20 helloworld.proto

切换到grpc目录中, 初始化包,并把google.golang.org/grpc包替换为github.com/grpc/grpc-go@latest

[root@izj6c4jirdug8kh3uo6rdez grpc]# go mod init grpc
go: creating new go.mod: module grpc
[root@izj6c4jirdug8kh3uo6rdez grpc]# go mod edit -replace=google.golang.org/grpc=github.com/grpc/grpc-go@latest
[root@izj6c4jirdug8kh3uo6rdez grpc]# cat go.mod
module grpc

go 1.12

replace google.golang.org/grpc => github.com/grpc/grpc-go v1.23.0

require (
	github.com/golang/protobuf v1.3.2
	google.golang.org/grpc v0.0.0-00010101000000-000000000000
)

启动grpc服务器

[root@izj6c4jirdug8kh3uo6rdez grpc]# go run server.go
grpc 服务启动...

启动客户端

[root@izj6c4jirdug8kh3uo6rdez grpc]# go run client.go
我是客户端,正在请求服务器!!
请求server端成功!

参考:https://www.cnblogs.com/hcy-fly/p/8819111.html

参考:https://github.com/grpc/grpc-go

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章