IT之道-艾锑知道

您当前位置: 主页 > 资讯动态 > 艾锑分享 >

IT运维知识:Netty框架简介


2020-03-21 16:55 作者:admin 浏览量:

为中小企业解困 企业IT外包服务火起来了

 
 
提到中小企业的困难,我相信大家都会深有感触,上没有皇亲国戚撑腰,下没有达官贵族的支持,全都要靠自己的拼博和奋斗,其实非常不容易,那怎样可以在现在这个环境下突出重围呢?
 
总的来说,中小企业有三大困难: 首先,高昂的成本. 其次,较低的效率. 第三,太少的营收.
 
· 高昂的成本
对于生产型企业,主要是采购成本,厂房成本,人力成本占主要部分,对于服务型企业,主要是房租成本,人力成本,管理运营成本占主要部分,对于营销型企业,主要是市场成本,人力成本,管理运营成本占主要部分,这三种类型的企业都有一个共同的特点,就是人力成本,中国近些年的快速发展,互联网企业起着主导地位,互联网人才的工资不断攀升,导致各行各业的人力成本水涨船高.
中小企业无论招什么岗位的人,一个人一年的总体投入成本都在10万元左右,这还是普通员工所支出的成本费用,如果一个企业10个人,一年就需要支出100多万,就意味着一家企业如果年利润在100万左右完全是亏损的,因为其它费用还没有计算其中,所以中小企业想尽一切找一些全能型人才来处理企业的需求,我们遇到一些中小企业,他们招一个前台,即要会修电脑,处理公司的网络,又要会开车,还在能做很多行政的文档表格,可想而知这样的人能力水平能达到什么程度,处理的效果以及及效率会是什么样的,这也是为什么很多中小企业行政经常离职的主要原因.
如果能减少这种综合性人才,把相关的工作分类外包出去,我相信不仅成本会降低很多,而且效果也会好很多,具体我们在后面详细说明如何操作.
· 较低的效率
企业效率低下主要有三个方面的原因,首先是管理的问题,管理者不会管理将直接导致整体效率下降. 其次是部门架构的问题,不合理的部门架构就像两个不能对齿的轮子,不仅有摩擦还会有火花. 第三是软硬件系统没有选对,一个企业的运转,不仅需要有合适的人才,还需要有合适的系统,智能手机未普及时大家用网页来处理一切的事务,导致整个效率和效果都很差,至从APP在智能手机上诞生就彻底地改变了这个世界的速度,让我们可以透过各种APP解决遇到的困境,很多事情我们需要干一年最后只需要一天或者一个小时.
· 太少的营收
互联网的快速发展,改变了无数行业的销售模式,传统销售是靠人海战术,互联网靠的是大数据营销,智能机器人取代了人的工作,而且是7*24小时全年无休,还不用发工资,但大部分传统行业的中小企业还是在用传统的模式找客户,付出了巨大的人力和时间,却带来了极少的收入.
 
面对这三种状态,传统中小企业需要如何转型升级,如何改变自己呢?
对应这三个方面我们提出最基础的变革,来帮助中小企业改变和适应当下的环境.
· 高昂的人力成本
外包是唯一的选择,当年耐克为了对抗德国的阿迪,把自己所有生产产品全部外包给了东南亚的生产工厂,大大降低了自己产品的成本,从而让自己的产品拥有与世界第一品牌的抗衡力量.还有华为这么大的企业,大部分行政前台全部都是外包的,包括很多大企业的食堂也是外包的,不是他们没有实力做,而是用专业的企业做专业的事.
所以中小企业很多方面的工作都是可以外包出去,大家可以自行研究一下,我就举一个例子,比喻说中小企业内部的网络管理员是完全没有必要自己招聘,可以外包给有实力有经验的IT外包公司,每年最少节省70%的成本,而且专业的IT外包公司还能给到很多行业领先的经验和解决方案,可以让你的企业更有竞争力,具体我就不在这里细说了,如果感兴趣的中小企业可以留言,我们私下探讨.
 
