前言

netcore 发布以来,一直很关注netcore的进程。目前在公司负责的网站也历经波折的全部有.net framework 4.0 全部切换到netcore 2.2 版本中。虽然过程遇到的坑不少,但好在最后坚持下来。目前系统全部运行稳定运行在k8s。虽然目前已经用netcore 码了不少业务代码,但总觉得很多新的语言特性、新的api没有使用到,为了学习netcore,决定做造一些简单的轮子,顺便学习下网络编程。

关于Rpc

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。【百度百科】

实现步骤

  • 网络传输

    • 使用netcore 新的api System.IO.Pipelines 实现了一个基于TCP传输组件 组件地址
  • 序列化、反序列化

    • 使用简单的netcore3.0自带的System.Text.Json 实现【只为实现功能,性能可能不行】
  • 服务注册与获取

    • 使用netcore自带的DI组件Microsoft.Extensions.DependencyInjection

    • 服务注册

          private static void RegisterIService(Assembly assembly)
      {
      var serviceCollection = new ServiceCollection();
      var classTypes = assembly
      .GetTypes()
      .Where(type => type.IsClass && type.IsPublic && typeof(IRpcService).IsAssignableFrom(type)); foreach (var classType in classTypes)
      {
      var interfaceType = classType.GetInterfaces().FirstOrDefault();
      serviceCollection.AddSingleton(interfaceType, classType);
      Console.WriteLine($"注册服务:{interfaceType.FullName},{classType.Name}");
      }
      var provider = serviceCollection.BuildServiceProvider(); RpcServiceLocator.Init(provider, assembly);
      }
    • 通过类名获取类型,之后使用GetService获取注册的服务实例

  • 代理类生成

    • 使用 DispatchProxy 动态生成代理类

使用方法

  • 服务端

     //获取需要注册的服务所在的程序集
    var serviceAssembly = Assembly.GetAssembly(typeof(IUserService));
    serviceCollection.AddRpcServer(configuration, serviceAssembly);
    var serviceProvider = serviceCollection.BuildServiceProvider();
    var server = serviceProvider.GetService<RpcServer>();
    await server.StartAsync();
  • 客户端

    var serviceCollection = new ServiceCollection();
    var configuration = BuildConfiguration();
    serviceCollection.AddLogging(configure => configure.AddConsole()); serviceCollection.AddRpcClient(configuration);
    var serviceProvider = serviceCollection.BuildServiceProvider();
    var client = serviceProvider.GetService<RpcClient>();
    await client.StartAsync(); var userService = client.CreateProxy<IUserService>();
    for (int i = 0; i < 100; i++)
    {
    var result = userService.GetUserNameById(new TestParam { Id = 1.ToString() });
    }

代码地址

git

