从0.5到1写个rpc框架 - 2:远程服务调用(grpc)
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)相关推荐
- 【RPC框架、RPC框架必会的基本知识、手写一个RPC框架案例、优秀的RPC框架Dubbo、Dubbo和SpringCloud框架比较】
一.RPC框架必会的基本知识 1.1 什么是RPC? RPC(Remote Procedure Call --远程过程调用),它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络的技术. ...
- 手写实现RPC框架基础功能
随着微服务.分布式的流行,基本复杂点的项目都会涉及到远程调用,最基础的可以使用http来实现调用,也可以通过一些RPC框架来实现,比如Ailiaba 的dubbo,Thrift等.那么作为一个rpc框 ...
- 手写一个RPC框架,理解更透彻(附源码)
作者:烟味i www.cnblogs.com/2YSP/p/13545217.html 一.前言 前段时间看到一篇不错的文章<看了这篇你就会手写RPC框架了>,于是便来了兴趣对着实现了一遍 ...
- 面试官:你给我手写个RPC框架看看
本文主要论述的是"RPC 实现原理",那么首先明确一个问题什么是 RPC 呢?RPC 是 Remote Procedure Call 的缩写,即,远程过程调用.RPC 是一个计算机 ...
- 从零开始写一个RPC框架的详细步骤
http://blog.csdn.net/liu88010988/article/details/51547592 定位 所谓定位就是回答几个问题,我出于什么目的要写一个框架,我的这个框架是干什么的, ...
- 为带你搞懂RPC,手写了RPC框架
如今,分布式系统大行其道,RPC 有着举足轻重的地位.Dubbo.Thrift.gRpc 等框架各领风骚,学习RPC是新手也是老鸟的必修课.本文带你手撸一个rpc-spring-starter,深入学 ...
- 面试官让我手写一个RPC框架
如今,分布式系统大行其道,RPC 有着举足轻重的地位.Dubbo.Thrift.gRpc 等框架各领风骚,学习RPC是新手也是老鸟的必修课.本文带你手撸一个rpc-spring-starter,深入学 ...
- 自己手写一个RPC,实现远程调用功能(基于netty、反射和代理)
emmm,昨天蘑菇街一面,我感觉面试官特别好,最后的时候给了我一些建议和方向,感觉启发很大.面试过程中,问了我几个相对开放的问题,没怎么问基础.但是我感觉我答的不很好,第一次面大公司有点紧张.希望过过 ...
- 【手写一个RPC框架】simpleRPC-04
目录 前言 实现 项目创建 配置依赖 common service server client 文件结构 运行 本项目所有代码可见:https://github.com/weiyu-zeng/Simp ...
- 【手写一个RPC框架】simpleRPC-05
目录 前言 实现 项目创建 依赖配置 common service codec client server 文件结构 运行 本项目所有代码可见:https://github.com/weiyu-zen ...
最新文章
- P4269 [USACO18FEB]Snow Boots G
- JavaWeb 入门篇(2)Hello Servlet!!!
- Visual Studio 2015安装教程(附激活码)
- vim 怎么显示空格_vim 修改tab为四个空格
- 人脸识别三大经典算法_人脸识别系列四 | DeepID1算法
- 细说ReactiveCocoa的冷信号与热信号(二):为什么要区分冷热信号
- ASP.NET企业开发框架IsLine FrameWork系列之九--ExceptionProcessProvider异常框架(上)
- Spring 基础 用mock对Controller执行测试(系列号4)
- python分布式多进程框架 Ray
- JavaScript_HTML DEMO_2_事件
- 几句话就能让你明白:热备份路由选择协议(HSRP)
- sql-server-storage-internals
- combox控件触发事件_dom事件
- xp共享文件夹服务器,xp共享文件夹服务器
- 大白话理解LSTM神经网络(附实例讲解)
- Jupyterlab 执行时间插件
- 【硬件篇之电源纹波噪声测试】
- 【方法/函数】 矩阵相乘
- lol老是闪退到桌面_lol闪退到桌面怎么解决
- fluent-edem耦合出错,如何继续计算。