什么是grpc和protobuf

grpc

​ grpc是一个Google开源的高性能、开源和通用的RPC框架,面向移动和HTTP/2设计。目前提供C、Java和Go语言版本, 分别是grpc, grpc-java 和 grpc-go, 其中C语言版本又支持C , C++,Node.js, Python, Ruby, Object-C, PHP, C#

grpc协议使用的序列化程序不是json 、xml 等, 而是使用的protobuf序列化及反序列化

protobuf

  • 习惯使用json、xml交互数据的人,大多没有听说过 Protocol Buffer
  • Protocol Buffer其实是Google出品的一种轻量&高效的结构化数据存储格式,性能要比json、xml强很多
  • 目前主流使用的protobuf3

go get -d google.golang.org/protobuf/cmd/protoc-gen-go

安装好protoc执行程序后 写入.proto文件

syntax = "proto3";
option go_package = ".;proto"; service Greeter{
rpc SayHello (HelloRequest) returns (HelloReply);
} message HelloRequest {
string name = 1;
} message HelloReply {
string message = 1; }

写完之后 执行命令生成.go文件protoc -I . first.proto --go_out=plugins=grpc:.

  • Server端代码
package main

import (
"context"
"log"
"net" "google.golang.org/grpc"
"google.golang.org/grpc/reflection" pb "AwesomeMicroPro/MicroProject/proto"
) // server is used to implement pb.GreeterServer .
type server struct {
pb.UnimplementedGreeterServer
} // SayHello 方法接受远程调用方法
func (s *server) SayHello(ctx context.Context, request *pb.HelloRequest) (*pb.HelloReply, error) {
log.Println(request.Name + "remote 1 first")
return &pb.HelloReply{Message: "hello " + request.Name}, nil
} func main() {
g := grpc.NewServer()
reflection.Register(g)
pb.RegisterGreeterServer(g, &server{})
listen, err := net.Listen("tcp", "127.0.0.1:8080")
if err != nil {
panic("Listen Port Failed"+err.Error())
} err = g.Serve(listen)
if err != nil {
panic("Server Enable Failed"+err.Error())
} }
  • Client端代码
package main

import (
"context"
"google.golang.org/grpc"
"log"
"os" pb "AwesomeMicroPro/MicroProject/proto"
) const (
address = "127.0.0.1:8080"
) func main() {
// 拨号连接Server
conn, err := grpc.Dial(address, grpc.WithInsecure())
if err != nil {
panic("Connect grpc Server Failed" + err.Error())
}
// 最后关闭连接
defer conn.Close() client := pb.NewGreeterClient(conn)
name := "testing ***"
if len(os.Args) > 1 {
name = os.Args[1]
}
// 远程调用SayHello方法传入对应的值
reply, err := client.SayHello(context.Background(), &pb.HelloRequest{Name: name})
if err != nil {
panic("fun remote execute failed" + err.Error())
} log.Println(reply.Message) }

rpc的四种模式

  • 简单模式

    • 简单模式最为传统 和熟悉的数据流模式没有任何区别,即客户端请求一次数据 服务端相应一个数据
  • 服务端数据流模式
    • 客户端发起一次请求 服务端连续不断的返回数据流 stream, 典型的例子就是客户端发起一个股票代码 服务端实时的将股票的信息返回到客户端
  • 客户端数据流模式
    • 客户端源源不断的向服务端发送数据流 ,发送结束后 服务端返回一个响应数据, 例子 : 物联网终端向服务器报告数据
  • 双向数据流模式
    • 客户端和服务端都可以发送数据流 、实时交互。 例子: 聊天

服务端数据流、客户端数据流、双向数据流 模式

stream.proto

syntax = "proto3";
option go_package = "./;proto"; service Greeter { rpc GetStream (StreamReqData) returns (stream StreamResData) {} // 服务端流模式 rpc PutStream (stream StreamReqData) returns (StreamResData) {} // 客户端流模式 rpc AllStream (stream StreamResData) returns (stream StreamReqData) {} // 双向流模式
} message StreamReqData { string data = 1;
}
message StreamResData {
string data = 2;
}

protoc -I . stream.proto --go_out=plugins=grpc:.

server.go

package main

