.NET Core微服务之路:利用DotNetty实现一个简单的通信过程

时间:2023-12-26 11:23:25
  上一篇我们已经全面的介绍过《基于gRPC服务发现与服务治理的方案》,我们先复习一下RPC的调用过程(笔者会在这一节的几篇文章中反复的强调这个过程调用方案),看下图
aaarticlea/png;base64,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*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" alt="" />
根据上面图,服务化原理可以分为3步:
  1. 服务端启动并且向注册中心发送服务信息,注册中心收到后会定时监控服务状态(常见心跳检测);
  2. 客户端需要开始调用服务的时候,首先去注册中心获取服务信息;
  3. 客户端创建远程调用连接,连接后服务端返回处理信息;
第3步又可以细分,下面说说远程过程调用的原理:
目标:客户端怎么调用远程机器上的公开方法
  1. 服务发现,向注册中心获取服务(这里需要做的有很多:拿到多个服务时需要做负载均衡,同机房过滤、版本过滤、服务路由过滤、统一网关等);
  2. 客户端发起调用,将需要调用的服务、方法、参数进行组装;
  3. 序列化编码组装的消息,这里可以使用json,也可以使用xml,也可以使用protobuf,也可以使用hessian,几种方案的序列化速度还有序列化后占用字节大小都是选择的重要指标,对内笔者建议使用高效的protobuf,它基于TCP/IP二进制进行序列化,体积小,速度快。
  4. 传输协议,可以使用传统的io阻塞传输,也可以使用高效的nio传输(Netty);
  5. 服务端收到后进行反序列化,然后进行相应的处理;
  6. 服务端序列化response信息并且返回;
  7. 客户端收到response信息并且反序列化;
  正如上面第三步的第4条所提到,C类向S类调用时,可以选择RPC或者RESTful,而作为内部通讯,笔者强烈建议使用RPC的方式去调用S类上的所有服务,RPC对比RESTful如下:
优点:
  1. 序列化采用二进制消息,性能好/效率高(空间和时间效率都很不错);
  2. 序列化反序列化直接对应程序中的数据类,不需要解析后在进行映射(XML,JSON都是这种方式);
  3. 相比http协议,没有无用的header,简化传输数据的大小,且基于TCP层传输,速度更快,容量更小;
  4. Netty等一些框架集成(重点,也是本篇介绍的主要框架);
缺点:
  1. 使用复杂,维护成本和学习成本较高,调试困难;
  2. 因为基于HTTP2,绝大部多数HTTP Server、Nginx都尚不支持,即Nginx不能将GRPC请求作为HTTP请求来负载均衡,而是作为普通的TCP请求。(nginx1.9版本已支持);
  3. 二进制可读性差,或者几乎没有任何直接可读性,需要专门的工具进行反序列化;
  4. 默认不具备动态特性(可以通过动态定义生成消息类型或者动态编译支持,后续会介绍利用Rosyln进行动态编译的特性);

通信传输利器Netty(Net is DotNetty)介绍

  (先埋怨一下微软大大)我们做NET开发,十分羡慕JAVA上能有NETTY, SPRING, STRUTS, DUBBO等等优秀框架,而我们NET就只有干瞪眼,哎,无赖之前生态圈没做好,恨铁不成钢啊。不过由于近来Net Core的发布,慢慢也拉回了一小部分属于微软的天下,打住,闲话扯到这儿。
  DotNetty是Azure团队仿照(几乎可以这么说)JAVA的Netty而出来的(目前已实现Netty的一部分),目前在Github上的Star有1.8K+,地址:https://github.com/Azure/DotNetty,没有任何文档,和代码中少量的注释。虽然比Netty出来晚了很多年,不过我们NET程序员们也该庆幸了,在自己的平台上终于能用上类似Netty这样强大的通信框架了。

