分享
  1. 首页
  2. 文章

golang使用grpc

JhonSmith · · 1455 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

golang使用grpc

目前正在学习后端有关概念, 了解到了grpc. 本文将简述一个简单demo的搭建.

rpc理解

我的网络通信概念还停留在比较基础的地方, 直觉来说就是发送一个get/post请求, 设定一定的参数格式, 这样对方再解析你的数据, 基于此完成通讯.
而rpc则不使用这种显式的通讯方式, 通过proto与生成grpc文件, 里面提供方法, 供client与server通过方法来进行通讯. 简单来说, 就是如果你以前要告诉server你好, 需要发送一个完整网络请求, 但是现在你只需要调用一个hello方法就可以了

环境依赖以及安装

  • golang
  • grpc
    go get -u google.golang.org/grpc
  • protoc
    go 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)
}

終わり。


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:JhonSmith

查看原文:golang使用grpc

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1455 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