C++编编写写高高性性能能服服务务器器实实例例教教程程
我将展示如何使用现代C++编写一个Echo服务器,相当于分布式 统开发中的“Hello World”。这个服务器会将接收的消息直接
返回。我们同时需要一个可以向我们的服务器发动消息的客户端,在这里可以发现客户端的源码。
Wangle是一个用来搭建事件驱动的现代异步C++服务的C/S应用框架。Wangle最基本的抽象概念就是Pipeline(管线)。能够理解
这种抽象,将会很容易写出各种复杂的现代C++服务,另一个重要的概念是Service(服务),其可以看作一种更高级的Pipeline,
不过超出了本文我们关注的范畴。
PipeLine
pipeline 是 Wangle 中最重要也是最强大的抽象,可以让用户在定制 request 和 response 的实现时拥有很大的自由。一个pipelin
e就是一 列request/response控制程序的嵌套。我试图寻找一个真实世界中pipeline的类比,唯一我能想到的就是现实世界工厂
中的生产线。一条生产线工作在一种顺序模式下,所有的工人取得一个物体,并且只添加一种修改,再将其发送给上游的工人直
到整个产品制造完成。这可能不是一个特别好的比喻,因为流水线上产品的流动是单向的,而一个pipeline能控制反方向的数据流
动--就好像将成品分解成原材料。
一个Wangle handler可以同时掌控上游和下游的两个方向的数据流动。当你把所有的handler连接在一起,就可以用一种灵活的
方式将原始数据组装为想要的数据类型或者将已有的数据拆分。
在我们的服务器的pipeline中大致将会有下面几种handler
1.Handler 1 (下下文文的的上上游游下下游游是是指指对对一一同同个个handler而而言言,,根根据据其其在在pipeline 中中的的位位置置不不同同,,输输入入输输出出相相反反) 上上游游::将将从从
socket 中中接接收收的的二二进进制制数数据据流流写写入入一一个个零零拷拷贝贝(zero-copy,指指省省略略了了A pplicaion context和和Kernel context之之间间的的上上下下文文
切切换换,,避避免免了了CP 对对Buffer的的冗冗余余拷拷贝贝,,直直接接在在Kernel级级别别进进行行数数据据传传输输的的技技术术,,详详情情请请参参阅阅维维基基百百科科)的的字字节节缓缓存存中中,,
发发送送给给handler2
下下游游::接接收收一一个个零零拷拷贝贝的的字字节节缓缓存存,,将将其其内内容容写写入入socket 中中
2.Handler2 上上游游::接接收收handler1的的缓缓存存对对象象,,解解码码为为一一个个string对对象象传传递递给给handler3 下下游游::接接收收handler3的的string对对
象象,,将将其其转转码码为为一一个个零零拷拷贝贝的的字字节节缓缓存存,,发发送送给给handler1
3.Handler3 上上游游::接接收收handler2中中的的string对对象象,,再再向向下下发发送送至至pipeline等等待待写写回回客客户户端端。。string会会发发回回handler2 下下游游
::接接收收上上游游的的string对对象象,,传传递递给给handler2
需需要要注注意意的的一一点点是是,,每每一一个个handler应应当当只只做做一一件件事事并并且且只只有有一一件件,,如如果果你你有有一一个个handler里里做做了了多多项项任任务务, 比比如如从从二二进进制制
流流离离直直接接解解码码出出string,,那那么么你你需需要要学学会会将将它它拆拆分分。。这这对对提提升升代代码码的的可可维维护护性性和和扩扩展展性性非非常常重重要要。。
另外,没错,handler不是线程安全的,所以不要轻易的在其中使用任何没有经过mutex ,atomic lock保护的数据,如果你确实需
要一个线程安全的环境,Folly提供了一种免于加锁的数据结构, Folly依赖于Wangle,你可以很容易的在项目中引入并使用它。
如果你还不是很明白所有的步骤,不用着急,在看到下面的具体实现时你会更加清楚。
Echo Server
下面我会展示服务器的具体实现。我假定您已经安装好Wangle。需要注意的是截至目前Wangle还不能在Mac OS上安装,我建议
您可以安装虚拟机,使用Ubuntu来安装Wangle。
这就是echo handler:接收一个string ,打印到stdout 中,再发送回pipeline。要注意write语句中的定界符不可以省略,因为pipel