传统通讯的问题:

  我们使用通用的应用程序或者类库来实现互相通讯,比如,我们经常使用一个 HTTP 客户端库来从 web 服务器上获取信息,或者通过 web 服务来执行一个远程的调用。
  然而,有时候一个通用的协议或他的实现并没有很好的满足需求。比如我们无法使用一个通用的 HTTP 服务器来处理大文件、电子邮件以及近实时消息,比如金融信息和多人游戏数据。我们需要一个高度优化的协议来处理一些特殊的场景。例如你可能想实现一个优化了的 Ajax 的聊天应用、媒体流传输或者是大文件传输器,你甚至可以自己设计和实现一个全新的协议来准确地实现你的需求。
  另一个不可避免的情况是当你不得不处理遗留的专有协议来确保与旧系统的互操作性。在这种情况下,重要的是我们如何才能快速实现协议而不牺牲应用的稳定性和性能。

解决:

  Netty 是一个提供 asynchronous event-driven (异步事件驱动)的网络应用框架,是一个用以快速开发高性能、可扩展协议的服务器和客户端。
  换句话说,Netty 是一个 NIO 客户端服务器框架,使用它可以快速简单地开发网络应用程序,比如服务器和客户端的协议。Netty 大大简化了网络程序的开发过程比如 TCP 和 UDP 的 socket 服务的开发。
“快速和简单”并不意味着应用程序会有难维护和性能低的问题,Netty 是一个精心设计的框架,它从许多协议的实现中吸收了很多的经验比如 FTP、SMTP、HTTP、许多二进制和基于文本的传统协议.因此,Netty 已经成功地找到一个方式,在不失灵活性的前提下来实现开发的简易性,高性能,稳定性。
  有一些用户可能已经发现其他的一些网络框架也声称自己有同样的优势,所以你可能会问是 Netty 和它们的不同之处。答案就是 Netty 的哲学设计理念。Netty 从开始就为用户提供了用户体验最好的 API 以及实现设计。正是因为 Netty 的哲学设计理念,才让您得以轻松地阅读本指南并使用 Netty。
.NET Core微服务之路:利用DotNetty实现一个简单的通信过程

(DotNetty的框架和实现是怎么回事,笔者不太清楚,但完全可参考Netty官方的文档来学习和使用DotNetty相关的API接口)

DotNetty中几个重要的库(程序集):

DotNetty.Buffers: 对内存缓冲区管理的封装。
DotNetty.Codecs: 对编解码是封装,包括一些基础基类的实现,我们在项目中自定义的协议,都要继承该项目的特定基类和实现。
DotNetty.Codecs.Mqtt: MQTT(消息队列遥测传输)编解码是封装,包括一些基础基类的实现。
DotNetty.Codecs.Protobuf: Protobuf 编解码是封装,包括一些基础基类的实现。
DotNetty.Codecs.ProtocolBuffers: ProtocolBuffers编解码是封装,包括一些基础基类的实现。
DotNetty.Codecs.Redis: Redis 协议编解码是封装,包括一些基础基类的实现。
DotNetty.Common: 公共的类库项目,包装线程池,并行任务和常用帮助类的封装。
DotNetty.Handlers: 封装了常用的管道处理器,比如Tls编解码,超时机制,心跳检查,日志等。
DotNetty.Transport: DotNetty核心的实现,Socket基础框架,通信模式:异步非阻塞。
DotNetty.Transport.Libuv: DotNetty自己实现基于Libuv (高性能的,事件驱动的I/O库) 核心的实现。
常用的库有Codecs, Common, Handlers, Buffers, Transport,目前Azure团队正在实现其他Netty中的API(包括非公共Netty的API),让我们拭目以待吧。