· 较低的运营效率
上面我们说到了一是管理人员的能力水平决定了企业整体的运营效率,二是企业内部软硬件系统所导致企业整体效率低下.对于管理人员如果中小企业请不起非常有能力的人才,就为自己的管理团队找一名高管教练,花钱不多,而且效果非常的好,像阿里,苹果等这样的大企业都为自己的高管配备一对一的教练服务,我们中小企业可以为所有高管团队配备一名教练就可以了,我们企业艾锑无限也是这么做的,这比让高管出去学习效果好上一百倍,因为教练是针对企业绩效的指导,不仅能帮助高管人的改变,还能让企业业绩发生巨大的变化.
关于如何选择适合中小企业的软硬件系统,可以好好研究一下阿里的钉钉,这家公司是中小企业效率软硬件提升的王者,不仅很多产品免费,而且还手把手地教你如何使用,这对于没有资金投入的中小企业来说是一个巨大的福音.
 
· 太少的业绩营收
主要核心是改变模式,从人海战术到利用互联网技术,从只有销售部才能产生业绩到全员都可以贡献业绩,从找客户到客户主动找到企业这三个方面入手.互联网技术给中小企业提供了很多销售的可能性,比喻说百度推广和搜索引擎优化,可以让精准用户主动找到你的企业,让更多客户提着钱来和你合作.
对于只有销售部才能产生销售的时代已经过去了,一家企业如果想要有好的营收,一定是全员销售,每个人都是企业的销售人员,每个人都可以为企业带来营收,这种理念和思维一定要融入企业每个人的血液里,当然能达到这样的高度,并不容易,需要企业的负责人花很多心思去培养大家的这种思维模式,去唤醒企业内部每个人拥有自主提升收入的意识.
过去是我们出去找客户,互联网时代可以做到客户主动来找你,企业无论大小,品牌意识非常重要,如果你能做到行业数一数二,你根本不缺客户,你也不用担心自己企业的营收问题,说到电商,你立刻会想到天猫和淘宝,提到运动品牌,你立刻会想到阿迪和耐克,讲到IT外包公司,立刻会想到艾锑无限和文思海辉,品牌的价值就是让你无形中会主动想和他们建立一种关系.
 
综上所述,我们提出了一些方向,可以给正处困境中的中小企业一些启发,希望透过大家的一起努力,让中小企业快速突围,找到自己成长的规律和法门.透过这么多年的经验,我们已预测企业IT外包很快就会火起来,这是每家中小企业的刚需.
你的企业有外包业务吗,欢迎来撩……
  IT运维知识Netty框架简介
 
 
一、概述
    Netty是由JBOSS提供的一个java开源框架。
    Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
二、体系结构图
   
三、Netty的核心结构
    Netty是典型的Reactor模型结构,在实现上,Netty中的Boss类充当mainReactor,NioWorker类充当subReactor(默认NioWorker的个数是当前服务器的可用核数)。
    在处理新来的请求时,NioWorker读完已收到的数据到ChannelBuffer中,之后触发ChannelPipeline中的ChannelHandler流。
    Netty是事件驱动的,可以通过ChannelHandler链来控制执行流向。因为ChannelHandler链的执行过程是在subReactor中同步的,所以如果业务处理handler耗时长,将严重影响可支持的并发数。
   
四、客户端和服务器端通信Demo
    Server-main:
ChannelFactory factory = new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool());
ServerBootstrap bootstrap = new ServerBootstrap(factory);
bootstrap.setPipelineFactory(new ChannelPipelineFactory(){ 
    @Override
    public ChannelPipeline getPipeline() throws Exception {
        return Channels.pipeline(new TimeServerHandler());
    }
});
bootstrap.setOption("child.tcpNoDelay", true);
bootstrap.setOption("child.keepAlive", true);
bootstrap.bind(new InetSocketAddress(1989));
    ChannelFactory 是一个创建和管理Channel通道及其相关资源的工厂接口,它处理所有的I/O请求并产生相应的I/O ChannelEvent通道事件。这个工厂并自己不负责创建I/O线程。应当在其构造器中指定该工厂使用的线程池,这样我们可以获得更高的控制力来管理应用环境中使用的线程。
    ServerBootstrap 是一个设置服务的帮助类。设置了一个继承自ChannelPipelineFactory的匿名类,用来作为ChannelPipeline通道,当服务器接收到一个新的连接,一个新的ChannelPipeline管道对象将被创建,并且所有在这里添加的ChannelHandler对象将被添加至这个新的ChannelPipeline管道对象。
    Server-Handler:
