一,Netty是什么

1,Netty是由 JBOSS提供的一个 java开源框架。

2,Netty是JAR包,一般使用ALL-IN-ONE的JAR包就可以开发了。

3,Netty不需要运行在Tomcat这类服务器中,他是单独构建一个服务器。

4,Netty可以构建HTTP服务器,socket服务器,websocket服务器等。

5,Netty其实是对JDK1.4以后提供的NIO的封装,NIO就是new i/o,JDK1.7推出了NIO2。

二,Netty服务架构图

以下官方图展示了Netty基本提供的服务:

主要提供的就是HTTP服务器,socket服务器,websocket服务器。

三,Netty原理架构图

从下面的原创图,可以基本看出Netty构建服务器的原理

1,组件名词解释

(1),Bootstrap / ServerBootstrap(建立连接):

Netty引导组件,简化NIO的开发步骤,是一个Netty程序的开始,作用是配置和串联各个组件。

(2)EventLoopGroup(事件循环组):

是EventLoop组合,可以包含多个EventLoop。创建一个EventLoopGroup的时候,内部包含的方法就会创建一个子对象EventLoop。

(3)EventLoop(事件循环):

循环服务Channel,可以包含多个Channel。

(4)Channel(通道):

代表一个Scoket连接,或者其他IO操作组件。

(5)ChannelInitializer(初始化连接):

主要提供了一个传输通道ChannelPipeline。

(6)ChannelPipeline(传输通道):

主要是管理各种ChannelHandler业务控制器,提供一个链式管理模式。

(7)ChannelHandler(业务控制器):

主要业务写入的地方,由开发人员写入,Netty也提供了很多写好的控制器和适配器,可以直接引用。

(8)ChannelInboundHandler(通道传入控制器):

继承至ChannelHandler,在传输通道中对传入事件进行控制。

(9)ChannelOutboundHandler(通道传出控制器):

继承至ChannelHandler,在传输通道中对传出事件进行控制。

(10)Decoder(解码):

网络传输都是byte传输,所以Netty首先接收到的是byte,需要进行解码,编程JAVA对象。

Netty提供了很多解码器,包括服务架构图(最上)显示的Google Protobuf编码,这是Google提供的跨平台的小体积编码方式,在Netty中可以直接解码。

(11)Encoder(编码):

和解码类似,在传出服务器的时候,需要编码成byte传输给客户端。

(12)Future / ChannelFuture(消息返回,图上没有):

Netty提供的返回结果,类似回调函数,告知你执行结果是什么。

2,构建服务器基本方法

从原理架构图可以看出,构建一个Netty服务器基本需要3个步骤:

1),ServerBootstrap(建立连接):构建一个Scoket或者其他连接,通过事件循环建立通道。

2),ChannelInitializer(初始化连接):构建传输通道,用于管理控制器。

3),ChannelHandler(业务控制器):构建业务控制器,最基本的是解码,编码,信息传入/传出。

同样,构建一个客户端,同样也是这些步骤,不过建立连接是使用Bootstrap,并且使用一个事件循环,而服务器一般使用两个事件循环。

具体代码可以看一下节内容:构建一个最简单的socket服务器与客户端。

四,Netty构建游戏服务器有什么优势

1,游戏服务器是一个复杂的组成,基本要求是低延迟和高并发。游戏服务器经常需要各种通信,例如地图服务器、网管服务器、聊天服务器之间的通信。Netty的异步NIO框架可以保证高性能的通信能力。

2,灵活的编码解码定制能力,满足不同游戏场景下的多协议和私有协议编解码。

3,可配置的线程池,TCP参数,提供差异化定制能力。

4,黑白名单过滤(IP过滤),SSL安全,可以用于登录认证环节。

5,Netty心跳检测(链路有效性检测),用于检测客户端是否处于活跃状态。心跳检测是指,服务器定期向客户端发送指定内容,通过反馈来判断链路是否可用,客户端是否活着,是否可以正常接收和发送消息。

6,流量整形,一种主动调整流量输出速率的措施。作用是

1),防止由于上下游网元性能不均衡导致下游网元被压垮,业务流程中断;

2),防止由于通信模块接收消息过快,后端业务线程处理不及时导致的“撑死”问题。

流行整形原理是将废弃报文先缓存,放入队列中,当具有足够令牌的时候在发送缓存的报文。这种做法可以缓解压力,但是有一定的延迟。

7,日志统计能力,提供游戏服务可服务性。

8,基于内存池的对象重用技术,降低GC频度,使得玩家不卡。

