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端测试。

golang-grpc的更多相关文章

  1. Golang gRPC调试工具

    目录 Golang gRPC调试工具 1. 命令行工具 grpcurl 1.1 安装 1.2 验证 1.3 注册反射 1.4 使用示例 2. web调试工具grpcui 2.1 安装 2.2 验证 2 ...

  2. Golang gRPC 示例

    1.安装gRPC runtime go get google.golang.org/grpc 为了自动生成Golang的gRPC代码,需要安装protocal buffers compiler以及对应 ...

  3. Golang gRPC 和 gRPC-gateway 结合使用

    一.安装 go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway go get -u github.com/g ...

  4. Golang gRPC 使用

    一.概念 1.gRPC默认使用protocol buffers,这是google开源的一套成熟的结构数据序列化机制(当然也可以使用其他数据格式如JSON),可以用proto files创建gRPC服务 ...

  5. [golang grpc] 框架介绍

    官方网站 http://www.grpc.io/ http://www.grpc.io/docs/quickstart/go.html grpc安装 • go安装 目前grpc需要go 1.5以上版本 ...

  6. Golang gRPC微服务02: helloworld

    安装protobuf 在windows下,直接下载release版本https://github.com/protocolbuffers/protobuf/releases/tag/v3.9.0然后把 ...

  7. Golang gRPC微服务01: 介绍

    gRPC 是什么 gRPC是goole开源的一个RPC框架和库,支持多语言之间的通信.底层通信采用的是 HTTP2 协议.gRPC在设计上使用了 ProtoBuf 这种接口描述语言.这种IDL语言可以 ...

  8. golang gRPC初探

    gRPC使用protocol buffers作为Interface Definition Language (IDL). gRPC的底层信息交互格式也使用的是protocol buffers. 默认情 ...

  9. Golang gRPC学习(04): Deadlines超时限制

    为什么要使用Deadlines 当我们使用gRPC时,gRPC库关系的是连接,序列化,反序列化和超时执行.Deadlines 允许gRPC客户端设置自己等待多长时间来完成rpc操作,直到出现这个错误 ...

  10. golang grpc demo

    1.grpm 安装: git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc 2.proto, ...

随机推荐

  1. wordcloud库 词云

    •wordcloud使用方法 常规使用方法 import wordcloud #创建一个词云对象 w = wordcloud.WordCloud(background_color="whit ...

  2. Anaconda环境配置

    镜像下载.域名解析.时间同步请点击 阿里巴巴开源镜像站 前言 Anaconda环境配置 Anaconda安装完后要进行环境配置,环境配置就是安装虚拟环境,让程序可以在这个环境中运行! 一.Anacon ...

  3. 使用python自动发放员工工资条到个人邮箱

    人力资源部每个月发工资条,以前靠人工手动一条一条的复制,200多号员工,差不多需要耗费一天时间. 用python写个脚本,分分钟的事情就可以全部发送完. 我这边工资表如下图 姓名在C列,邮箱在B列. ...

  4. 解决IDEA的plugins安装插件很慢、不成功问题

    1.修改hosts文件 路径:C:\Windows\System32\drivers\etc 52.84.224.36 plugins.jetbrains.com 重启IDEA,再次安装插件时,芜湖~ ...

  5. ChIP-seq技术介绍|易基因

    大家好,这里是专注表观组学十余年,多组学科研服务领跑者的易基因. 染色质免疫沉淀后测序(ChIP seq)是一种针对DNA结合蛋白.组蛋白修饰或核小体的全基因组分析技术.由于二代测序技术的巨大进步,C ...

  6. vue单文件组件data选项的函数体获取vue实例对象

    因配置的关系,导致 vue的data选项中存在事件.而事件无法获取 vue 的实例对象:项目是单文件形式的,以下代码只是例子 new Vue({ el:..., data:{ a: { onevent ...

  7. 如果一个表有一列定义为 TIMESTAMP,将发生什么?

    每当行被更改时,时间戳字段将获取当前时间戳. 列设置为 AUTO INCREMENT 时,如果在表中达到最大值,会发生什么情况? 它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用. 怎样才 ...

  8. numpy入门—Numpy的核心array对象以及创建array的方法

    Numpy的核心array对象以及创建array的方法 array对象的背景: Numpy的核心数据结构,就叫做array就是数组,array对象可以是一维数组,也可以是多维数组: Python的Li ...

  9. html简单响应式滚动条置顶

    简单响应式滚动条置顶 一般的,让页面出现滚动条的常见方法有: overflow:auto||overflow:scroll 或者overflow-x水平滚动条和overflow-y垂直滚动条 那么现在 ...

  10. JAVA中内存分配的问题

    JAVA中内存分配的问题 1. 有这样一种说法,如今争锋于IT战场的两大势力,MS一族偏重于底层实现,Java一族偏重于系统架构.说法根据无从考证,但从两大势力各自的社区力量和图书市场已有佳作不难看出 ...