二维码

附录D ProtoBuf与gRPC - 数据结构 - 机器学习

1125 人阅读 | 时间:2021年01月15日 01:16
附录D ProtoBuf与gRPC - 数据结构 - 机器学习 #daohang ul li t,.reed .riqi,a.shangg,a.xiatt,a.shangg:hover,a.xiatt:hover,a.shang,a.xiat,a.shang:hover,a.xiat:hover,.reed-pinglun-anniu,span.now-page,#daohangs-around,#caidan-tubiao,#daohangs,#daohangs li,#btnPost{background-color:#D10B04;} .dinglanyou1 h3{border-bottom:3px solid #D10B04;} #dibuer{border-top:2px solid #D10B04;}.cebianlan .rongqi h3{border-bottom:1px solid #D10B04;} #edtSearch{border:1px solid #D10B04;} #daohang .zuo ul li{border-right:1px solid #;} #daohang ul li t a{border-top:1px solid #;border-right:1px solid #D10B04;} #daohang ul li t a:hover{border-right:1px solid #;} #daohang .you ul li a:hover,#daohang .zuo ul li a:hover,.reed-pinglun-anniu:hover{background-color:#;} a:hover,.reed h6 a:hover,#dibuer a:hover,.reed .riqiding,.cebianlan .rongqi li a:hover,#pinglun-liebiao ul.fubens li.depth-1 dl dd span.shu a,#pinglun-liebiao ul.fubens li.depth-1 dl dd span.huifuliuyan a:hover,.reed-biaoti h6 span{color:#D10B04;} .reed .kan a{color:#0A0AF5;}.reed .kan a:hover{color:#D10101;} @media screen and (max-width:1492px){a.shang,a.xiat{background:none;} a.xiat:hover,a.shang:hover{background-color:#f9f9f9;background-image:none;text-decoration:none;}} var _hmt = _hmt || [];(function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?b19db5ba3b437a9e8698d2bc8fc64334"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s);})(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?b19db5ba3b437a9e8698d2bc8fc64334"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?2d748c9763cfc72fb7d1ccab29f0770d"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?f6d451f3f1be23f3abf240c64c469c1b"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();

当前位置:首页 » 区块链精品文章 » 正文

(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646201", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646162", container: s }); })();

附录D ProtoBuf与gRPC

1271 人参与  2018年09月29日 10:46  分类 : 区块链精品文章  评论

ProtoBuf是一套接口描述语言(Interface Definition Language,IDL),类似于Apache的Thrift。相关处理工具主要是protoc,基于C++语言实现。用户写好.proto描述文件, 之后便可以使用protoc自动编译生成众多计算机语言(C++、Java、Python、C#、Golang等)的接口代码。这些代码可以支持 gRPC,也可以不支持。

gRPC是Google开源的RPC框架和库,已支持主流计算机语言。底层通信采用HTTP2协议,比较适合互联网场景。gRPC在设计上考虑了跟ProtoBuf的配合使用。

两者分别解决不同问题,可以配合使用,也可以分开单独使用。典型的配合使用场景是,写好.proto描述文件定义RPC的接口,然后用protoc(带gRPC插件)基于.proto模板自动生成客户端和服务端的接口代码。

ProtoBuf

需要工具主要包括:

·编译工具:protoc,以及一些官方没有带的语言插件;

·运行环境:各种语言的protobuf库,不同语言有不同的安装来源。

语法类似于C++语言,可以参考ProtoBuf语言规范:http://developers.google.com/protocol-buffers/docs/proto

比较核心的,message是代表数据结构(里面可以包括不同类型的成员变量,包括字符串、数字、数组、字典……),service代表RPC接口。变量后面的数字是代表进行二进制编码时候的提示信息,1~15表示热变量,会用较少的字节来编码。另外,支持导入。

默认所有变量都是可选的(optional),repeated则表示数组。主要service rpc接口接受单个message参数,返回单个message。如下所示:


syntax = "proto3";
package hello;

message HelloRequest {
    string greeting = 1;
}

message HelloResponse {
    string reply = 1;
    repeated int32 number=4;
}

service HelloService {
    rpc SayHello(HelloRequest) returns (HelloResponse){}
}

编译最关键的参数是输出语言格式参数,例如,Python为--python_out=OUT_DIR。

一些还没有官方支持的语言,可以通过安装protoc对应的plugin来支持。例如,对于Go语言,可以按照如下方式安装:


$ go get -u github.com/golang/protobuf/{protoc-gen-go,proto} // 前者是 plugin,
    后者是 go 的依赖库

之后,正常使用protoc--go_out=./hello.proto来生成hello.pb.go,会自动调用protoc-gen-go插件。

ProtoBuf提供了Marshal/Unmarshal方法来将数据结构进行序列化操作。所生成的二进制文件在存储效率上比XML高3~10倍,并且处理性能高1~2个数量级。

gRPC

相关工具主要包括:

·运行时库:各种不同语言有不同的安装方法(参考http://github.com/grpc/grpc/blob/master/INSTALL.md ),主流语言的包管理器都已支持;

·protoc,以及gRPC插件和其他插件:采用ProtoBuf作为IDL时,对.proto文件进行编译处理。

类似其他RPC框架,gRPC的库在服务端提供一个gRPC Server,客户端的库是gRPC Stub。典型的场景是客户端发送请求,同步或异步调用服务端的接口。客户端和服务端之间的通信协议是基于HTTP2的gRPC协议,支持双工的流式保序 消息,性能比较好,同时也很轻量。

采用ProtoBuf作为IDL,则需要定义service类型。生成客户端和服务端代码。用户自行实现服务端代码中的调用接口,并且利用客户端代码来发起请求到服务端。一个完整的例子可以参考http://github.com/grpc/grpc-go/blob/master/examples/helloworld

以上面proto文件为例,需要执行时添加gRPC的plugin:


$ protoc --go_out=plugins=grpc:. hello.proto

gRPC更多原理可以参考官方文档:http://www.grpc.io/docs

1.生成服务端代码

服务端相关代码如下,主要定义了HelloServiceServer接口,用户可以自行编写实现代码:


type HelloServiceServer interface {
        SayHello(context.Context, *HelloRequest) (*HelloResponse, error)
}

func RegisterHelloServiceServer(s *grpc.Server, srv HelloServiceServer) {
        s.RegisterService(&_HelloService_serviceDesc, srv)
}

用户需要自行实现服务端接口,代码如下。其中比较重要的是创建并启动一个gRPC服务的过程:

·创建监听套接字:lis,err:=net.Listen("tcp",port);

·创建服务端:grpc.NewServer();

·注册服务:pb.RegisterHelloServiceServer();

·启动服务端:s.Serve(lis)。


type server struct{}

// 这里实现服务端接口中的方法
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply,
    error) {
    return &pb.HelloReply{Message: "Hello " + in.Name}, nil
}

// 创建并启动一个gRPC服务的过程:创建监听套接字、创建服务端、注册服务、启动服务端
func main() {
    lis, err := net.Listen("tcp", port)
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    s := grpc.NewServer()
    pb.RegisterHelloServiceServer(s, &server{})
    s.Serve(lis)
}

编译并启动服务端。

2.生成客户端代码

生成的go文件中客户端相关代码如下,主要实现了HelloServiceClient接口。用户可以通过gRPC来直接调用这个接口:


type HelloServiceClient interface {
    SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption)
        (*HelloResponse, error)
}