Netty构建游戏服务器(一)--基本概念与原理的更多相关文章

  1. Netty构建游戏服务器(三)--netty spring简单整合

    一,基本方法 上节实现了netty的基本连接,这节加入spring来管理netty,由spring来开启netty服务. 在netty服务器中,我们建立了三个类:HelloServer(程序主入口) ...

  2. Netty构建游戏服务器(二)--Hello World

    一,准备工作 1,netty-all-4.1.5.Final.jar(官网下载) 2,eclipse 二,步骤概要 1,服务器开发 (1),创建Server类 该类是程序的主入口,有main方法,服务 ...

  3. Netty构建Http服务器

    Netty 是一个基于 JAVA NIO 类库的异步通信框架,它的架构特点是:异步非阻塞.基于事件驱动.高性能.高可靠性和高可定制性.换句话说,Netty是一个NIO框架,使用它可以简单快速地开发网络 ...

  4. 基于Netty打造RPC服务器设计经验谈

    自从在园子里,发表了两篇如何基于Netty构建RPC服务器的文章:谈谈如何使用Netty开发实现高性能的RPC服务器.Netty实现高性能RPC服务器优化篇之消息序列化 之后,收到了很多同行.园友们热 ...

  5. Netty游戏服务器之一

    所谓磨刀不误砍柴工,所以在搭建netty游戏服务器之前,我们先要把要准备的东西做好. 首先进入netty的官网下载最新版本的netty的jar包,http://netty.io/downloads.h ...

  6. HTML5游戏开发进阶指南(亚马逊5星畅销书,教你用HTML5和JavaScript构建游戏!)

    HTML5游戏开发进阶指南(亚马逊星畅销书,教你用HTML5和JavaScript构建游戏!) [印]香卡(Shankar,A.R.)著 谢光磊译 ISBN 978-7-121-21226-0 201 ...

  7. 游戏服务器:到底使用UDP还是TCP

    http://blog.jobbole.com/64638/ 在编写网络游戏的时候,到底使用UDP还是TCP的问题迟早都要面对. 一般来说你会听到人们这样说:“除非你正在写一个动作类游戏,否则你就用T ...

  8. 游戏服务器的思考之三:谈谈MVC

    游戏服务器也是基于MVC架构的吗?是的,所有的应用系统都是基于MVC架构的,这是应用系统的天性.不管是客户端还是后台,都包含模型.流程.界面这3个基本要素:不同类型的应用,3要素的“重量”可能各有偏差 ...

  9. 游戏服务器和Web服务器的区别

    用Go语言写游戏服务器也有一个多月了,也能够明显的感受到两者的区别.这篇文章就是想具体的聊聊其中的区别.当然,在了解区别之间,我们先简单的了解一下Go语言本身. 1. Go语言的特点 Go语言跟其他的 ...

随机推荐

  1. 【C语言项目】贪吃蛇游戏(下)

    目录 00. 目录 07. 游戏逻辑 7.5 按下ESC键结束游戏 7.6 判断是否撞到墙 7.7 判断是否咬到自己 08. 游戏失败界面设计 8.1 游戏失败界面边框设计 8.2 撞墙失败界面 8. ...

  2. (19)zabbix Applications使用介绍

    介绍 Applications(我们翻译为应用程序)是item的一个组. 例如我们要监控MySQL,我们可以将所有和MySQL相关的item放到这个应用程序中. 例如MySQL的availabilit ...

  3. The Three Day

    函数基础-练习 #.写函数,,用户传入修改的文件名,与要修改的内容,执行函数,完成批了修改操作 # def modify_file(filename,old,new): # import os # w ...

  4. PERL学习之模式匹配

    一.简介   模式指在字符串中寻找的特定序列的字符,由反斜线包含:/def/即模式def.其用法如结合函数split将字符串用某模式分成多个单词:@array = split(/ /, $line); ...

  5. day21-python模块

    1.时间 import time #时间戳 #计算 # print(time.time()) #1481321748.481654秒 #结构化时间---当地时间 # print(time.localt ...

  6. RESTful API批量操作的实现

    要解决的问题 RESTful API对于批量操作存在一定的缺陷.例如资源的删除接口: DELETE /api/resourse/<id>/ 如果我们要删除100条数据怎么搞?难道要调用10 ...

  7. 菜鸟的《Linux程序设计》学习—shell script

    1. 认识shell script shell script是利用shell的功能缩写的一个"程序",这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面, ...

  8. shell脚本举例

    1.有时在写一些以循环方式运行的监控脚本,设置时间间隔是必不可少的,下面是一个Shell进度条的脚本演示在脚本中生成延时. #!/bin/bash b='' for ((i=0;$i<=100; ...

  9. Java-在一个包装器对象中包装一个原始类型

    使用基本类型的包装对象,好处可以为空且可以序列化 package com.tj; public class MyClass2 { public static void main(String[] ar ...

  10. loj2002 「SDOI2017」序列计数

    水题 #include <iostream> #include <cstring> #include <cstdio> using namespace std; t ...