文档章节

c#网络传输

o
 osc_fmg49rzg
发布于 2019/03/19 02:39
字数 1994
阅读 14
收藏 0

接着前面简单讲的,给大家聊聊服务开发。

网络传输

先说网络传输开发,总体来说,可以看成4中模型

我们把传输过程看做网线,那么在通过传输的过程中。2边就涉及池化问题,也就是我们常见的异步传输。

在业务端,有N个线程将数据放到池中(矩形),然后“网线”处有M个线程将数据丢到网络上。对于2边都是。

对于最上面的那种模型,M=0,也就是我们常见的一端直接发送,一端接收。也就是一对一的同步应用,直到演化成最后一种。

最后一种,在实现上,大概就是2类,一类是事件回调通知,一类是池中数据控制量,来传递数据。

传输组件dotnetty

不想多说,网上都有,只简单提下。以TCP为例,它在干什么。N个线程负责接收连接(简单理解成收取连接的socket),M个线程来处理这些Socket,检查是否有数据,当按照注册的解析Hander,接收完成一包数据,则通过PIP传递处理。这样就简化了数据接收的过程,可以控制线程。

   我们自己一般写一对一同步处理时,就是必须线程接收连接,连接以后收取数据(很多时候我们是同步收取,这样有多少连接就占用多少线程)。dotnetty这样做就能控制好线程使用情况。但是数据收取会相对于同步延迟一点点。另外就是这样实现其实就是异步事件了,好,到此打住,具体使用和遇到问题解决方法,网上有,java的netty不仅仅是个传输组件,还养活了很多书籍呢(哈哈哈哈)。有问题就去搜搜,按照java的处理方式都可以的,比较是照搬实现过程的。

    最后说说使用,网上全部是给的官网例子,我就不多说了。我想说的是,作为传输,我们使用时肯定会去封装的,那么如何去使用就需要根据业务了,但是无法是2分小类,一个小类是在业务Hander里面就直接调用我们的业务处理类,另外就是在业务Hander里面通过事件回调的方式,把数据传出来,而整个业务hander仅仅是传输层的一部分。而我喜欢把传输完全隔离处理,业务hander里面通过事件回调。

  当然,整个dotnetty就是上面模型中的“网线”。至于网线内部又是怎么实现,又是另外的一个说法了。

同步构造实现

   既然上面的全部是异步的,有还有业务层的交互,所以在业务层上又有很多不同。以我前写的数据库查询服务化为例。

  我把上面的“网线”转成了dotnetty,那要实现很好的RPC模式怎么弄?先看下图:

逐步说明下。

1.业务层将数据丢下来,也就是我们调函数,返回需要函数返回,这时中间有一个类,来构造一个请求结构,其实简单理解成保持参数,然后使用AutoResetEvent阻塞起来。这个类暂时叫Adapter。它负责产生一个ID,等待数据返回后匹配AutoResetEvent。

2.Adapter将需要传递的数据传递给客户端管理类。客户端管理类工作有好几个,第一个就是临时存储数据,也就是池数据。

管理类要找到合适的客户端,为什么说合适?这里考虑了负载均衡和多个连接。

 对于服务,可以有多个部署,这里加入有N个地址,每一个服务还可以有多个连接啊,假设每个服务有M个连接,这样客户端管理类就需要从这N*M个连接中找到比较合适的一个传递数据。后面我再说我是如何处理的。

管理类还有一个工作就是验证客户端连接情况,为什么,我是假动态实现的。当我需要传递数据时,会首先初始化一个连接,当这个连接提交的数据量很大时,就开启新的一个。当所有客户端都停下来没有数据提交,则就浪费网络资源了,所以还得关闭。这里我是按照5分钟没有数据提交就关闭了连接。

  另外一个问题是网络异常,dotnetty是异步回调,加上前面的功能,是没法很快知道网络是异常的,客户端不能提交还是客户端自己在关闭,所以需要客户端管理区验证网络异常,不能连接。

  根据前面的内容,客户端管理类主要体现了四个功能:数据缓存,客户端选择,网络异常检查,客户端实时关闭。

   接着前面,假设服务有N个,M个连接,那么就按照客户端空闲和数据提交频率来选择,首先选择空闲的,然后选择客户端提交频率最小的。

  当然我实现的更加复杂,还有数据处理,从池中取数据,比如池中数据每超过1000个,就多开启一个线程去重池中抽取数据网客户端丢。还有网络异常时存储文件等功能就是有这个管理类来操作的。另外这个是单例,我们的功能可能不只一个,比如一个功能是传文件,一个是发数据消息,其实就是2类服务,所以管理类中还要分门别类往服务端提交。

