Golang/Gin 学习

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/国服最坑开发
可以正常访问, 则表示通路验证完成.

http请求
8. 小结

protoc是一个通用命令, 可以生成多个语言版本的代码.
第二步安装的工具, 见名知义, 用于生成go语言版本时使用.

接下来,两个方向 :

上一篇下一篇

猜你喜欢

热点阅读