import (
"AwesomeMicroPro/stream_grpc_test/proto"
"fmt"
"google.golang.org/grpc"
"log"
"net"
"sync"
"time"
) const PORT = ":50052" var wg sync.WaitGroup type server struct {
} // GetStream 服务端流模式 源源不断的发送数据给客户端
func (s *server) GetStream(data *proto.StreamReqData, res proto.Greeter_GetStreamServer) error { for i := 0; i < 10; i++ {
_ = res.Send(&proto.StreamResData{
Data: fmt.Sprintf("%v", time.Now().Unix()),
})
time.Sleep(time.Second)
} return nil
} // PutStream 客户端流模式 源源不断的接受客户端的请求
func (s *server) PutStream(putStreamServer proto.Greeter_PutStreamServer) error {
for i:=0; i< 10; i ++{
recv, err := putStreamServer.Recv()
if err != nil {
log.Println("Recv Data Failed"+ err.Error())
break
}
fmt.Println(recv)
}
return nil
} func (s *server) AllStream(allstream proto.Greeter_AllStreamServer) error {
wg.Add(2)
go func() {
for {
recv, err := allstream.Recv()
if err != nil {
log.Println("接受数据失败")
break
}
fmt.Println("服务端接收到的数据:"+recv.Data)
}
defer wg.Done()
}() go func() {
for {
err := allstream.Send(&proto.StreamReqData{
Data: fmt.Sprintf("我是服务端%v", time.Now().Unix()),
})
if err != nil {
log.Println("服务端发送数据失败" + err.Error())
break
}
time.Sleep(time.Second)
}
wg.Done()
}() wg.Wait()
return nil
} func main() {
listen, err := net.Listen("tcp", PORT)
if err != nil {
log.Println("Listen tcp port failed" + err.Error())
}
newServer := grpc.NewServer()
proto.RegisterGreeterServer(newServer, &server{})
err = newServer.Serve(listen)
}

Client.go

package main

import (
"AwesomeMicroPro/stream_grpc_test/proto"
"context"
"fmt"
"google.golang.org/grpc"
"log"
"sync"
"time"
) var wg sync.WaitGroup func main() {
conn, err := grpc.Dial("localhost:50052", grpc.WithInsecure())
if err != nil {
log.Println("connect grpc service failed" + err.Error())
} defer conn.Close() client := proto.NewGreeterClient(conn)
// GetStream 服务端流模式 适合订阅监控某些信息
stream, err := client.GetStream(context.Background(), &proto.StreamReqData{Data: "服务端数据流调用"}) for i:=0; i < 10; i++{
recv, err := stream.Recv()
if err != nil {
log.Println(err.Error())
}
log.Println(recv)
}
// 客户端流模式
putStream, err := client.PutStream(context.Background())
for i:=0; i < 10; i ++ {
err := putStream.Send(&proto.StreamReqData{Data: "**da **" + string(i)})
if err != nil {
log.Println("err" + err.Error())
break
}
} // 双向流模式
allStream, err := client.AllStream(context.Background())
wg.Add(2)
go func() {
for {
recv, err := allStream.Recv()
if err != nil {
log.Println("接收数据失败")
break
}
fmt.Println("客户端接收到的数据: " + recv.Data)
}
defer wg.Done() }()
go func() {
for {
err := allStream.Send(&proto.StreamResData{Data: fmt.Sprintf("我是客户端 %v", time.Now().Unix())})
if err != nil {
log.Println("客户端发送数据失败"+err.Error())
break
}
time.Sleep(time.Second)
}
wg.Done()
}()
wg.Wait()
}

