• 多语言:语言中立,支持多种语言。
  • 轻量级、高性能:序列化支持 PB(Protocol Buffer)和 JSON,PB 是一种语言无关的高性能序列化框架。
  • IDL:基于文件定义服务,通过 proto3 工具生成指定语言的数据结构、服务端接口以及客户端 Stub。
  • 设计理念
  • 移动端:基于标准的 HTTP2 设计,支持双向流、消息头压缩、单 TCP 的多路复用、服务端推送等特性,这些特性使得 gRPC 在移动端设备上更加省电和节省网络流量。
  • 服务而非对象、消息而非引用:促进微服务的系统间粗粒度消息交互设计理念。
  • 负载无关的:不同的服务需要使用不同的消息类型和编码,例如 protocol buffers、JSON、XML 和 Thrift。
  • 流:Streaming API。
  • 阻塞式和非阻塞式:支持异步和同步处理在客户端和服务端间交互的消息序列。
  • 元数据交换:常见的横切关注点,如认证或跟踪,依赖数据交换。
  • 标准化状态码:客户端通常以有限的方式响应 API 调用返回的错误。

文章推荐视频:

C++架构师学习地址:C/C++Linux服务器开发高级架构师/Linux后台架构师

分布式RPC开源框架—gRPC

轻松搞定RPC,微服务唾手可得

小结

  • grpc是个协议,对应的是proto文件
  • protobuf 是将jrpc转化为代码的工具

安装

grpc包

 go get -u google.golang.org/grpc

protobuf

go install google.golang.org/grpc/cmd/protoc-gen-go-grpc