3.同样在服务端也就差不多的对等功能。

不知道大家明白没有,其实上面那幅图是在流程上的,代码上的实现关系应该是下面这样的:

 

这就是异步传输组件要构造RPC模型的效果和过程。

例子数据库查询服务

我以前写了一个查询数据库服务化,现在重新按照上面的逻辑更新了。可以调试。

当然这里面有业务逻辑。整个服务传输加密了。简单说下,前面的博文已经介绍了。

服务端产生RSA秘钥。

 客户端首先需要登录验证,一个字符串的MD5。从服务端获取RSA的公钥,同时服务端为客户端分配一个sessionid.

客户端自己参数AES加密的秘钥。用AES把传输的  byte[]加密,然后用RSA的公钥对自己的AES秘钥加密,然后构造一个协议传输,协议中还必须有前面的sessionid。服务端接到数据请求,先检查sessionid还有没有效,如果没有则返回错误信息要求从新登录一次,再次获取RSA公钥。如果有效 则服务端按照协议解析AES秘钥,然后再用秘钥解析传输的数据部分。

服务端每天清理一次sessionid,所以客户端每天都必须登录一次。

客户端每一个小时更新一次AES秘钥。

大概这个查询服务就是这样的了。

整个就给大家演示了异步编程开发,数据提交处理,异步构造RPC模式的过程,数据加密传输的过程,包括一些资源调度和处理,网络上的负载均衡(不是我们一般说的数据负载均衡,或者说这里是资源动态调优吧)。

其中NettyTransmission项目就是dotnetty的使用和封装处理。

代码在git上,再重复说下地址:

https://github.com/jinyuttt/DBAcessSrv.git

 

 

 

 

 

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

pycurl libcurl link-time ssl backend (nss)

pip uninstall pycurlecho 'pycurl==7.19.5.1 --global-option="--with-nss"' > requires.pypip install -r requires.py...

小红手
36分钟前
17
0
计算机网络性能衡量

1、速率 单位时间(s)内传输信息(bit)量 单位:KB/s, MB/s, Gb/s K = 10^3 ,M = 10^6, G=10^9 一般表示的是理想的传输速率 2、带宽 计算机网络中的带宽和通信等领域的带宽概念不一样,计算机网...

osc_np3y0rbq
36分钟前
3
0
互联网掀起农家乐,巨头上演AI掘金战

配图来自Canva **前有网易、阿里AI养猪,后有腾讯AI养鹅,互联网大佬们纷纷玩起了“农家乐”,互联网的生意在尖端技术的引领之下频频跨界,巨头之间的较量也从线上延伸至线下。**自古“民以食...

osc_5cok9i01
38分钟前
9
0
原来!我在4年前就开始体验雾游戏了!

前有云游戏后有雾游戏,游戏的方式看来起来越来越多种多样。那么“震撼业界”的雾游戏到底是什么来头?它依靠什么改变游戏界?它的原理又是什么? 本月月初,著名的日本游戏杂志《Fami通》表...

osc_j34n26zn
39分钟前
11
0
活动预告|田溯宁与你相约GSMA Thrive·万物生晖,分享5G风口下的创新与投资洞察

在万物互联的时代背景下,5G+AI+IoT的技术变革与融合,正在引发一场深刻的全产业创新与变革。5G技术创新、行业应用及投资机遇已成为科技行业所瞩目的焦点。 6月30日,宽带资本董事长田溯宁将...

osc_0qnrwmy3
40分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部