概述:

gRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。

RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制,使得应用程序之间可以进行通信,而且也遵从server/client模型。 与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。

gRPC 官方文档中文版:http://doc.oschina.net/grpc

如下图所示就是一个典型的gRPC结构图:

1、protocol buffers

gRPC 默认使用 protocol buffers,这是 Google 开源的一套成熟的结构数据序列化机制(当然也可以使用其他数据格式如 JSON)。正如你将在下方例子里所看到的,你用 proto files 创建 gRPC 服务,用 protocol buffers 消息类型来定义方法参数和返回类型。

Protocol buffers 版本
使用的是 proto3 的新风格的 protocol buffers,它拥有轻量简化的语法、一些有用的新功能,并且支持更多新语言。

2、定义服务

定义一个服务:一个 RPC 服务通过参数和返回类型来指定可以远程调用的方法。

我们使用 protocol buffers 接口定义语言来定义服务方法,用 protocol buffer 来定义参数和返回类型。客户端和服务端均使用服务定义生成的接口代码。

这里我们服务定义的例子,在 helloworld.proto 里用 protocol buffers IDL 定义的。Greeter 服务有一个方法 SayHello ,可以让服务端从远程客户端接收一个包含用户名的 HelloRequest 消息后,在一个 HelloReply 里发送回一个 Greeter。

定义接口和数据类型:

syntax = "proto3";option java_package = "io.grpc.examples";package helloworld;// The greeter 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;
}

3、生成 gRPC 代码

定义好服务,我们可以使用 protocol buffer 编译器 protoc 来生成创建应用所需的特定客户端和服务端的代码 - 你可以生成任意 gRPC 支持的语言的代码,当然 PHP 和 Objective-C 仅支持创建客户端代码。生成的代码同时包括客户端的存根和服务端要实现的抽象接口,均包含 Greeter 所定义的方法。

这里我们使用JAVA语言结合geogle提供的protobuf生成工具,首先在pom文件添加依赖以及插件:

<dependencies><dependency><groupId>io.grpc</groupId><artifactId>grpc-netty-shaded</artifactId><version>1.17.1</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-protobuf</artifactId><version>1.17.1</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-stub</artifactId><version>1.17.1</version></dependency></dependencies><build><extensions><extension><groupId>kr.motd.maven</groupId><artifactId>os-maven-plugin</artifactId><version>1.4.1.Final</version></extension></extensions><plugins><plugin><groupId>org.xolstice.maven.plugins</groupId><artifactId>protobuf-maven-plugin</artifactId><version>0.5.0</version><configuration><protocArtifact>com.google.protobuf:protoc:3.0.0:exe:${os.detected.classifier}</protocArtifact><pluginId>grpc-java</pluginId><pluginArtifact>io.grpc:protoc-gen-grpc-java:1.0.0:exe:${os.detected.classifier}</pluginArtifact><protoSourceRoot>${project.basedir}/src/main/proto</protoSourceRoot><outputDirectory>${project.basedir}/src/main/java</outputDirectory><clearOutputDirectory>false</clearOutputDirectory></configuration><executions><execution><phase>compile</phase><goals><goal>compile</goal><goal>compile-custom</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>6</source><target>6</target></configuration></plugin></plugins></build>

点击MAVEN的protobuf插件,进行代码生成:protobuf:compile-python

4、gRPC代码结构

gRPC server端代码

#!/usr/bin/env python
# -*-coding: utf-8 -*-from concurrent import futures
import grpc
import logging
import timefrom rpc_package.helloworld_pb2_grpc import add_HelloWorldServiceServicer_to_server, \ HelloWorldServiceServicer
from rpc_package.helloworld_pb2 import HelloRequest, HelloReplyclass Hello(HelloWorldServiceServicer):# 这里实现我们定义的接口def SayHello(self, request, context):return HelloReply(message='Hello, %s!' % request.name)def serve():# 这里通过thread pool来并发处理server的任务server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))# 将对应的任务处理函数添加到rpc server中add_HelloWorldServiceServicer_to_server(Hello(), server)# 这里使用的非安全接口,世界gRPC支持TLS/SSL安全连接,以及各种鉴权机制server.add_insecure_port('[::]:50000')server.start()try:while True:time.sleep(60 * 60 * 24)except KeyboardInterrupt:server.stop(0)if __name__ == "__main__":logging.basicConfig()serve()

gRPC client端代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-from __future__ import print_function
import loggingimport grpc
from rpc_package.helloworld_pb2 import HelloRequest, HelloReply
from rpc_package.helloworld_pb2_grpc import HelloWorldServiceStubdef run():# 使用with语法保证channel自动closewith grpc.insecure_channel('localhost:50000') as channel:# 客户端通过stub来实现rpc通信stub = HelloWorldServiceStub(channel)# 客户端必须使用定义好的类型,这里是HelloRequest类型response = stub.SayHello(HelloRequest(name='test'))print ("hello client received: " + response.message)if __name__ == "__main__":logging.basicConfig()run()

演示

先执行server端代码

python hello_server.py

接着执行client端代码如下:

