Golang-08 最速gRpc(go版本)使用体验
2019-09-18 本文已影响0人
国服最坑开发
参考: http://doc.oschina.net/grpc?t=60133
https://blog.51cto.com/13914991/2309916?source=dra
https://github.com/gin-gonic/examples/blob/master/grpc/README.md
1.安装 protoc.exe
下载页面: https://github.com/protocolbuffers/protobuf/releases
下载windows版本protoc解压后加到 %PATH%
路径
2.安装 protoc-gen-go : go语言版本的 代码生成器
# 安装 go 插件
go get -u github.com/golang/protobuf/protoc-gen-go
protoc-gen-go
安装完成后, 会在
$GOPATH/bin
下多一个执行文件, 确保这个路径也在 %PATH%
下
3.准备一个 proto 文件
syntax = "proto3";
message HelloRequest {
string greeting = 1;
}
message HelloResponse {
string reply = 1;
}
service HelloService {
rpc SayHello (HelloRequest) returns (HelloResponse) {
}
}
4.生成代码
在项目目录下执行命令:
protoc --go_out=plugins=grpc:. protos/order.proto
生成代码
成功后, 会生成一个 .pb.go
文件
5.编写服务端代码
package main
import (
"fmt"
"log"
"net"
"golang.org/x/net/context"
"google.golang.org/grpc"
"google.golang.org/grpc/reflection"
order "grpc_demo/protos"
)
type Server struct{}
// SayHello (HelloRequest) returns (HelloResponse)
func (s *Server) SayHello(ctx context.Context, in *order.HelloRequest) (*order.HelloResponse, error) {
return &order.HelloResponse{Reply: "Hello :" + in.Greeting}, nil
}
func main() {
listener, e := net.Listen("tcp", ":50000")
if e != nil {
log.Fatalf("failed to listen : %v", e)
}
s := grpc.NewServer()
order.RegisterHelloServiceServer(s, &Server{})
reflection.Register(s)
if e := s.Serve(listener); e != nil {
log.Fatalf("failed to serve : %v", e)
}
fmt.Println("Server started ...")
}
6.客户端代码
包含两部分: grpc的客户端(长连接), 还有一个对外的 http 服务
package main
import (
"log"
"github.com/gin-gonic/gin"
"google.golang.org/grpc"
order "grpc_demo/protos"
)
func main() {
conn, e := grpc.Dial("localhost:50000", grpc.WithInsecure())
if e != nil {
log.Fatalf("can't connect : %v", e)
}
defer conn.Close()
client := order.NewHelloServiceClient(conn)
r := gin.Default()
r.GET("/hi/:name", func(c *gin.Context) {
name := c.Param("name")
req := &order.HelloRequest{Greeting: name}
if resp, e := client.SayHello(c, req); e == nil && resp != nil {
c.String(200, resp.Reply)
} else {
c.String(200, "something wrong")
}
})
_ = r.Run(":80")
}
7,启动验证
启动服务# 启动服务端
go run server.go
# 启动客户端
go run client.go
访问 http://localhost/hi/国服最坑开发
可以正常访问, 则表示通路验证完成.
8. 小结
protoc
是一个通用命令, 可以生成多个语言版本的代码.
第二步安装的工具, 见名知义, 用于生成go
语言版本时使用.
接下来,两个方向 :
- 学习复杂结构的消息接口定义
- 体验其他类型的调用方式(流式/双向流)
- 和
java
语言接口互调?