直接上点对点之间通讯的栗子

  DotNetty的Example文件夹下有许多官方提供的实例,有抛弃服务实例(Discard),有应答服务实例(echo),有Telnet服务实例等等,为了实现直接点对点通讯,笔者采用了Echo的demo,此后的RPC调用也会基于Echo而实现,注释详细,直接上接收端(Server)的代码:
 /*
* Netty 是一个半成品,作用是在需要基于自定义协议的基础上完成自己的通信封装
* Netty 大大简化了网络程序的开发过程比如 TCP 和 UDP 的 socket 服务的开发。
* “快速和简单”并不意味着应用程序会有难维护和性能低的问题,
* Netty 是一个精心设计的框架,它从许多协议的实现中吸收了很多的经验比如 FTP、SMTP、HTTP、许多二进制和基于文本的传统协议。
* 因此,Netty 已经成功地找到一个方式,在不失灵活性的前提下来实现开发的简易性,高性能,稳定性。
*/ namespace Echo.Server
{
using System;
using System.Threading.Tasks;
using DotNetty.Codecs;
using DotNetty.Handlers.Logging;
using DotNetty.Transport.Bootstrapping;
using DotNetty.Transport.Channels;
using DotNetty.Transport.Libuv;
using Examples.Common; static class Program
{
static async Task RunServerAsync()
{
ExampleHelper.SetConsoleLogger(); // 申明一个主回路调度组
var dispatcher = new DispatcherEventLoopGroup(); /*
Netty 提供了许多不同的 EventLoopGroup 的实现用来处理不同的传输。
在这个例子中我们实现了一个服务端的应用,因此会有2个 NioEventLoopGroup 会被使用。
第一个经常被叫做‘boss’,用来接收进来的连接。第二个经常被叫做‘worker’,用来处理已经被接收的连接,一旦‘boss’接收到连接,就会把连接信息注册到‘worker’上。
如何知道多少个线程已经被使用,如何映射到已经创建的 Channel上都需要依赖于 IEventLoopGroup 的实现,并且可以通过构造函数来配置他们的关系。
*/ // 主工作线程组,设置为1个线程
IEventLoopGroup bossGroup = dispatcher; // (1)
// 子工作线程组,设置为1个线程
IEventLoopGroup workerGroup = new WorkerEventLoopGroup(dispatcher); try
{
// 声明一个服务端Bootstrap,每个Netty服务端程序,都由ServerBootstrap控制,通过链式的方式组装需要的参数
var serverBootstrap = new ServerBootstrap(); // (2)
// 设置主和工作线程组
serverBootstrap.Group(bossGroup, workerGroup); // 申明服务端通信通道为TcpServerChannel
serverBootstrap.Channel<TcpServerChannel>(); // (3) serverBootstrap
// 设置网络IO参数等
.Option(ChannelOption.SoBacklog, ) // (5) // 在主线程组上设置一个打印日志的处理器
.Handler(new LoggingHandler("SRV-LSTN")) // 设置工作线程参数
.ChildHandler(
/*
* ChannelInitializer 是一个特殊的处理类,他的目的是帮助使用者配置一个新的 Channel。
* 也许你想通过增加一些处理类比如DiscardServerHandler 来配置一个新的 Channel 或者其对应的ChannelPipeline 来实现你的网络程序。
* 当你的程序变的复杂时,可能你会增加更多的处理类到 pipline 上,然后提取这些匿名类到最顶层的类上。
*/
new ActionChannelInitializer<IChannel>( // (4)
channel =>
{
/*
* 工作线程连接器是设置了一个管道,服务端主线程所有接收到的信息都会通过这个管道一层层往下传输,
* 同时所有出栈的消息 也要这个管道的所有处理器进行一步步处理。
*/
IChannelPipeline pipeline = channel.Pipeline; // 添加日志拦截器
pipeline.AddLast(new LoggingHandler("SRV-CONN")); // 添加出栈消息,通过这个handler在消息顶部加上消息的长度。
// LengthFieldPrepender(2):使用2个字节来存储数据的长度。
pipeline.AddLast("framing-enc", new LengthFieldPrepender()); /*
入栈消息通过该Handler,解析消息的包长信息,并将正确的消息体发送给下一个处理Handler
1,InitialBytesToStrip = 0, //读取时需要跳过的字节数
2,LengthAdjustment = -5, //包实际长度的纠正,如果包长包括包头和包体,则要减去Length之前的部分
3,LengthFieldLength = 4, //长度字段的字节数 整型为4个字节
4,LengthFieldOffset = 1, //长度属性的起始(偏移)位
5,MaxFrameLength = int.MaxValue, //最大包长
*/
pipeline.AddLast("framing-dec", new LengthFieldBasedFrameDecoder(ushort.MaxValue, , , , )); // 业务handler
pipeline.AddLast("echo", new EchoServerHandler());
})); // bootstrap绑定到指定端口的行为就是服务端启动服务,同样的Serverbootstrap可以bind到多个端口
IChannel boundChannel = await serverBootstrap.BindAsync(ServerSettings.Port); // (6) Console.WriteLine("wait the client input");
Console.ReadLine(); // 关闭服务
await boundChannel.CloseAsync();
}
finally
{
// 释放指定工作组线程
await Task.WhenAll( // (7)
bossGroup.ShutdownGracefullyAsync(TimeSpan.FromMilliseconds(), TimeSpan.FromSeconds()),
workerGroup.ShutdownGracefullyAsync(TimeSpan.FromMilliseconds(), TimeSpan.FromSeconds())
);
}
} static void Main() => RunServerAsync().Wait();
}
}
  1. IEventLoopGroup 是用来处理I/O操作的多线程事件循环器,DotNetty 提供了许多不同的 EventLoopGroup 的实现用来处理不同的传输。在这个例子中我们实现了一个服务端的应用,因此会有2个 IEventLoopGroup 会被使用。第一个经常被叫做‘boss’,用来接收进来的连接。第二个经常被叫做‘worker’,用来处理已经被接收的连接,一旦‘boss’接收到连接,就会把连接信息注册到‘worker’上。
  2. ServerBootstrap 是一个启动 Transport 服务的辅助启动类。你可以在这个服务中直接使用 Channel,但是这会是一个复杂的处理过程,在很多情况下你并不需要这样做。
  3. 这里我们指定使用 TcpServerChannel类来举例说明一个新的 Channel 如何接收进来的连接。
  4. ChannelInitializer 是一个特殊的处理类,他的目的是帮助使用者配置一个新的 Channel,当你的程序变的复杂时,可能你会增加更多的处理类到 pipline 上,然后提取这些匿名类到最顶层的类上。
  5. 你可以设置这里指定的 Channel 实现的配置参数。我们正在写一个TCP/IP 的服务端,因此我们被允许设置 socket 的参数选项比如tcpNoDelay 和 keepAlive。
  6. 绑定端口然后启动服务,这里我们在机器上绑定了机器网卡上的设置端口,当然现在你可以多次调用 bind() 方法(基于不同绑定地址)。
  7. 使用完成后,优雅的释放掉指定的工作组线程,当然,你可以选择关闭程序,但这并不推荐。