Go-grpc 实现的更多相关文章

  1. gRPC源码分析1-SSL/TLS

    引子 前几天看到微信后台团队分享了TLS相关文章,正好gRPC里TLS数据加密是很重要的一块,于是整理出了这篇文章. 在gRPC里,如果仅仅是用来做后端微服务,可以考虑不加密.本文太长,先给个大纲. ...

  2. gRPC源码分析2-Server的建立

    gRPC中,Server.Client共享的Class不是很多,所以我们可以单独的分别讲解Server和Client的源码. 通过第一篇,我们知道对于gRPC来说,建立Server是非常简单的,还记得 ...

  3. gRPC源码分析0-导读

    gRPC是Google开源的新一代RPC框架,官网是http://www.grpc.io.正式发布于2016年8月,技术栈非常的新,基于HTTP/2,netty4.1,proto3.虽然目前在工程化方 ...

  4. 谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC

    Google 刚刚开源了grpc,  一个基于HTTP2 和 Protobuf 的高性能.开源.通用的RPC框架.Protobuf 本身虽然提供了RPC  的定义语法,但是一直以来,Google 只开 ...

  5. gRPC .NET Core跨平台学习

    前些天发布gRPC C# 学习,在.NET Framework 中使用gRPC ,今天来学习 .NET Core gRPC. gRPC 的.NET Core 包在NuGet 上发布了,结合.NET C ...

  6. gRPC C#学习

    前些天gRPC 发布1.0 版本,代表着gRPC 已经正式进入稳定阶段. 今天我们就来学习gRPC C# .而且目前也已经支持.NET Core 可以实现完美跨平台. 传统的.NET 可以通过Mono ...

  7. .net core 用grpc实现微服务

    GRPC 是Google发布的一个开源.高性能.通用RPC(Remote Procedure Call)框架.提供跨语言.跨平台支持.以下以.NET Core 使用控制台.docker中演示如何使用G ...

  8. rpc框架之gRPC 学习 - hello world

    grpc是google在github于2015年开源的一款RPC框架,虽然protobuf很早google就开源了,但是google一直没推出正式的开源框架,导致github上基于protobuf的r ...

  9. Android开发笔记之《远程控制(MQTT|mosquitto) && (ProtocalBuffer | GRPC)》

    Android推送方案分析(MQTT/XMPP/GCM): http://www.open-open.com/lib/view/open1410848945601.htmlMQTT官网: http:/ ...

  10. gRPC+etcd的优势分析

    相比webService等可跨平台,跨语言的服务相比,gRPC更增加了以下优势 1.可以采用二进制传输,速度更快 (使用TCP传输层,而不是Http2应用层) 2.集群服务,统一注册,可靠性高( 好的 ...

随机推荐

  1. spring cloud --- config 配置中心 [本地、git获取配置文件]

    spring boot      1.5.9.RELEASE spring cloud    Dalston.SR1 1.前言 spring cloud config 配置中心是什么? 为了统一管理配 ...

  2. spring cloud --- Ribbon 客户端负载均衡 + RestTemplate + Hystrix 熔断器 [服务保护] ---心得

    spring boot      1.5.9.RELEASE spring cloud    Dalston.SR1 1.前言 当超大并发量并发访问一个服务接口时,服务器会崩溃 ,不仅导致这个接口无法 ...

  3. 浅谈xss漏洞

    0x00 xss漏洞简介 XSS漏洞是Web应用程序中最常见的漏洞之一.如果您的站点没有预防XSS漏洞的固定方法, 那么很可能就存在XSS漏洞. 跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Scr ...

  4. 使用Spring容器动态注册和获取Bean

    有时候需要在运行时动态注册Bean到Spring容器,并根据名称获取注册的Bean.比如我们自己的SAAS架构的系统需要调用ThingsBoard API和Thingsboard交互,就可以通过Thi ...

  5. 简单Spring MVC项目搭建

    1.新建Project 开发环境我使用的是IDEA,其实使用什么都是大同小异的,关键是自己用的顺手. 首先,左上角File→New→Project.在Project页面选择Maven,然后勾上图中所示 ...

  6. java基础05-类型转换

    java基础05-类型转换 由于Java是强类型语言,所以要进行有些运算的时候,需要用到类型转换. 低 ---------------------------> 高 byte , short , ...

  7. Redhat 如何使用yum 源(转)

    1.需要把Redhat注册的信息给解决掉 This system is not registered with an entitlement server. You can use subscript ...

  8. 【失败的经验】在linux下编译opencv for android

    cd /home/ahfu#选择opencv 3.4.6版本来编译wget https://github.com/opencv/opencv/archive/3.4.6.tar.gztar -zxvf ...

  9. WebGPU图形编程(2):构建一个单色的三角形<学习引自徐博士教程>

    非常兴奋,我坚持了下来,开始更新我的第二篇博客,还是关于WebGPU的,我在学习过程中,对这项技术非常感兴趣,即使它非常抽象,难以理解,因为我看到未来Web3D的发展,WebGPU会成为主流技术,学习 ...

  10. Docker 与 K8S学习笔记(十八)—— Pod的使用

    Pod 是一组紧密关联的容器集合,它们共享IPC.Network和UTS namespace,是 Kubernetes 调度的基本单元.Pod 的设计理念是支持多个容器在一个 Pod 中共享网络和文件 ...