2019独角兽企业重金招聘Python工程师标准>>>

这不是教程,只是个人总结,有兴趣的童鞋可以搭配源码看看:acuprpc

gRPC是Google开源的跨语言远程服务调用(RPC)框架,通信协议用的HTTP/2,数据传输默认用的protocol buffers(一种轻便高效的结构化数据存储格式,想比json更小更快,不过没有可读性)。

需要先掌握grpc的基本用法: gRPC-Java 示例

项目结构

- acuprpc+ acuprpc-core  //server/client核心处理逻辑+ acuprpc-protocol-grpc  //基于grpc实现远程调用+ acuprpc-spring-boot-starter  //server端服务扫描,client端动态代理,服务注册/发现

grpc通信

接口定义

定义服务提供者(server)和服务调用者(client)交流所用的数据结构,client需要告诉server要调用的类名、方法名以及参数(json格式的字符串,在server端再反序列化)。

syntax = "proto3";option java_multiple_files = true;
option java_package = "com.acupt.acuprpc.protocol.grpc.proto";
option java_outer_classname = "GrpcServiceProto";package com.acupt.acuprpc.protocol.grpc.proto;service GrpcService {rpc invokeMethod (InvokeRequest) returns (InvokeResponse) {}
}message InvokeRequest {string appName = 1;string serviceName = 2;string methodName = 3;repeated string orderedParameter = 4;map<string, string> namedParameter = 5;
}message InvokeResponse {int32 code = 1;string message = 2;string result = 3;
}

grpc-service

这个类负责接收grpc-client发过来的请求,取出请求中的参数,转换成通用的结构,交给core层的RpcServer去执行对应方法,然后将返回值序列化成json返回给grpc-client。

public class GrpcService extends GrpcServiceGrpc.GrpcServiceImplBase {private RpcServer rpcServer;public GrpcService(RpcServer rpcServer) {this.rpcServer = rpcServer;}@Overridepublic void invokeMethod(InvokeRequest request, StreamObserver<InvokeResponse> responseObserver) {RpcRequest rpcRequest = new RpcRequest(request.getAppName(),request.getServiceName(),request.getMethodName(),request.getOrderedParameterList(),request.getNamedParameterMap());RpcResponse rpcResponse = rpcServer.execute(rpcRequest);InvokeResponse response = InvokeResponse.newBuilder().setCode(rpcResponse.getCode()).setMessage(rpcResponse.getMessage()).setResult(rpcResponse.getResultString()).build();responseObserver.onNext(response);responseObserver.onCompleted();}
}

grpc-server

作物服务提供者的具体实现类,只需要实现两个方法:启动服务和关闭服务,其他的交给core层的父类即可。

public class GrpcServer extends RpcServer {private Server server;public GrpcServer(RpcInstance rpcInstance) {super(rpcInstance);}@SneakyThrows@Overrideprotected void startRpc() {server = ServerBuilder.forPort(getRpcInstance().getRpcConf().getPort()).addService(new GrpcService(this)).build().start();}@Overrideprotected void shutdownRpc() {if (server != null) {server.shutdown();}}
}

grpc-client

作为服务调用者,需要把动态代理类传来的请求信息包装成grpc支持的结构,并调用grpc的请求方法,再把远程服务返回的结果返回给代理类。


public class GrpcClient extends RpcClient implements RpcCode {private AtomicReference<GrpcServiceGrpc.GrpcServiceFutureStub> stubRef;public GrpcClient(NodeInfo nodeInfo) {super(nodeInfo);this.stubRef = new AtomicReference<>(getStub(nodeInfo));}@Overrideprotected String remoteInvoke(RpcRequest rpcRequest) {InvokeRequest.Builder builder = InvokeRequest.newBuilder().setAppName(rpcRequest.getAppName()).setServiceName(rpcRequest.getServiceName()).setMethodName(rpcRequest.getMethodName());// ...ListenableFuture<InvokeResponse> future = stubRef.get().invokeMethod(builder.build());InvokeResponse response = null;//...return response.getResult();}@Override@SneakyThrowsprotected NodeInfo reconnectRpc(NodeInfo nodeInfo) {//...使用参数中的ip和端口建立新连接,并断开老的连接,可用于重新负载和异常节点重试}@Override@SneakyThrowspublic void shutdownRpc() {//...主动断开和服务端的连接}private GrpcServiceGrpc.GrpcServiceFutureStub getStub(NodeInfo nodeInfo) {//...和服务端建立连接,使用参数中的ip和端口}

转载于:https://my.oschina.net/liujiest/blog/2964086

从0.5到1写个rpc框架 - 2:远程服务调用(grpc)相关推荐