Server端的事件处理代码:

上一部分代码中加粗地方的实现

 namespace Echo.Server
{
using System;
using System.Text;
using DotNetty.Buffers;
using DotNetty.Transport.Channels; /// <summary>
/// 服务端处理事件函数
/// </summary>
public class EchoServerHandler : ChannelHandlerAdapter // ChannelHandlerAdapter 业务继承基类适配器 // (1)
{
/// <summary>
/// 管道开始读
/// </summary>
/// <param name="context"></param>
/// <param name="message"></param>
public override void ChannelRead(IChannelHandlerContext context, object message) // (2)
{
if (message is IByteBuffer buffer) // (3)
{
Console.WriteLine("Received from client: " + buffer.ToString(Encoding.UTF8));
} context.WriteAsync(message); // (4)
} /// <summary>
/// 管道读取完成
/// </summary>
/// <param name="context"></param>
public override void ChannelReadComplete(IChannelHandlerContext context) => context.Flush(); // (5) /// <summary>
/// 出现异常
/// </summary>
/// <param name="context"></param>
/// <param name="exception"></param>
public override void ExceptionCaught(IChannelHandlerContext context, Exception exception)
{
Console.WriteLine("Exception: " + exception);
context.CloseAsync();
}
}
}
  1. DiscardServerHandler 继承自 ChannelInboundHandlerAdapter,这个类实现了IChannelHandler接口,IChannelHandler提供了许多事件处理的接口方法,然后你可以覆盖这些方法。现在仅仅只需要继承 ChannelInboundHandlerAdapter 类而不是你自己去实现接口方法。
  2. 这里我们覆盖了 chanelRead() 事件处理方法。每当从客户端收到新的数据时,这个方法会在收到消息时被调用,这个例子中,收到的消息的类型是 ByteBuf。
  3. 为了响应或显示客户端发来的信息,为此,我们将在控制台中打印出客户端传来的数据。
  4. 然后,我们将客户端传来的消息通过context.WriteAsync写回到客户端。
  5. 当然,步骤4只是将流缓存到上下文中,并没执行真正的写入操作,通过执行Flush将流数据写入管道,并通过context传回给传来的客户端。