netcore 基于 DispatchProxy 实现一个简单Rpc远程调用的更多相关文章

  1. 利用java实现一个简单的远程监控程序

    一般的远程监控软件都是用c或者c++等语言开发的,而使用java如何来实现相同的功能呢. 首先我们先介绍一下一个简单的远程监控程序的实现原理. 功能一,远程屏幕监视 (1) 必须要有监控端与被监控端, ...

  2. 基于PHP实现一个简单的在线聊天功能(轮询ajax )

    基于PHP实现一个简单的在线聊天功能(轮询ajax ) 一.总结 1.用的轮询ajax 二.基于PHP实现一个简单的在线聊天功能 一直很想试着做一做这个有意思的功能,感觉复杂的不是数据交互和表结构,麻 ...

  3. 基于 Roslyn 实现一个简单的条件解析引擎

    基于 Roslyn 实现一个简单的条件解析引擎 Intro 最近在做一个勋章的服务,我们想定义一些勋章的获取条件,满足条件之后就给用户颁发一个勋章,定义条件的时候会定义需要哪些参数,参数的类型,获取勋 ...

  4. 使用CEF(二)— 基于VS2019编写一个简单CEF样例

    使用CEF(二)- 基于VS2019编写一个简单CEF样例 在这一节中,本人将会在Windows下使用VS2019创建一个空白的C++Windows Desktop Application项目,逐步进 ...

  5. 从0到1:全面理解RPC远程调用

    上一篇关于 WSGI 的硬核长文,不知道有多少同学,能够从头看到尾的,不管你们有没有看得很过瘾,反正我是写得很爽,总有一种将一样知识吃透了的错觉. 今天我又给自己挖坑了,打算将 rpc 远程调用的知识 ...

  6. [转载] 基于Dubbo的Hessian协议实现远程调用

    转载自http://shiyanjun.cn/archives/349.html Dubbo基于Hessian实现了自己Hessian协议,可以直接通过配置的Dubbo内置的其他协议,在服务消费方进行 ...

  7. 基于Dubbo的Hessian协议实现远程调用

    Dubbo基于Hessian实现了自己Hessian协议,可以直接通过配置的Dubbo内置的其他协议,在服务消费方进行远程调用,也就是说,服务调用方需要使用Java语言来基于Dubbo调用提供方服务, ...

  8. 使用Socket&反射&Java流操作进行方法的远程调用(模拟RPC远程调用)

    写在前面 阅读本文首先得具备基本的Socket.反射.Java流操作的基本API使用知识:否则本文你可能看不懂... 服务端的端口监听 进行远程调用,那就必须得有客户端和服务端.服务端负责提供服务,客 ...

  9. Openstack Nova 源码分析 — RPC 远程调用过程

    目录 目录 Nova Project Services Project 的程序入口 setuppy Nova中RPC远程过程调用 nova-compute RPC API的实现 novacompute ...

随机推荐

  1. Mac OS 上的一些骚操作

    本帖记录个人在使用 Mac 操作系统上的一些骚操作,不断更新,以飨读者. 快速移动网页到顶部或底部 用双指上下划触摸板吗?NO,我们有更骚的操作: command + ↑ 回到顶部 command + ...

  2. Redis——基础使用

    Redis总体介绍: Redis特性 Redis(REmote DIctionary Server),是一个开源的内存数据库 持久化:RDB.AOF 主备复制 丰富的数据结构 Lua脚本.事务 Red ...

  3. java 线程池newFixedThreadPool

    工作中遇到一个这样的情况,List中的元素要每个遍历出来,然后作为参数传给后面通过spark做数据处理,元素太多,一个一个的遍历速度太慢,于是考虑使用多线程,代码如下:(已删除部分代码) 想了解更多线 ...

  4. 常用高效 Java 工具类总结

    一.前言 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码 ...

  5. pycharm使用教程

    https://www.cnblogs.com/tsingke/p/7392800.html

  6. C#代码实现IoC(控制反转)设计,以及我对IoC的理解

    一. 什么是IoC 当在A类中要使用B类的时候,我们一般都是采用new的方式来实例化B类,这样一来这两个类就有很强的依赖关系,不符合低耦合的设计思想.这时候我们可以通过一个中间容器来实例化对象,需要的 ...

  7. Go语言学习——如何实现一个过滤器

    1.过滤器使用场景 做业务的时候我们经常要使用过滤器或者拦截器(听这口音就是从Java过来的).常见的场景如一个HTTP请求,需要经过鉴权过滤器.白名单校验过滤.参数验证过滤器等重重关卡最终拿到数据. ...

  8. 手写迷你SpringMVC框架

    前言 学习如何使用Spring,SpringMVC是很快的,但是在往后使用的过程中难免会想探究一下框架背后的原理是什么,本文将通过讲解如何手写一个简单版的springMVC框架,直接从代码上看框架中请 ...

  9. 2013-2014 ACM-ICPC Pacific Northwest Regional Contest D.Delta Quadrant

    题意略. 思路: 由于这是一颗无根树,我们可以贪心地来删去边. 详见代码: #include<bits/stdc++.h> using namespace std; typedef lon ...

  10. Java基础之访问权限控制

    Java基础之访问权限控制 四种访问权限 Java中类与成员的访问权限共有四种,其中三种有访问权限修饰词:public,protected,private. Public:权限最大,允许所有类访问,但 ...