共计 2090 个字符,预计需要花费 6 分钟才能阅读完成。
golang 使用 grpc
目前正在学习后端有关概念, 了解到了 grpc. 本文将简述一个简单 demo 的搭建.
rpc 理解
我的网络通信概念还停留在比较基础的地方, 直觉来说就是发送一个 get/post 请求, 设定一定的参数格式, 这样对方再解析你的数据, 基于此完成通讯. 而 rpc 则不使用这种显式的通讯方式, 通过 proto 与生成 grpc 文件, 里面提供方法, 供 client 与 server 通过方法来进行通讯. 简单来说, 就是如果你以前要告诉 server 你好, 需要发送一个完整网络请求, 但是现在你只需要调用一个 hello 方法就可以了
环境依赖以及安装
golang
grpcgo get -u google.golang.org/grpc
protocgo get -u github.com/golang/protobuf/protoc-gen-go
环境变量配置 export PATH=$PATH:$GOPATH/bin
项目目录结构
grpc_test/
|– client
| `– client.go
|– proto
| |– greeter.pb.go
| `– greeter.proto
`– server
`– server.go
DEMO
1. 编写 proto 文件
syntax = “proto3”;
package proto;
service Hello {
rpc Hello (Request) returns (Response) {}
}
message Request {
string Name = 1;
}
message Response {
string Msg = 1;
}
非常简单, 提供了 request, response 对象, 并且提供了 hello 方法.
2. 生成 grpc 文件
执行 protoc -I ./ ./greeter.proto –go_out=plugins=grpc:../proto/ 前面的./ 与./greeter.proto 是上面的 proto 文件的文件夹以及文件, 后面的../proto 是输出目录, 运行成功的时候, 会生成 greeter.pb.go 文件. 有兴趣可以详细去读里面的代码.
3. 编写服务端脚本
package main
import (
“fmt”
“net”
“context”
grpc “google.golang.org/grpc”
proto “grpc_test/proto” // 引用刚才生成 grpc 代码
)
const(
Address = “127.0.0.1:8801” // 监听的端口
)
type Greeter struct {}
// 实现 proto 中定义的 hello 方法
func (greeter *Greeter) Hello(ctx context.Context, request *proto.Request) (*proto.Response, error){
fmt.Println(“get client info, name is: “, request.Name)
response_msg := “Hello ” + request.Name
return &proto.Response{Msg:response_msg}, nil
}
func main(){
service := Greeter{}
conn, err := net.Listen(“tcp”, Address) // tcp 监听端口
if err != nil{
fmt.Println(err)
return
}
fmt.Println(“tcp listening…”)
defer conn.Close()
server := grpc.NewServer()
proto.RegisterHelloServer(server, &service) // 将 tcp 服务于 grpc 进行绑定
fmt.Println(“server serve…..”)
if err := server.Serve(conn); err != nil{
fmt.Println(err)
return
}
}
4. 编写客户端脚本
package main
import (
“context”
“fmt”
grpc “google.golang.org/grpc”
proto “grpc_test/proto” // 引用 grpc 代码
)
const(
Address = “127.0.0.1:8801” // 服务监听的端口
)
func main() {
conn, err := grpc.Dial(Address, grpc.WithInsecure())
if err != nil{
fmt.Println(err)
}
defer conn.Close()
client := proto.NewHelloClient(conn) // 自动生成方法, 因为 proto 文件中 service 的名字是 hello
name := “jhonsmith”
result, err := client.Hello(context.Background(), &proto.Request{Name:name}) // 调用 grpc 方法, 对服务端进行通讯
if err != nil{
fmt.Println(err)
}
fmt.Println(“I see, u see. I say “, name, “u say “, result.Msg)
}
終わり。