Client端代码:

重点看注释的地方,其他地方跟Server端没有任何区别

 namespace Echo.Client
{
using System;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using DotNetty.Buffers;
using DotNetty.Codecs;
using DotNetty.Handlers.Logging;
using DotNetty.Transport.Bootstrapping;
using DotNetty.Transport.Channels;
using DotNetty.Transport.Channels.Sockets;
using Examples.Common; static class Program
{
static async Task RunClientAsync()
{
ExampleHelper.SetConsoleLogger(); var group = new MultithreadEventLoopGroup(); try
{
var bootstrap = new Bootstrap();
bootstrap
.Group(group)
.Channel<TcpSocketChannel>()
.Option(ChannelOption.TcpNodelay, true)
.Handler(
new ActionChannelInitializer<ISocketChannel>(
channel =>
{
IChannelPipeline pipeline = channel.Pipeline;
pipeline.AddLast(new LoggingHandler());
pipeline.AddLast("framing-enc", new LengthFieldPrepender());
pipeline.AddLast("framing-dec", new LengthFieldBasedFrameDecoder(ushort.MaxValue, , , , )); pipeline.AddLast("echo", new EchoClientHandler());
})); IChannel clientChannel = await bootstrap.ConnectAsync(new IPEndPoint(ClientSettings.Host, ClientSettings.Port)); // 建立死循环,类同于While(true)
for (;;) // (4)
{
Console.WriteLine("input you data:");
// 根据设置建立缓存区大小
IByteBuffer initialMessage = Unpooled.Buffer(ClientSettings.Size); // (1)
string r = Console.ReadLine();
// 将数据流写入缓冲区
initialMessage.WriteBytes(Encoding.UTF8.GetBytes(r ?? throw new InvalidOperationException())); // (2)
// 将缓冲区数据流写入到管道中
await clientChannel.WriteAndFlushAsync(initialMessage); // (3)
if(r.Contains("bye"))
break;
} Console.WriteLine("byebye"); await clientChannel.CloseAsync();
}
finally
{
await group.ShutdownGracefullyAsync(TimeSpan.FromMilliseconds(), TimeSpan.FromSeconds());
}
} static void Main() => RunClientAsync().Wait();
}
}
  1. 初始化一个缓冲区的大小。
  2. 默认缓冲区接受的数据类型为bytes[],当然这样也更加便于序列化成流。
  3. 将缓冲区的流直接数据写入到Channel管道中。该管道一般为链接通讯的另一端(C端)。
  4. 建立死循环,这样做的目的是为了测试每次都必须从客户端输入的数据,通过服务端回路一次后,再进行下一次的输入操作。