@Override
public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
    //TimeServer   
    Channel ch = e.getChannel();
    ChannelBuffer time = ChannelBuffers.buffer(8);
    time.writeLong(System.currentTimeMillis());
    ChannelFuture future = ch.write(time); 
    future.addListener(new ChannelFutureListener() {       
        @Override      
        public void operationComplete(ChannelFuture arg0) throws Exception {       
            Channel ch = arg0.getChannel();
            ch.close();
        }
    });
}
    Handler中是我们的业务逻辑,在Server的Handler里重载了channelConnected方法,当收到连接请求时,将当前服务器时间写入到Channel,并且在写完后触发关闭Channel。
    Client-main:
ChannelFactory factory = new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool());
ClientBootstrap bootstrap = new ClientBootstrap(factory);
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
    @Override  
    public ChannelPipeline getPipeline() throws Exception {
        return Channels.pipeline(new TimeClientHandler());
    }
});
bootstrap.setOption("tcpNoDelay",true);
bootstrap.setOption("keepAlive", true);
bootstrap.connect(new InetSocketAddress("127.0.0.1", 1989));
    Client端初始化Netty的过程和Server类似,只是将使用到的类替换为Client端的。
    Client-Handler:
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
    ChannelBuffer buf = (ChannelBuffer)e.getMessage();
    Long currentTimeMillis = buf.readLong();
    System.out.println(new Date(currentTimeMillis));
    e.getChannel().close();
}
    Client端的Handler里,我们将从服务器端接收到的信息转换为时间打印到控制台。
五、基于HTTP协议的服务器端实现
//HttpServerPipelineFactory.java
public class HttpServerPipelineFactory implements ChannelPipelineFactory {
    @Override
    public ChannelPipeline getPipeline() throws Exception {
        ChannelPipeline pipeline = Channels.pipeline();
        pipeline.addLast("decoder", new HttpRequestDecoder());
        pipeline.addLast("encoder", new HttpResponseEncoder());
        pipeline.addLast("handler", new HttpServerHandler());
        return pipeline;
    }
}
    新建一个HttpServerPipelineFactory类,在getPipeline()方法中添加了对Http协议的支持。
// HttpServer.java
bootstrap.setPipelineFactory(new HttpServerPipelineFactory());
    在Server里面使用我们新建的HttpServerPipelineFactory。
//HttpServerHandler.java
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
    DefaultHttpRequest defaultHttpRequest = (DefaultHttpRequest)e.getMessage();
    String uri = defaultHttpRequest.getUri();
    byte[] data = defaultHttpRequest.getContent().array();
    String content = URLDecoder.decode(new String(data),"utf-8").trim();
    System.out.println(uri+"|"+content);
    Channel ch = e.getChannel();
    HttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK);
    ChannelBuffer buffer = new DynamicChannelBuffer(2048);
    buffer.writeBytes("200".getBytes("UTF-8"));
    response.setContent(buffer);
    response.setHeader("Content-Type", "text/html;charset=UTF-8");
    response.setHeader("Content-Length", response.getContent().writerIndex());
    if (ch.isOpen() && ch.isWritable()) {  
        ChannelFuture future = ch.write(response); 
        future.addListener(new ChannelFutureListener() {       
            @Override      
            public void operationComplete(ChannelFuture arg0) throws Exception {           
                Channel ch = arg0.getChannel();        
                ch.close();
            }  
        });
    }
}
    在Handler里面我们可以直接拿到DefaultHttpRequest类型的对象,因为Netty已经用HttpRequestDecoder帮我们把接受到的数据都转换为HttpRequest类型了。
    使用了多个Handler后,通过下图,Netty的事件驱动就可以被很好的理解了:
  
    UpstreamEvent是被UpstreamHandler们自底向上逐个处理,DownstreamEvent是被DownstreamHandler们自顶向下逐个处理,这里的上下关系就是向ChannelPipeline里添加Handler的先后顺序关系。
 
六、总结
    Netty是一个简单却不失强大的架构。这个架构由三部分组成——缓冲(Buffer)、通道(Channel)、事件模型(Event Model)——所有的高级特性都构建在这三个核心组件之上。
 

相关文章

IT外包服务
二维码 关闭