1. 什么是grpc和protobuf

1.1 grpc

  gRPC是一个高性能、开源和通用的RPC框架,面向移动和HTTP/2设计。目前提供C、Java和Go语言版本,分别是:grpc,grpc-java,grpc-go.其中C版本支持C,C++,Node.js,Python,Ruby,Objective-C,PHP和C#支持.
grpc遵循HTTP/2协议,是一个二进制协议
grpc与http一样,底层都是tcp连接,遵循socket套接字 RPC是指远程过程调用,两台服务器A,B。A(客户端)调用B(服务端)上的方法,由于不在同一个内存空间,不能直接调用,需要通过网络调用。

1.2 protobuf

Protocol Buffer是一种协议。
Protocol Buffer 其实 是 Google出品的一种轻量 & 高效的结构化数据存储格式,性能比Json、XML真的强2-100倍!
protobuf经历了protobuf2和protobuf3,pb3比pb2简化了很多,目前主流的版本是pb3 protobuf优点:
1.性能好:
压缩性能;
序列化和发序列化快,比Json、XML强2-100倍;
传输速度快。
2.便捷性好:
使用简单,自动生成序列化和反序列化代码;
维护成本低,只维护proto文件
向后兼容,不必破坏旧格式
加密性好
3.跨语言,跨平台,支持各种语言 protobuf缺点:
1.通用性差,json可以任何语言都支持,但是protobuf需要专门的解析库
2.自解释性差,只有通过proto文件才能了解数据结构

2.go下grpc

2.1官网下载protobuf工具

官网:https://github.com/protocolbuffers/protobuf/releases

2.2 下载go的依赖包

go get github.com/golang/protobuf/protoc-gen-go

2.3 编写proto文件

option go_package = "./;proto";
解释:
./;:生成文件的路径
proto:生成文件的包名

hello.proto

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

2.4 生成hello.pb.proto文件

cd到proto目录下
命令:protoc -I . hello.proto --go_out=plugins=grpc:.
命令解释:
protoc -I .:在当前路径下寻找hello.proto文件
--go_out=plugins=grpc:. :生成go语言的proto文件放在当前路径下

2.5 编写server端代码

package main

import (
"context"
"file_test/grpc_go/proto"
"net" "google.golang.org/grpc"
) type Server struct {} // 业务逻辑
func (s *Server) SayHello(ctx context.Context, request *proto.HelloRequest) (*proto.HelloReply, error) {
res := &proto.HelloReply{
Message: "hello " + request.Name,
}
return res, nil
} // 启动rpc的server服务
func start() {
// 1.实例化server
g := grpc.NewServer()
// 2.注册逻辑到server中
proto.RegisterGreeterServer(g,&Server{})
// 3.启动server
lis,err:=net.Listen("tcp","127.0.0.1:8081")
if err !=nil{
panic("监听错误:"+err.Error())
} err = g.Serve(lis)
if err !=nil{
panic("启动错误:"+err.Error())
}
} func main() {
start()
}

2.6 编写client端代码

package main

import (
"context"
"file_test/grpc_go/proto"
"fmt" "google.golang.org/grpc"
) // rpc调用
func clientRpc(body map[string]string) (res *proto.HelloReply, err error) {
name := body["name"]
conn, err := grpc.Dial("127.0.0.1:8081", grpc.WithInsecure())
if err != nil {
return nil,err
}
defer conn.Close() rpc := proto.NewGreeterClient(conn)
response, err := rpc.SayHello(context.Background(), &proto.HelloRequest{Name: name})
if err != nil {
return nil,err
}
return response,nil
} // 业务代码
func start() {
body := make(map[string]string)
body["name"] = "jeff"
response,err := clientRpc(body)
if err!=nil{
fmt.Println("rpc调用失败:",err)
return
}
fmt.Println(response.Message)
} func main() {
start()
} //结果:
hello jeff

2.7 python和go相互调用实践(跨语言调用)

proto文件共用。
1.开启python的server端,go的client端测试。
2.开启go的server端,python的clinet端测试。

最新文章

  1. Web.xml配置详解之context-param
  2. mysql导入导出sql文件
  3. 3分钟,9个Q&A让你快速知道Docker到底是什么
  4. Merkle Patricia Tree (MPT) 树详解
  5. 扩展 delphi 线程 使之传递参数.
  6. Rabbit MQ安装配置及常见问题
  7. .NET MVC插件化开发(支持Script和css压缩)
  8. NOI2011 NOI嘉年华
  9. 在UC浏览器上很炫的一个效果
  10. linux 命令之 uptime
  11. wpf中内置资源文件
  12. Elasticsearch 全教程--入门
  13. python处理Excel - xlrd xlwr openpyxl
  14. 恢复git reset --hard之前尚未push的commit提交
  15. java 学习笔记
  16. 浅谈一下mshta在CVE-2017-11882里的命令构造
  17. 用scp这个命令来通过ssh传输文件
  18. [SoapUI] Groovy获取HTTP Status
  19. PC端meta标签
  20. Linux服务器CPU、内存、磁盘空间、负载情况查看python脚本

热门文章

  1. MyBatis报错—Type handler was null on parameter mapping for property 'createTime'. It was either not specified and/or could not be found for the javaType (javax.xml.crypto.Data) : jdbcType (null) combina
  2. Maven——setting.xml配置
  3. 同一局域网ping ip 失败(可能是你的路由器坑了你)
  4. 在Windows11使用WSA运行Google play会遇到的问题
  5. Java Byte不能用equals
  6. 七牛云简单实用-uploadManager.put(..)抛出异常
  7. Django的models中filter的各种用法及官方手册的网址
  8. vue集成CKEditor构建框架的使用,遇到富文本框不出现工具栏等操作
  9. kafka partiton迁移方法与原理
  10. 转:C++11常用新特性快速一览