Client端的事件处理代码:

 namespace Echo.Client
{
using System;
using System.Text;
using DotNetty.Buffers;
using DotNetty.Transport.Channels; public class EchoClientHandler : ChannelHandlerAdapter
{
readonly IByteBuffer initialMessage; public override void ChannelActive(IChannelHandlerContext context) => context.WriteAndFlushAsync(this.initialMessage); public override void ChannelRead(IChannelHandlerContext context, object message)
{
if (message is IByteBuffer byteBuffer)
{
Console.WriteLine("Received from server: " + byteBuffer.ToString(Encoding.UTF8));
}
} public override void ChannelReadComplete(IChannelHandlerContext context) => context.Flush(); public override void ExceptionCaught(IChannelHandlerContext context, Exception exception)
{
Console.WriteLine("Exception: " + exception);
context.CloseAsync();
}
}
}
非常简单,将数据流显示到控制台。

实现结果

  至此,我们使用DotNetty框架搭建简单的应答服务器就这样做好了,很简单,实现效果如下:
  C端主动向S端主动发送数据后,S端收到数据,在控制台打印出数据,并回传给C端,当然,S端还可以做很多很多的事情。

.NET Core微服务之路:利用DotNetty实现一个简单的通信过程

DotNetty内部调试记录分析

  虽然DotNetty官方没有提供任何技术文档,但官方却提供了详细的调试记录,很多时候,我们学习者其实也可以通过调试记录来分析某一个功能的实现流程。我们可以通过将DotNetty的内部输入输出记录打印到控制台上。

InternalLoggerFactory.DefaultFactory.AddProvider(new ConsoleLoggerProvider((s, level) => true, false));

  可以看到服务端的打印记录一下多出来了许多许多,有大部分是属于DotNetty内部调试时的打印记录,我们只着重看如下的部分。

dbug: SRV-LSTN[]
[id: 0x3e8afca1] HANDLER_ADDED
dbug: SRV-LSTN[]
[id: 0x3e8afca1] REGISTERED ()
dbug: SRV-LSTN[]
[id: 0x3e8afca1] BIND: 0.0.0.0: ()
wait the client input
dbug: SRV-LSTN[]
[id: 0x3e8afca1, 0.0.0.0:] ACTIVE ()
dbug: SRV-LSTN[]
[id: 0x3e8afca1, 0.0.0.0:] READ ()
dbug: SRV-LSTN[]
[id: 0x3e8afca1, 0.0.0.0:] RECEIVED: [id: 0x7bac2775, 127.0.0.1: :> 127.0.0.1:] ()
dbug: SRV-LSTN[]
[id: 0x3e8afca1, 0.0.0.0:] RECEIVED_COMPLETE ()
dbug: SRV-LSTN[]
[id: 0x3e8afca1, 0.0.0.0:] READ ()
dbug: SRV-CONN[]
[id: 0x7bac2775, 127.0.0.1: => 127.0.0.1:] HANDLER_ADDED ()
dbug: SRV-CONN[]
[id: 0x7bac2775, 127.0.0.1: => 127.0.0.1:] REGISTERED ()
dbug: SRV-CONN[]
[id: 0x7bac2775, 127.0.0.1: => 127.0.0.1:] ACTIVE ()
dbug: SRV-CONN[]
[id: 0x7bac2775, 127.0.0.1: => 127.0.0.1:] READ ()
dbug: DotNetty.Buffers.AbstractByteBuffer[] ()
-Dio.netty.buffer.bytebuf.checkAccessible: True
dbug: SRV-CONN[]
[id: 0x7bac2775, 127.0.0.1: => 127.0.0.1:] RECEIVED: 14B ()
+-------------------------------------------------+
| a b c d e f |
+--------+-------------------------------------------------+----------------+
|| 0C 6C 6C 6F 6F 6C |..hello world! |
+--------+-------------------------------------------------+----------------+
Received from client: hello world!
dbug: SRV-CONN[] ()
[id: 0x7bac2775, 127.0.0.1: => 127.0.0.1:] WRITE: 2B
+-------------------------------------------------+
| a b c d e f |
+--------+-------------------------------------------------+----------------+
|| 0C |.. |
+--------+-------------------------------------------------+----------------+
dbug: SRV-CONN[] ()
[id: 0x7bac2775, 127.0.0.1: => 127.0.0.1:] WRITE: 12B
+-------------------------------------------------+
| a b c d e f |
+--------+-------------------------------------------------+----------------+
|| 6C 6C 6F 6F 6C |hello world! |
+--------+-------------------------------------------------+----------------+
dbug: SRV-CONN[] ()
[id: 0x7bac2775, 127.0.0.1: => 127.0.0.1:] RECEIVED_COMPLETE
dbug: SRV-CONN[] ()
[id: 0x7bac2775, 127.0.0.1: => 127.0.0.1:] FLUSH
dbug: SRV-CONN[] ()
[id: 0x7bac2775, 127.0.0.1: => 127.0.0.1:] READ

