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中find命令用法全汇总,看完就没有不会用的!

    Linux中find命令用法全汇总,看完就没有不会用的! 中琦2513 马哥Linux运维 2017-04-10   糖豆贴心提醒,本文阅读时间7分钟 Linux 查找命令是Linux系统中最重要和最 ...

  2. Netperf测试技巧

    Netperf测试技巧   Netperf测试技巧 1.概况 Netperf是一种网络性能的测量工具,主要针对基于TCP或UDP的传输.Netperf根据应用的不同,可以进行不同模式的网络性能测试,即 ...

  3. 在Windows上使用 Python 安装+ win10启用长路径

    https://docs.python.org/zh-cn/3/using/windows.html 成功20200131 https://docs.python.org/zh-cn/3/using/ ...

  4. gpgj - 06.估值分析举例

    06.估值分析举例 1.举个栗子-贵州茅台的护城河 品牌效益高 只有高档产品 不卖中低档,不会拉低公司收入 {   "question": "我们来复习一下护城河要如何分 ...

  5. Django(37)配置django日志

    前言   django框架的日志通过python内置的logging模块实现的,既可以记录自定义的一些信息描述,也可以记录系统运行中的一些对象数据,还可以记录包括堆栈跟踪.错误代码之类的详细信息.   ...

  6. (最新)VS2015安装以及卸载过程——踩坑实录

    前言 Visual Studio (简称VS)是微软公司旗下最重要的软件集成开发工具产品.是目前最流行的 Windows 平台应用程序开发环境,也是无数人学习编程的入门软件之一.Visual Stud ...

  7. TVM将深度学习模型编译为WebGL

    使用TVM将深度学习模型编译为WebGL TVM带有全新的OpenGL / WebGL后端! OpenGL / WebGL后端 TVM已经瞄准了涵盖各种平台的大量后端:CPU,GPU,移动设备等.这次 ...

  8. springboot——修改html实时生效,不用重启tomca(idea版)

    第一步: 在全局配置文件(application.properties)中禁用thymeleaf模板引擎的缓存,缓存是默认开启的 spring.thymeleaf.cache=false 第二步: 在 ...

  9. Redisson 分布式锁实现之前置篇 → Redis 的发布/订阅 与 Lua

    开心一刻 我找了个女朋友,挺丑的那一种,她也知道自己丑,平常都不好意思和我一块出门 昨晚,我带她逛超市,听到有两个人在我们背后小声嘀咕:"看咱前面,想不到这么丑都有人要." 女朋友 ...

  10. 学废了系列 - WebGIS vs WebGL图形编程

    目前工作中有不少涉及到地图的项目,我参加了几次技术评审,前端伙伴们在 WebGIS 方面的知识储备稍有不足,这次分享的主要目的是科普一些在前端领域比较常用的 WebGIS 知识.另外,我之前的工作中积 ...