加入收藏 | 设为首页 | 会员中心 | 我要投稿 葫芦岛站长网 (https://www.0429zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

Netty 实战:如何编写一个麻小俱全的 Web 框架

发布时间:2019-02-21 11:12:57 所属栏目:优化 来源:逅弈
导读:学习 Netty 也有一段时间了,为了更好的掌握 Netty,我手动造了个轮子,一个基于 Netty 的 web 框架:redant,中文叫红火蚁。创建这个项目的目的主要是学习使用 Netty,俗话说不要轻易的造轮子,但是通过造轮子我们可以学到很多优秀开源框架的设计思路,编

目前拦截器还没有实现指定顺序执行的功能,其实也很简单,可以定义一个 @InterceptorOrder 的注解应用在所有的拦截器的实现类上,扫描到拦截器的结果之后,根据该注解进行排序,然后把拍完序之后的结果添加到 pipeline 中即可。

集群模式

到目前为止,我描述的都是单节点模式,如果哪一天单节点的性能无法满足了,那就需要使用集群了,所以我也实现了集群模式。

集群模式是由一个主节点和若干个从节点构成的。主节点接收到请求后,将请求转发给从节点来处理,从节点把处理好的结果返回给主节点,由主节点把结果响应给请求。

要想实现集群模式需要有一个服务注册和发现的功能,目前是借助于 Zk 来做的服务注册与发现。

准备一个 Zk 服务端

因为主节点需要把请求转发给从节点,所以主节点需要知道目前有哪些从节点,我通过 ZooKeeper 来实现服务注册与发现。

如果你没有可用的 Zk 服务端的话,那你可以通过运行下面的 Main 方法来启动一个 ZooKeeper 服务端:

  1. public final class ZkBootstrap { 
  2.     private static final Logger LOGGER = LoggerFactory.getLogger(ZkBootstrap.class); 
  3.  
  4.     public static void main(String[] args) { 
  5.         try { 
  6.             ZkServer zkServer = new ZkServer(); 
  7.             zkServer.startStandalone(ZkConfig.DEFAULT); 
  8.         }catch (Exception e){ 
  9.             LOGGER.error("ZkBootstrap start failed,cause:",e); 
  10.             System.exit(1); 
  11.         } 
  12.     } 

这样你就可以在后面启动主从节点的时候使用这个 Zk 了。但是这并不是必须的,如果你已经有一个正在运行的 Zk 的服务端,那么你可以在启动主从节点的时候直接使用它,通过在 main 方法的参数中指定 Zk 的地址即可。

启动主节点

只需要运行下面的代码,就可以启动一个主节点了:

  1. public class MasterServerBootstrap { 
  2.     public static void main(String[] args) { 
  3.         String zkAddress = ZkServer.getZkAddressArgs(args,ZkConfig.DEFAULT); 
  4.  
  5.         // 启动MasterServer 
  6.         Server masterServer = new MasterServer(zkAddress); 
  7.         masterServer.preStart(); 
  8.         masterServer.start(); 
  9.     } 

如果在 main 方法的参数中指定了 Zk 的地址,就通过该地址去进行服务发现,否则会使用默认的 Zk 地址。

启动从节点

只需要运行下面的代码,就可以启动一个从节点了:

  1. public class SlaveServerBootstrap { 
  2.  
  3.     public static void main(String[] args) { 
  4.         String zkAddress = ZkServer.getZkAddressArgs(args,ZkConfig.DEFAULT); 
  5.         Node node = Node.getNodeWithArgs(args); 
  6.  
  7.         // 启动SlaveServer 
  8.         Server slaveServer = new SlaveServer(zkAddress,node); 
  9.         slaveServer.preStart(); 
  10.         slaveServer.start(); 
  11.     } 
  12.  

如果在 main 方法的参数中指定了 Zk 的地址,就通过该地址去进行服务注册,否则会使用默认的 Zk 地址。

实际上多节点模式具体的处理逻辑还是复用了单节点模式的核心功能,只是把原本一台实例扩展到多台实例而已。

总结

本文通过介绍一个基于 Netty 的 web 容器,让我们了解了一个 http 服务端的大概的构成,当然实现中可能有更加好的方法。但是主要的还是要了解内在的思想,包括 Netty 的一些基本的使用方法。

我会继续优化该项目,加入更多的特性,例如服务发现与注册当前是通过 Zk 来实现的,未来可能会引入其他的组件去实现服务注册与发现。

除此之外,Session 的管理还未完全实现,后续也需要对这一块进行完善。

(编辑:葫芦岛站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!