protoc语法

  • -I 参数:指定import路径,可以指定多个-I参数,编译时按顺序查找,不指定时默认查找当前目录
  • --go_out :golang编译支持,支持以下参数
    • plugins=plugin1+plugin2 - 指定插件,目前只支持grpc,即:plugins=grpc
    • M 参数 - 指定导入的.proto文件路径编译后对应的golang包名(不指定本参数默认就是.proto文件中import语句的路径)
    • import_prefix=xxx - 为所有import路径添加前缀,主要用于编译子目录内的多个proto文件,这个参数按理说很有用,尤其适用替代一些情况时的M参数,但是实际使用时有个蛋疼的问题导致并不能达到我们预想的效果,自己尝试看看吧
    • import_path=foo/bar - 用于指定未声明package或go_package的文件的包名,最右面的斜线前的字符会被忽略
    • 末尾 :编译文件路径 .proto文件路径(支持通配符
 protoc --go_out=. example.proto
protoc --go-grpc_out=. example.proto

demo

demo git地址

proto文件

syntax = "proto3";# 定义了包名
package helloworld;// The greeting service definition.
service Greeter {// Sends a greetingrpc SayHello (HelloRequest) returns (HelloReply) {}
}// The request message containing the user's name.
message HelloRequest {string name = 1;
}// The response message containing the greetings
message HelloReply {string message = 1;
}

生成

protoc --go_out=. helloworld.proto
protoc --go-grpc_out=. helloworld.proto

会多了两个文件

服务端

package mainimport ("context""log""net""google.golang.org/grpc"pb "google.golang.org/grpc/examples/helloworld/helloworld"
)const (port = ":50051"
)// server is used to implement helloworld.GreeterServer.
type server struct {pb.UnimplementedGreeterServer
}// SayHello implements helloworld.GreeterServer
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {log.Printf("Received: %v", in.GetName())return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil
}func main() {lis, err := net.Listen("tcp", port)if err != nil {log.Fatalf("failed to listen: %v", err)}s := grpc.NewServer()pb.RegisterGreeterServer(s, &server{})if err := s.Serve(lis); err != nil {log.Fatalf("failed to serve: %v", err)}
}

注意

服务端其实是实现协议中的接口,即实现所有方法

type HelloServer interface {// 定义SayHello方法SayHello(context.Context, *HelloRequest) (*HelloResponse, error)mustEmbedUnimplementedHelloServer()
}

很多教程实现了mustEmbedUnimplementedHelloServer 这个方法,但是由于是小写, 同目录下是好的,跨了目录就会有问题。

应该直接:

type server struct {pb.UnimplementedGreeterServer
}

客户端

package mainimport ("context""log""os""time""google.golang.org/grpc"pb "google.golang.org/grpc/examples/helloworld/helloworld"
)const (address     = "localhost:50051"defaultName = "world"
)func main() {// Set up a connection to the server.conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock())if err != nil {log.Fatalf("did not connect: %v", err)}defer conn.Close()c := pb.NewGreeterClient(conn)// Contact the server and print out its response.name := defaultNameif len(os.Args) > 1 {name = os.Args[1]}ctx, cancel := context.WithTimeout(context.Background(), time.Second)defer cancel()r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name})if err != nil {log.Fatalf("could not greet: %v", err)}log.Printf("Greeting: %s", r.GetMessage())
}

常见的坑

  • grpc版本和protoc的版本不一致,如果是第一次用,就都用最新的就好了,后面就一直用这个版本。或者换最新版本重新生成代码文件。

结语

  • 如果有不对的地方欢迎指正。
  • 如果有不理解的地方欢迎指出我来加栗子。
  • 如果感觉OK可以点赞让更多人看到它。

文章福利:现在C++程序员面临的竞争压力越来越大。那么,作为一名C++程序员,怎样努力才能快速成长为一名高级的程序员或者架构师,或者说一名优秀的高级工程师或架构师应该有怎样的技术知识体系,这不仅是一个刚刚踏入职场的初级程序员,也是工作三五年之后开始迷茫的老程序员,都必须要面对和想明白的问题。为了帮助大家少走弯路,技术要做到知其然还要知其所以然。以下视频获取点击:C++架构师学习资料

如果想学习C++工程化、高性能及分布式、深入浅出。性能调优、TCP,协程,Nginx源码分析Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,Linux内核,P2P,K8S,Docker,TCP/IP,协程,DPDK的朋友可以看一下这个学习地址:C/C++Linux服务器开发高级架构师/Linux后台架构师

【微服务落地】服务间通信方式: gRPC相关推荐

  1. 微服务落地,我们在考虑什么?

    点击蓝色"程序猿DD"关注我哟 加个"星标",不忘签到哦 来源:博云技术社区 导读 微服务已经成为过去几年软件架构设计的"事实标准",大多数 ...

  2. 微服务落地,我们在考虑什么?| 技术头条

    戳蓝字"CSDN云计算"关注我们哦! 技术头条:干货.简洁.多维全面.更多云计算精华知识尽在眼前,get要点.solve难题,统统不在话下! 作者:李宁 转自: 博云技术社区 导读 ...

  3. 微服务落地践行渐进,4个QA一窥金融微服务现状

    2019独角兽企业重金招聘Python工程师标准>>> 1月13日,中国双态运维用户大会在北京举办.来自银行.保险.证券.政府.央企等多个行业的330多位企业用户参加,其中工商银行信 ...

  4. DDD微服务架构设计第四课 微服务落地实践的技术中台

    10 微服务落地的技术实践 如今,做一个优秀的程序员越来越难.激烈的市场竞争.互联网快速的迭代.软件系统规模化发展,无疑都大大增加了软件设计的难度.因此,对于架构师的能力要求也越来越高,就像我的一本书 ...

  5. 干货|基于 Spring Cloud 的微服务落地

    转载自 干货|基于 Spring Cloud 的微服务落地 微服务架构模式的核心在于如何识别服务的边界,设计出合理的微服务.但如果要将微服务架构运用到生产项目上,并且能够发挥该架构模式的重要作用,则需 ...

  6. SpringCloud微服务-服务注册发现-负载均衡-服务调用-服务降级-服务网关-配置中心-消息总线-消息驱动-链路追踪-alibaba-nacos-sentinel-seata理论原理分析

    SpringCloud理论技术 概述 ​ Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总 ...

  7. 【微服务】什么是微服务?微服务与分布式的区别?微服务怎么具体实践微服务?服务端发现和客户端发现...

    目录 什么是微服务 微服务与分布式的区别 HOW - 怎么具体实践微服务 So What - 思考 服务发现 微服务之客户端发现,服务端发现 参考资料和推荐阅读 什么是微服务 https://zhua ...

  8. 【微服务】什么是微服务?微服务与分布式的区别?微服务怎么具体实践微服务?服务端发现和客户端发现

    目录 什么是微服务 微服务与分布式的区别 HOW - 怎么具体实践微服务 So What - 思考 服务发现 微服务之客户端发现,服务端发现 参考资料和推荐阅读 什么是微服务 https://zhua ...

  9. 微服务和服务网格有什么区别,Istio告诉你

    原文发表于kubernetes中文社区,为作者原创翻译 ,原文地址 更多kubernetes文章,请多关注kubernetes中文社区 目录 微服务架构的好处 微服务架构的组件 微服务架构的复杂性 为 ...

最新文章

  1. 计算机书籍-机器学习中的经典算法
  2. javascript设计模式与开发实践(二)- 封装和原型模式
  3. 解决AndroidStudio2.0导入eclipse项目时卡死的问题
  4. 有关eclipse for java ee版本遇到的坑( Context initialization failed)
  5. raid-6磁盘阵列损坏导致数据丢失的恢复过程(图文教程)
  6. 图像形状特征提取c语言,OpenCV_局部图像特征的提取与匹配_源代码
  7. 有关Silverlight TreeView组件的研究[2]——Silverlight学习笔记(7)
  8. MVP Open Day 2011
  9. docker: Error response from daemon: Unknown runtime specified nvidia.
  10. 初试 Windows Small Business Server 2003
  11. 雷军:《硅谷之火》给了我一个世界级的梦想
  12. labview与C数据类型的对应关系
  13. Linux安装阿里yum源
  14. OpenCV OAK-D-S2相机测试
  15. Iphone开发用导航控制器实现视图的分层切换(UINavigationController)
  16. 35、StylizedNeRF Consistent 3D Scene Stylization as Stylized NeRF via 2D-3D Mutual Learning
  17. js、jquery操作复选框checkbox总结(单个/多个获取选中值、初始化设置默认选中值、全选反选)
  18. 【个人练习3.11】7 c++练习题
  19. 【人工智能】实验一:基于MLP的手写体字符识别
  20. C语言实现流媒体广播项目

热门文章

  1. 第三次的面试的 笔试题目
  2. 融资租赁业务系统(财务中台)
  3. 无线传输最远可以传输距离_无线电源传输的梦想可能很快成为现实
  4. 《2016年度中国智库大数据报告》发布 哪些智库进入TOP20榜单
  5. 构造原理中的独立性条件如果不满足,是否原结论仍然成立?试用模拟的方法验证你的结论。
  6. windows运行快捷命令
  7. 自助报表到底是什么?
  8. PySimpleGUI库的查询小程序开发
  9. Python Flask微信小程序登录流程及登录api实现代码
  10. android 动态创建View