咋一看,有18个操作,好像有点太多了,其实不然,还有很多很多的内部调试细节并没打印到控制台上。

  1. 通过手动建立的工作线程组,并将这组线程注册到管道中,这个管道可以是基于SOCKER,可以基于IChannel(1);
  2. 绑定自定的IP地址和端口号到自定义管道上(2);
  3. 激活自定义管道(3);
  4. 开始读取(其实也是开始监听)(4);
  5. 收到来自id为0x7bac2775的客户端连接请求,建立连接,并继续开始监听(5)(6)(7);
  6. 从第8步开始,日志已经变成id为0x7bac2775的记录了,当然一样包含注册管道,激活管道,开始监听等等与S端一模一样的操作(8)(9)(10)(11)
  7. 当笔者输入一条"hello world!"数据后,DotNetty.Buffers.AbstractByteBuffer会进行数据类型检查,以便确认能将数据放入到管道中。(12)
  8. 将数据发送到S端,数据大小为14B,hello world前有两个点,代表这是数据头,紧接着再发送两个点,但没有任何数据,代表数据已经结束。DotNetty将数据的十六进制存储位用易懂的方式表现了出来,很人性化。(13)(14)
  9. S端收到数据没有任何加工和处理,马上将数据回传到C端。(15)(16)
  10. 最后,当这个过程完成后,需要将缓存区的数据强制写入到管道中,所以会执行一次Flush操作,整个传输完成。接下来,不管是C端还是S端,继续将自己的状态改成READ,用于监听管道中的各种情况,比如连接状态,数据传输等等(17)。

总结

  对于刚开始接触Socket编程的朋友而言,这是个噩梦,因为Socket编程的复杂性不会比多线程容易,甚至会更复杂。协议,压缩,传输,多线程,监听,流控制等等一系列问题摆在面前,因此而诞生了Netty这样优秀的开源框架,但是Netty是个半成品,因为你需要基于他来实现自己想要的协议,传输等等自定义操作,而底层的内容,你完全不用关心。不像某些框架,比如Newtonsoft.Json这样的功能性框架,不用配置,不用自定义,直接拿来用就可以了。
  虽然DotNetty帮我们实现了底层大量的操作,但如果不熟悉或者一点也不懂网络通信,同样对上面的代码是一头雾水,为何?行情需要,我们程序员天天都在赶业务,哪有时间去了解和学习更多的细节...通过将调试记录打印出来,并逐行挨个的对照代码进行分析,就会慢慢开始理解最简单的通信流程了。
  本篇只是实现了基于DotNetty最简单的通讯过程,也只是将数据做了一下回路,并没做到任何与RPC有关的调用,下一篇我们开始讲这个例子深入,介绍基于DotNetty的RPC调用。
码字不易,感谢阅读!

.NET Core微服务之路:利用DotNetty实现一个简单的通信过程