RPC的概念

RPC 全称 Remote Procedure Call——远程过程调用。是为了解决远程调用服务的一种技术,使得调用者像调用本地服务一样方便透明。简单的说,RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。

RPC框架的目标就是让远程过程(服务)调用更加简单、透明,RPC框架负责屏蔽底层的传输方式(TCP或UDP)、序列化方式(XML/JSON/二进制)和通信细节。框架使用者只需要了解谁在设么位置提供了什么样的远程服务接口即可,开发者不需要关心底层通信细节和调用过程。

RPC通信有如下特点:

  • RPC 会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯)
  • RPC 是一个请求响应模型。客户端发起请求,服务器返回响应(类似于Http的工作方式)
  • RPC 在使用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)。

一个RPC框架由三部分组成:

  1. 服务提供者: 它运行在服务端,负责提供服务接口定义和服务实现类。

  2. 服务发布者:它运行在RPC服务端,复杂将本地服务发布成远程服务,供其他消费者调用。

  3. 本地服务代理: 它运行在RPC客服端,通过代理调用远程服务提供者,然后将结果进行封装给本地消费者。

RPC通信模型如下图所示:

Lms的rpc框架实现

LMS框架使用rpc协议实现服务之间的通信。我们知道,要实现一个RPC框架,需要解决几个如下技术点:

  1. 远程服务提供者:需要以某种形式提供服务调用相关的信息,包括但不限于服务连接口定义、数据接口、或者中间态的服务定义文件;在LMS框架中,服务提供者以服务应用接口的方式提供服务调用的相关信息,服务调用者通过引用服务提供者的应用服务接口层(项目、包)的方式获取远程服务调用的相关信息。

  2. 远程代理对象:服务调用者调用的服务实际上是远程服务的本地代理,对于LMS框架而言,通过Castle.Core组件的动态代理拦截机制,将本地调用封装成远程服务调用。

  3. 通信:RPC框架于具体的通信协议无关;LMS框架使用dotnetty框架作为底层的通信框架。

  4. 序列化:远程通信,需要将对象转换成二进制码流进行网络传输,不同的序列化框架,支持的数据类型/数据包大小、异常类型以及性能等都不同。LMS框架默认使用json格式作为序列化格式,也支持通过MessagePack或是Protobuff作为序列化方式。

如何使用

在LMS框架中,服务调用者(消费者)通过引用服务提供者的应用接口层(包),就可以通过Castle.Core组件的动态代理拦截机制为服务应用接口生成本地代理,通过该代理与应用服务提供者进行通信,并将返回的接口封装给消费者,步骤如下所述:

  1. 将服务提供者的应用接口单独定义为一个应用程序集(包)。定义的应用接口需要通过ServiceRouteAttribute对服务应用接口的路由进行标识,服务提供者需要实现应用接口。

  2. 服务调用者服务需要通过项目(或是通过nuget包安装)的方式引用服务提供者的应用接口所定义的项目(包)。

  3. 开发者可以通过构造注入的方式使用应用服务接口,服务调用者就可以通过服务调用者的应用接口生成的动态代理与服务提供者进行通信。

public class TestProxyAppService : ITestProxyAppService
{
private readonly ITestAppService _testAppServiceProxy; // 应用提供者的应用接口,通过其生成服务调用者的本地动态代理
private readonly ICurrentServiceKey _currentServiceKey; public TestProxyAppService(ITestAppService testAppService,
ICurrentServiceKey currentServiceKey)
{
_testAppServiceProxy = testAppService;
_currentServiceKey = currentServiceKey;
} public async Task<TestOut> CreateProxy(TestInput testInput)
{
// _currentServiceKey.Change("v2");
// 通过应用接口生成的本地动态代理与服务提供者进行rpc通信
return await _testAppServiceProxy.Create(testInput);
}
}

备注

在rpc通信过程中,通过指定的ServiceKey来指定服务提供者的应用接口的实现类,可以在服务调用前,通过currentServiceKey.Change("serviceKeyName")来指定该rpc通信的serviceKey的值。

开源地址与文档

github: https://github.com/liuhll/lms

gitee: https://gitee.com/liuhll2/lms

开发者文档: http://docs.lms-fk.com/

加入我们

qq群: 934306776