type helloServiceClient struct {
    cc *grpc.ClientConn
}

func NewHelloServiceClient(cc *grpc.ClientConn) HelloServiceClient {
    return &helloServiceClient{cc}
}

func (c *helloServiceClient) SayHello(ctx context.Context, in *HelloRequest,
    opts ...grpc.CallOption) (*HelloResponse, error) {
        out := new(HelloResponse)
        err := grpc.Invoke(ctx, "/hello.HelloService/SayHello", in, out, c.cc, opts...)
        if err != nil {
            return nil, err
        }
        return out, nil
}

用户直接调用接口方法:创建连接、创建客户端、调用接口:


func main() {
    // 设置与服务器连接
    conn, err := grpc.Dial(address, grpc.WithInsecure())
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()
    c := pb.NewHelloServiceClient(conn)

    // Contact the server and print out its response.
    name := defaultName
    if len(os.Args) > 1 {
        name = os.Args[1]
    }
    r, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: name})
    if err != nil {
        log.Fatalf("could not greet: %v", err)
    }
    log.Printf("Greeting: %s", r.Message)
}

编译并启动客户端,查看到服务端返回的消息。


来源:我是码农,转载请保留出处和链接!

本文链接:http://www.54manong.com/?id=881

(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();
window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdPic":"","bdStyle":"0","bdSize":"16"},"share":{},"image":{"viewList":["qzone","tsina","tqq","renren","weixin"],"viewText":"分享到:","viewSize":"16"},"selectShare":{"bdContainerClass":null,"bdSelectMiniList":["qzone","tsina","tqq","renren","weixin"]}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];
区块链是什么  

微信号:qq444848023    QQ号:444848023

加入【我是码农】QQ群:864689844(加群验证:我是码农)

<< 上一篇 下一篇 >>
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646186", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646175", container: s }); })();
搜索

网站分类

标签列表

最近发表

    (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https'){ bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else{ bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();

全站首页 | 数据结构 | 区块链| 大数据 | 机器学习 | 物联网和云计算 | 面试笔试

var cnzz_protocol = (("https:" == document.location.protocol) ? "https://" : "http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1276413723'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s23.cnzz.com/z_stat.php%3Fid%3D1276413723%26show%3Dpic1' type='text/javascript'%3E%3C/script%3E"));本站资源大部分来自互联网,版权归原作者所有!

jQuery(document).ready(function($){ /* prepend menu icon */ $('#daohangs-around').prepend('
'); /* toggle nav */ $("#caidan-tubiao").on("click", function(){ $("#daohangs").slideToggle(); $(this).toggleClass("active"); }); });

©著作权归作者所有:来自ZhiKuGroup博客作者没文化的原创作品,如需转载,请注明出处,否则将追究法律责任 来源:ZhiKuGroup博客,欢迎分享。

评论专区
  • 昵 称必填
  • 邮 箱选填
  • 网 址选填
◎已有 0 人评论
搜索
作者介绍
30天热门
×
×
本站会员尊享VIP特权,现在就加入我们吧!登录注册×
»
会员登录
新用户注册
×
会员注册
已有账号登录
×