python hello_client.py
hello client received: Hello, test!
引用:gRPC官网:https://grpc.io/
Google Protobuf简明教程:https://www.jianshu.com/p/b723053a86a6

RPC — 微服务之gRPC框架技术解析相关推荐

  1. 微服务电商项目技术全解析

    一.项目介绍 7d-mall-microservice 是一套微服务电商,其是在开源电商项目 mall-swarm 上进行了改造,采用了 Spring Cloud Hoxton & Aliba ...

  2. 《高楼的性能工程实战课》微服务电商项目技术全解析

    文章目录 一.项目介绍 二.整体结构 三.预备知识 1.什么是 SpringCloud ? 2.Spring .SpringBoot 和 Spring Cloud 的关系 3.Spring Cloud ...

  3. 容器化技术与微服务结合---SpringCloud框架与阿里云serverless k8s的结合(六)

    目录 系列 写在前面 Serverless K8S 概念 创建集群 微服务搭建 项目地址 环境区分以及dockerFile注意 阿里云日志接入 创建阿里云日志project 配置 测试 Kuberne ...

  4. 基于 Koa 的微服务 Node.js 框架设计思路与简单实现

    大家好,我是前端点线面,毕业于华中科技大学,非科班出身的一枚新时代农民工,现在是百度前端研发工程师,著有<前端百题斩>.数十篇学习思维导图(go.React.Redux.Vue.Vuex. ...

  5. 基于微服务和Docker容器技术的PaaS云平台架构设计

    本文讲的是基于微服务和Docker容器技术的PaaS云平台架构设计[编者的话]在系统架构上,PaaS云平台主要分为微服务架构.Docker容器技术.DveOps三部分,这篇文章重点介绍微服务架构的实施 ...

  6. JAVA SpringBlade 微服务开发平台框架,企业级的SaaS多租户微服务平台,基于Spring Boot 2.7

    SpringBlade微服务开发平台 完整代码下载地址:JAVA SpringBlade 微服务开发平台框架,企业级的SaaS多租户微服务平台 采用前后端分离的模式,前端开源两个框架:Sword (基 ...

  7. 儒猿秒杀季!微服务限流熔断技术源码剖析与架构设计

    疯狂秒杀季:49元秒杀 原价 299元 的 <微服务限流熔断技术源码剖析与架构设计课> 今天 上午11点,仅 52 套,先到先得! === 课程背景 === 成为一名架构师几乎是每个程序员 ...

  8. ASP.NET Core微服务(五)——【vue脚手架解析接口】

    ASP.NET Core微服务(五)--[vue脚手架解析接口]: 后台接口请参照:ASP.NET Core微服务(三)--[跨域配置]:[https://blog.csdn.net/feng8403 ...

  9. npm——安装教程、安装vue脚手架(ASP.NET Core微服务(五)——【vue脚手架解析接口】过度章节)

    npm:是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题. 比如常用的有: 1)允许用户从NPM服务器下载别人编写的第三方包到本地使用. 2)允许用户从NPM服务器下载并 ...

最新文章

  1. 第六篇:基于朴素贝叶斯分类算法的邮件过滤系统
  2. 头像裁剪上传_微信新功能:11月微信新玩法!给微信换上“皇冠头像”,还能加姓氏?...
  3. python polar contour_Python将2darray的最后一行和第二列添加到最后位置 - Polar Contour图...
  4. 机器学习hierarchical clustering_厉害了!几行代码搞定机器学习模型
  5. 使用ADB启动手机APP
  6. 判断推理——逻辑判断
  7. ipv6的127位掩码如何表示_IP地址与子网掩码划分经验分享
  8. 阿里云服务器怎么重装系统?
  9. 支付宝自动支付程序1.1算法注册机 Code.By.HackWm[D.S.T].
  10. 雪狐密码箱PwdBox记录导出
  11. 发了两个月传单,他转行做了程序员
  12. 第九篇:ROS的gazebo三维物理仿真环境联合使用
  13. 【阅读笔记】使用决策树预测泰坦尼克号幸存者实例 - scikit-learn机器学习
  14. LCD RGB 控制技术 时钟篇(上)
  15. 185电缆的接法图解_详细图解!原来电线接头有这么多接法……
  16. 趣味三大彩蛋命令安装shell脚本
  17. 关于signed main()不报超时与int main()报超时
  18. 听音乐用什么蓝牙耳机好?音质好的tws蓝牙耳机推荐
  19. 强烈推荐一位改变我命运的程序员大佬!当作礼物送给你!
  20. 华为交换机 access,trunk,hybrid理解,需一点基础,应该是最完整的

热门文章

  1. 基于Mysql的超市销售数据分析
  2. mysql异地多活方案_数据库跨云备份和异地多活解决方案.PDF
  3. 7-102 喊山 (30 分)(bfs
  4. 英语流利说 第12天
  5. Pygame zero最全集合(持续更新)
  6. make、makefile和cmake简单介绍
  7. 关于strerror
  8. 基于jeecgboot的flowable流程支持退回到发起人节点表单修改功能
  9. AI Studio学习篇3_《乘风破浪的姐姐》百度百科嘉宾信息爬取与数据分析
  10. 码云Pages搭建个人静态网站之旅