  1. 【RPC框架、RPC框架必会的基本知识、手写一个RPC框架案例、优秀的RPC框架Dubbo、Dubbo和SpringCloud框架比较】

    一.RPC框架必会的基本知识 1.1 什么是RPC? RPC(Remote Procedure Call --远程过程调用),它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络的技术. ...

  2. 手写实现RPC框架基础功能

    随着微服务.分布式的流行,基本复杂点的项目都会涉及到远程调用,最基础的可以使用http来实现调用,也可以通过一些RPC框架来实现,比如Ailiaba 的dubbo,Thrift等.那么作为一个rpc框 ...

  3. 手写一个RPC框架,理解更透彻(附源码)

    作者:烟味i www.cnblogs.com/2YSP/p/13545217.html 一.前言 前段时间看到一篇不错的文章<看了这篇你就会手写RPC框架了>,于是便来了兴趣对着实现了一遍 ...

  4. 面试官:你给我手写个RPC框架看看

    本文主要论述的是"RPC 实现原理",那么首先明确一个问题什么是 RPC 呢?RPC 是 Remote Procedure Call 的缩写,即,远程过程调用.RPC 是一个计算机 ...

  5. 从零开始写一个RPC框架的详细步骤

    http://blog.csdn.net/liu88010988/article/details/51547592 定位 所谓定位就是回答几个问题,我出于什么目的要写一个框架,我的这个框架是干什么的, ...

  6. 为带你搞懂RPC,手写了RPC框架

    如今,分布式系统大行其道,RPC 有着举足轻重的地位.Dubbo.Thrift.gRpc 等框架各领风骚,学习RPC是新手也是老鸟的必修课.本文带你手撸一个rpc-spring-starter,深入学 ...

  7. 面试官让我手写一个RPC框架

    如今,分布式系统大行其道,RPC 有着举足轻重的地位.Dubbo.Thrift.gRpc 等框架各领风骚,学习RPC是新手也是老鸟的必修课.本文带你手撸一个rpc-spring-starter,深入学 ...

  8. 自己手写一个RPC,实现远程调用功能(基于netty、反射和代理)

    emmm,昨天蘑菇街一面,我感觉面试官特别好,最后的时候给了我一些建议和方向,感觉启发很大.面试过程中,问了我几个相对开放的问题,没怎么问基础.但是我感觉我答的不很好,第一次面大公司有点紧张.希望过过 ...

  9. 【手写一个RPC框架】simpleRPC-04

    目录 前言 实现 项目创建 配置依赖 common service server client 文件结构 运行 本项目所有代码可见:https://github.com/weiyu-zeng/Simp ...

  10. 【手写一个RPC框架】simpleRPC-05

    目录 前言 实现 项目创建 依赖配置 common service codec client server 文件结构 运行 本项目所有代码可见:https://github.com/weiyu-zen ...

最新文章

  1. P4269 [USACO18FEB]Snow Boots G
  2. JavaWeb 入门篇(2)Hello Servlet!!!
  3. Visual Studio 2015安装教程(附激活码)
  4. vim 怎么显示空格_vim 修改tab为四个空格
  5. 人脸识别三大经典算法_人脸识别系列四 | DeepID1算法
  6. 细说ReactiveCocoa的冷信号与热信号(二):为什么要区分冷热信号
  7. ASP.NET企业开发框架IsLine FrameWork系列之九--ExceptionProcessProvider异常框架(上)
  8. Spring 基础 用mock对Controller执行测试(系列号4)
  9. python分布式多进程框架 Ray
  10. JavaScript_HTML DEMO_2_事件
  11. 几句话就能让你明白:热备份路由选择协议(HSRP)
  12. sql-server-storage-internals
  13. combox控件触发事件_dom事件
  14. xp共享文件夹服务器,xp共享文件夹服务器
  15. 大白话理解LSTM神经网络(附实例讲解)
  16. Jupyterlab 执行时间插件
  17. 【硬件篇之电源纹波噪声测试】
  18. 【方法/函数】 矩阵相乘
  19. lol老是闪退到桌面_lol闪退到桌面怎么解决
  20. fluent-edem耦合出错,如何继续计算。

热门文章

  1. android.content.SharedPreferences.edit()
  2. 详解 ASP.NET并行,异步,多线程
  3. 61单片机程序下载一闪而过,下载完成之后没有看到实验现象。
  4. Winfrom 中如何实现combox 的列表自动显示ToolTip提示
  5. libvirt 创建的文件
  6. 【ARM】【NEON加速介绍】
  7. 线性判别分析(Linear Discriminant Analysis ,简称LDA)
  8. 阅读文献整理20220104
  9. 【空间统计】0 空间统计基础理论
  10. 每天一点正则表达式积累(六)