lms微服务的rpc通信框架的更多相关文章

  1. 通过lms.samples熟悉lms微服务框架的使用

    经过一段时间的开发与测试,终于发布了Lms框架的第一个正式版本(1.0.0版本),并给出了lms框架的样例项目lms.samples.本文通过对lms.samples的介绍,简述如何通过lms框架快速 ...

  2. lms微服务框架主机介绍

    目录 概念 .net的通用主机 .net的web主机 lms的业务主机类型 用于托管业务应用的普通主机 1. 创建一个应用台程序 2. 安装Silky.Lms.NormHost包 3. 注册LMS服务 ...

  3. 微服务7:通信之RPC

    ★微服务系列 微服务1:微服务及其演进史 微服务2:微服务全景架构 微服务3:微服务拆分策略 微服务4:服务注册与发现 微服务5:服务注册与发现(实践篇) 微服务6:通信之网关 微服务7:通信之RPC ...

  4. 微服务8:通信之RPC实践篇(附源码)

    ★微服务系列 微服务1:微服务及其演进史 微服务2:微服务全景架构 微服务3:微服务拆分策略 微服务4:服务注册与发现 微服务5:服务注册与发现(实践篇) 微服务6:通信之网关 微服务7:通信之RPC ...

  5. 微服务架构的基础框架选择:Spring Cloud还是Dubbo?

    最近一段时间不论互联网还是传统行业,凡是涉及信息技术范畴的圈子几乎都在讨论微服务架构.近期也看到各大技术社区开始组织一些沙龙和论坛来分享Spring Cloud的相关实施经验,这对于最近正在整理Spr ...

  6. RPC通信框架——RCF介绍

    现有的软件中用了大量的COM接口,导致无法跨平台,当然由于与Windows结合的太紧密,还有很多无法跨平台的地方.那么为了实现跨平台,支持Linux系统,以及后续的分布式,首要任务是去除COM接口. ...

  7. RPC通信框架——RCF介绍(替换COM)

    阅读目录 RPC通信框架 为什么选择RCF 简单的性能测试 参考资料 总结 现有的软件中用了大量的COM接口,导致无法跨平台,当然由于与Windows结合的太紧密,还有很多无法跨平台的地方.那么为了实 ...

  8. eShopOnContainers 看微服务⑤:消息通信

    1.消息通信 传统的单体应用,组件间的调用都是使用代码级的方法函数.比如用户登录自动签到,增加积分.我们可以在登录函数调用积分模块的某个函数,为了解耦我们使用以来注入并放弃new Class()这种方 ...

  9. 【Java】分布式RPC通信框架Apache Thrift 使用总结

    简介 Apache Thrift是Facebook开源的跨语言的RPC通信框架,目前已经捐献给Apache基金会管理,由于其跨语言特性和出色的性能,在很多互联网公司得到应用,有能力的公司甚至会基于th ...

随机推荐

  1. Linux_交换分区SWAP

    一.交换分区SWAP 1️⃣:交换分区SWAP就是LINUX下的虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间(也就是SWAP分区)虚拟成内存来使用. 2️⃣:交换分区一般指定虚拟内存的大小 ...

  2. zabbix官方源替换为阿里云的zabbix源,一键脚本。(安装zabbix报错curl#18 - "transfer closed with 2988713 bytes remaining to read":15 ETA Trying other mirro)

    最近突然安装zabbix总是报错,比如 (24/27): t1lib-5.1.2-14.el7.x86_64.rpm | 166 kB 00:00:00 zabbix-web-4.4.6-1.el7. ...

  3. Java 关键字详解

    Java 关键字是 Java 语言中被赋予特殊意义的一些单词(每个关键字都代表着不同场景下的不同含义),不可以把它当作标识符来使用(不能用作变量名.方法名.类名.包名和参数名等).Java 中的关键字 ...

  4. PHP转JAVA开发30分钟实战攻略

    服务端开发中,有很多知识是相通的,例如mysql,redis,http协议等. 基于这些基础,在编程语言上的转变并不困难. 本文主要从下面几点出发,讲述如何快速从php开发转为java开发: 使用框架 ...

  5. Windows登录服务器CLI运行脚本出现 syntax error: unexpected end of file 错误的解决

    0.前言 通常我们在编辑 Linux 服务器上的文件时,直接在 Linux 环境比较麻烦(当然熟练使用 VIM 的程序员除外哈哈),有时我们会使用 Windows 将文件编辑好再上传到服务器端,我用的 ...

  6. Win7 64 + mysql5.6.24(.zip) 不知道root密码的情况下重设密码

    解决方式 第一步:在运行(常常在附件中)里输出cmd,右键以系统管理员身份登陆: 第二步:停止mysql服务,命令为:net stop mysql  注意,若不行将当前目录切换到mysql\bin目录 ...

  7. 三维视觉惯性SLAM的有效Schmidt-EKF

    三维视觉惯性SLAM的有效Schmidt-EKF An Efficient Schmidt-EKF for 3D Visual-Inertial SLAM 论文地址: http://openaccess ...

  8. 用于ONNX的TensorRT后端

    用于ONNX的TensorRT后端 解析ONNX模型以使用TensorRT执行. 另请参阅TensorRT文档. 有关最近更改的列表,请参见changelog. 支持的TensorRT版本 Maste ...

  9. 基于NVIDIA GPUs的深度学习训练新优化

    基于NVIDIA GPUs的深度学习训练新优化 New Optimizations To Accelerate Deep Learning Training on NVIDIA GPUs 不同行业采用 ...

  10. Java真的是白天鹅

    前言 我最近越来越真切的感受到,Java真的是白天鹅. 这真的是一种羡慕嫉妒恨的感受. 今天和一个Java技术Leader聊天,我告诉他敏捷开发是以人为本,他居然跟我说敏捷开发在行业内有规范,规范是死 ...