`
xylong
  • 浏览: 191246 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

如何构建一个基于netty的后端服务器

 
阅读更多

 

如何构建一个基于netty的后端服务器,先打个标题

 

直接上干货,这个是前奏,比较山寨的实现,大家可先自行看下

https://github.com/xiaotutiger/miyue-music-service/tree/master/miyue-music-service

 

下面将分析手头上一个项目,运用的技术很全,值得学习,先做一个简单介绍,当然业务部分代码就不讲了。

整个工程采用maven来管理,主要的技术是spring+jedis+netty+disruptor.看这个组合,这个服务器端性能应该很不错。

 

这个工程又引发我对技术无限热爱 ,哈哈。

 

这个工程,目前主要是针对一些基于json/xml/text格式的请求,同时也是支持标准手机请求的,当然,可以自定义一些其他格式或者pc端的请求,而且针对不同URI,后面挂了不同的handler,这些可能都是一些web处理的基本思想,只是脱离了常规的web容器或者应用服务器。

 

xml工具采用xstram来处理,两个字,方便。

json工具采用jackson\不知道和业界出名的fastjson\gson\sf.json有何区别,待鉴定。

 

客户端的请求,统一继承ClientRequestModel,经过编码统一转化为domainMessage,交由disruptor来处理,其实oop里什么继承,实现,封装思想,大部分都在围绕一个东西在走,一句话,把看似各有棱角的东西如何转化为共同的东西,求同存异啊(比如,水,石头,空气等,如果在这一层,我们没法统一用一个特征来表示,我们可以先把它转化为分子,那是不是可以用同一个东西来表示呢?如何高度抽象封装,这真是一门艺术)。

 

看这个工程对客户端请求,是如何一步步处理的,message->request->event 交由disruptor来处理,很美妙的思想。在了解这些之前,我们有必要深入学习一下disruptor,很特别的一个框架,宣言很牛逼,中文文档在这里(http://ifeve.com/dissecting-disruptor-whats-so-special/),E文好的同学请移步到这里(http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-whats-so-special.html

 

了解disruptor之前,先学习下ringbuffer是如何实现的?

1、ringbuffer的特别之处:

 只有一个指针,没有尾指针,基于数组,且不会删除元素,元素会覆盖,充分利用缓存行,减少垃圾回收。

2、如何从ringbuffer读取数据:

 

------------------------------------------2013-9-9 补充-----------------------------------------------------

下面主要讲一下请求如何处理这块架构吧,其实架构这个东西,说简单一点,就是一种简单可扩展的实现方式,在某些程度上,不要太在意性能。

 

底层通信建立在netty之上,基本没做任何改动

 

public class HttpServerPipelineFactory implements ChannelPipelineFactory {
    private ChannelUpstreamHandler channelUpstreamHandler;

    public ChannelPipeline getPipeline() throws Exception {
        // Create a default pipeline implementation.
        ChannelPipeline pipeline = pipeline();

        // Uncomment the following line if you want HTTPS
        //SSLEngine engine = SecureChatSslContextFactory.getServerContext().createSSLEngine();
        //engine.setUseClientMode(false);
        //pipeline.addLast("ssl", new SslHandler(engine));

        pipeline.addLast("decoder", new HttpRequestDecoder());
        // Uncomment the following line if you don't want to handle HttpChunks.
        pipeline.addLast("aggregator", new HttpChunkAggregator(1048576));
        pipeline.addLast("encoder", new HttpResponseEncoder());
        // Remove the following line if you don't want automatic content compression.
        pipeline.addLast("deflater", new HttpContentCompressor());
        //pipeline.addLast("handler", new HttpRequestHandler());
        pipeline.addLast("handler", channelUpstreamHandler);
        return pipeline;
    }

    public void setChannelUpstreamHandler(ChannelUpstreamHandler channelUpstreamHandler) {
        this.channelUpstreamHandler = channelUpstreamHandler;
    }
}

 

   相关spring配置

   

<bean id="httpServerPipelineFactory" class="com.yunchao.cm.network.http.HttpServerPipelineFactory">
        <property name="channelUpstreamHandler" ref="httpRequestHandler"/>
    </bean>

   

<bean id="httpRequestHandler" class="com.yunchao.cm.network.http.HttpRequestHandler">
        <property name="urlMaps">
            <map>
                <entry key="/payorder">
                    <ref bean="payOrderCodecFactory"/>
                </entry>
                <entry key="/question">
                    <ref bean="questionCodecFactory"/>
                </entry>
                <entry key="/sms">
                    <ref bean="smsCodecFactory"/>
                </entry>

   代码太多,不全部贴出来,后面整理一下放到我的github上去。

 

   基如此,我们还是得定义一个handler,继承simpleChannelUpstreamHander,并重写了messageReceied方法,具体在这里。

QueryStringDecoder queryStringDecoder = new QueryStringDecoder(request.getUri());
        String url = queryStringDecoder.getPath();

        CodecFactory codecFactory = urlMaps.get(url);


        if (null == codecFactory) {
            logger.error("unsupported url:{} request.", url);
            //sendError(ctx, BAD_REQUEST);
            e.getChannel().close();
            return;
        }

        //获取cmwap网络中的手机号码
        String phone = PhoneUtils.getPhone(request.getHeader("x-up-calling-line-id"));

        if (request.getMethod().equals(HttpMethod.POST)) {
            ChannelBuffer content = request.getContent();
            String postParams = content.toString(CharsetUtil.UTF_8);

            logger.debug("request content:{}", postParams);

            ClientRequestModel model = (ClientRequestModel) codecFactory.decode(postParams);
            model.setProperty(model.MESSAGE_EVENT_KEY, e);
            model.setProperty(model.HTTP_REQUEST_KEY, request);
            model.setProperty(model.HTTP_PHONE_KEY, phone);

            InetSocketAddress remoteAddress = (InetSocketAddress) e.getRemoteAddress();
            model.setProperty(model.IP_KEY, remoteAddress.getAddress().getHostAddress());

            logger.info("user request model:{}", model);

            model.fireSelf();

    

@Override
    public DomainMessage fireSelf() {
        DomainMessage em = new DomainMessage(this);
        EventUtils.fireEvent(em, "alipayNotifyState");
        return em;
    }

 

  看到这里基本上能够清楚了,是如何把客户端请求包装成ClientRequestModel了,且后面涉及到处理的对象,全部继承它,在整个架构之中,has a 优于 is a,对于客户端netty的一些对象,也是存储在ClientRequestModel中,codec无非也是采用了xml/json/kv,如斯,实现了字节与对象之间的转换。

 

除此之外,突然想到刚来杭州工作的第一家公司,基于此,采用的架构师servlet充当服务器,因为这是一个公司内部的server,而不是一个平台,采用的数据格式也比较单一,就是xml,但是采用的外部类库也是xstream来处理的,但是整个系统维持的日调用量也是在百万级别,运用的client则是采用httpclient,对于不同请求后面挂的handler,是在容器启动时加载到内存中,其余也没有什么亮点了。

 

 

   

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论
7 楼 小灯笼 2018-06-06  
Netty源码剖析视频教程
网盘地址:https://pan.baidu.com/s/1MFV_uq4PvdPHdrOJpuLFIA 密码: h3if
备用地址(腾讯微云):http://url.cn/5R2xYI4 密码:OmbopD
6 楼 kongdong88 2017-08-16  
Netty简单应用与线上服务器部署
课程学习地址:http://www.xuetuwuyou.com/course/198
课程出自学途无忧网:http://www.xuetuwuyou.com

一、开发环境
4.1.11.Final 
jdk1.8
maven 3.2
Spring 4.3.9


二、适合人群
①想深入学习java ClassLoader
②想在线上linux服务器上运行netty或Springboot服务

三、课程目标
①掌控ClassLoader
②学会编写shell脚本
③了解jvm内存分配
④熟悉线上服务器部署


四、课程目录
1、系统架构技术介绍
2、netty服务器编写
3、netty的编码和解码
4、Netty客户端编写
5、与spring整合
6、netty服务器待解决的问题
7、Classloader类加载器
8、自定义类加载器
9、第二种类加载器
10、热部署
11、类加载器加载外部配置文件
12、项目运行时加载依赖jar
13、项目运行时加载依赖jar第二种方案
14、linux服务器编写通用shell脚本启动JVM
15、优化Shell脚本
16、Shell脚本中加上JVM堆栈内存参数以及垃圾回收机制



Netty课程整合推荐:

Netty简单应用与线上服务器部署
课程观看地址:http://www.xuetuwuyou.com/course/198

深入浅出Netty源码剖析
课程观看地址:http://www.xuetuwuyou.com/course/157

Netty实战高性能分布式RPC
课程观看地址:http://www.xuetuwuyou.com/course/171

NIO+Netty5各种RPC架构实战演练
课程观看地址:http://www.xuetuwuyou.com/course/52

物联网核心技术之Netty入门到精通课程
课程观看地址:http://www.xuetuwuyou.com/course/14

Netty三部曲,夜行侠老师带你玩转netty
课程观看地址:http://www.xuetuwuyou.com/course/175

Netty物联网高并发系统第一季
课程观看地址:http://www.xuetuwuyou.com/course/178
17、Netty服务器加上配置信息



5 楼 zjwpw 2016-12-13  
楼主GitHub地址呢
4 楼 l_rambo 2016-01-29  
有Github的地址吗?
3 楼 icmilyc 2015-04-29  
楼主,请问下你的Github ID是什么?强烈欲望观摩下您的代码
2 楼 ivoter 2014-05-27  
   一直想这么架构个 用户中心。
前台使用(netty)接受用户验证请求。
服务层使用diruptor做业务并发处理。
数据库使用mysql(redis数据缓存) 读写分离、定时缓存。
spring管理依赖注入。

貌似netty不适用tomcat这类的web服务器啊,直接使用http连接了。
1 楼 xiaotuTiger 2014-03-31  
楼主 你是我的马甲还是替身?怎么做的项目和我的一样 还引用了我的github 神了

相关推荐

    基于netty的物联网高并发网关.zip

    基于Netty构建的物联网高并发网关利用了Netty框架的强大功能,实现了高性能、低延迟的网络应用。下面将详细介绍Netty框架以及如何用其构建物联网高并发网关。 Netty是一个异步事件驱动的网络应用框架,适用于快速...

    JAVA版基于netty的物联网高并发智能网关.zip

    "JAVA版基于netty的物联网高并发智能网关"项目正致力于解决这一问题,通过利用Java语言和Netty框架构建一个高性能、可扩展的网络通信系统。Netty是一个异步事件驱动的网络应用框架,适用于开发高效的服务器和客户端...

    基于netty实现mqtt服务器 毕业设计.zip

    标题 "基于netty实现mqtt服务器 毕业设计.zip" 提供了我们即将探讨的核心内容:使用Java的Netty框架构建一个MQTT服务器,这是针对毕业设计的一个项目。MQTT(Message Queuing Telemetry Transport)是一种轻量级的...

    基于netty的java游戏服务器.zip

    本项目源码以Java语言为基础,结合Netty框架,为游戏服务器的构建提供了一个实践平台,适合于毕业设计、课程设计以及自我学习提升。 Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高...

    基于Netty消息框架的Java游戏服务器.zip

    本项目"基于Netty消息框架的Java游戏服务器"就是这样一个实例,它展示了如何利用Java和Netty来实现一个高效、可扩展的游戏服务端。 【描述】 这个Java游戏服务器源码项目是为初学者和开发者提供的一种学习资源,...

    基于Netty的Java WebSocket集群框架。.zip

    本项目"基于Netty的Java WebSocket集群框架"旨在构建一个能够支持高并发、分布式部署的WebSocket服务。下面我们将深入探讨相关的技术点和实现细节。 1. **Netty框架**:Netty的核心是它的NIO(非阻塞I/O)模型,它...

    基于netty+mqtt3.1.1+springboot+jdk8 实现的 mqtt 服务端跟客户端.zip

    这是一个基于Java技术栈,具体是Netty、MQTT 3.1.1协议、Spring Boot框架和JDK 8实现的MQTT服务器和客户端的项目。这个项目对于学习和实践物联网(IoT)通信以及Java后端开发具有很高的价值,尤其适合作为毕业设计的...

    基于netty与Springboot实现的编程游戏服务器-源码

    在本项目中,我们主要探讨的是如何利用Netty与Spring Boot技术栈构建一个编程游戏服务器。Netty是一个高性能、异步事件驱动的网络应用程序框架,常用于开发高并发、低延迟的网络应用,如游戏服务器。而Spring Boot是...

    基于netty+websocket的在线聊天室

    在构建一个基于Netty+WebSocket的在线聊天室时,我们需要深入了解这两个核心技术以及它们与SpringBoot、Freemarker和Layui等其他技术的整合。以下是对这些知识点的详细阐述: 1. **Netty**: Netty是一个高性能、...

    Java基于Netty的websocket微服务架构即时聊天即时通信APP源码,仿微信APP

    Java基于Netty的websocket微服务架构即时聊天即时通信APP源码,仿微信APP前端使用Vue3 + TypeScript,后端采用SpringCloud + SpringBoot + Spring Data JPA 。基于 Netty 使用 WebSocket 实现了正常的C/S通信模块。...

    simple-rpc是一款基于netty的RPC框架

    **简单RPC:基于Netty的高效RPC框架** `Simple-RPC`是一个专为Java开发者设计的轻量级RPC(远程过程调用)框架,它利用了高性能的网络库`Netty`来实现实时、高效的远程通信。RPC框架在分布式系统中起到了关键作用,...

    聊天室项目源码-java基于netty-socketio开发.zip

    标题中的“聊天室项目源码-java基于netty-socketio开发”揭示了这是一个使用Java编程语言,基于Netty网络框架和Socket.IO库构建的实时聊天室应用。这个项目旨在教授如何利用这些技术来创建一个高效的、实时的网络...

    基于netty-socketio的简易聊天室.zip

    总之,"基于netty-socketio的简易聊天室"项目结合了SpringBoot的便捷性和Socket.IO的实时通信能力,为开发人员提供了一个构建实时应用的参考模板。通过学习和实践,你可以掌握如何构建一个具有实时通信功能的多人...

    EasyChat-Netty:基于Netty+SpringBoot+WebSocket+MUI+HTML5+制作的仿微信聊天APP,该仓库为后端系统,主要应用Netty+SpringBoot实现服务器功能

    一款使用Netty+SpringBoot+MUI+HTML5+制作的仿微信的聊天APP,包括聊天,通讯录,发现,个人等模块。 此工程为后端工程,前端工程参照: 安卓版V1.0版 欢迎扫码下载apk测试,或者到前端工程的releases中下载 功能...

    springboot+netty开发简易式游戏源码

    在本项目中,"springboot+netty开发简易式游戏源码"是一个使用Spring Boot和Netty框架构建的轻量级游戏服务器的示例。这个项目结合了两个强大的技术,旨在提供一个高效、可扩展的游戏后端解决方案。下面将详细阐述...

    springboot工程基于netty-socketio的 web推送消息简单代码

    在本文中,我们将深入探讨如何在Spring Boot工程中利用Netty和Socket.IO构建一个Web消息推送服务。Spring Boot以其简洁的配置和强大的功能,成为Java开发者构建微服务的首选框架。而Netty作为高性能的异步事件驱动...

    一个基于Java的开源游戏服务器框架实现,使用了Netty、ProtoBuf、Disruptor等.zip

    总之,这个基于Java的开源游戏服务器框架通过集成Netty、ProtoBuf和Disruptor,提供了一种高效、可扩展的解决方案,对于那些寻求构建高性能游戏服务器的开发者来说,这是一个非常有价值的资源。通过学习和利用这个...

    后端netty网络编程

    Netty是一个开源的异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。下面将详细介绍Netty在网络编程中的应用和关键知识点。 首先,Netty的核心概念包括: 1. **通道(Channel)**:...

    毕设项目:基于netty+websocket+springboot的实时聊天系统.zip

    这是一个基于Netty、WebSocket和Spring Boot技术实现的实时聊天系统的毕设项目,下面将详细介绍这个项目的相关知识点。 首先,我们来了解一下Spring Boot。Spring Boot是由Pivotal团队提供的全新框架,其设计目标是...

    WebSocket利用netty连接入门项目

    这个入门项目是学习WebSocket与Netty结合的一个好起点,通过实际操作,你可以更深入地理解WebSocket协议的工作原理,以及如何使用Netty构建高效稳定的WebSocket服务器。同时,对于前端开发人员,这也是一个了解...

Global site tag (gtag.js) - Google Analytics