概述
之前我们如果使用 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
最后
以上就是飘逸白猫为你收集整理的go实践十八 搭建grpc服务器和客户端的全部内容,希望文章能够帮你解决go实践十八 搭建grpc服务器和客户端所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复