/redant

A lightweight distributed web container based on Netty 一个基于Netty的轻量级Web容器

Primary LanguageJavaApache License 2.0Apache-2.0

RedAnt 项目

RedAnt 是一个基于 Netty 的轻量级 Web 容器

特性:

  • IOC容器 : 通过 @Bean 注解可以管理所有对象,通过 @Autowired 注解进行对象注入
  • 自定义路由 : 通过 @Controller @Mapping @Param 注解可以自定义路由
  • 自动参数转换 : 通过 TypeConverter 接口,http 参数会被转成对象(支持基本类型,Map,List,JavaBean)
  • 结果渲染 : 支持对结果进行渲染,支持 html, xml, plain, json 格式
  • Cookie管理 : 内置一个 Cookie 管理器
  • 前置后置拦截器 :支持前置拦截器与后置拦截器
  • 单机模式 : 支持单机模式
  • 集群模式 : 支持集群模式
  • 服务注册与发现 :实现了一个基于 Zk 的服务注册与发现,来支持多节点模式
  • Session管理 : 因为涉及到多节点模式,分布式 session 暂未实现

快速启动

1.单机模式

Redant 是一个基于 Netty 的 Web 容器,类似 Tomcat 和 WebLogic 等容器

只需要启动一个 Server,默认的实现类是 NettyHttpServer 就能快速启动一个 web 容器了,如下所示:

public final class ServerBootstrap {
    public static void main(String[] args) {
        Server nettyServer = new NettyHttpServer();
        // 各种初始化工作
        nettyServer.preStart();
        // 启动服务器
        nettyServer.start();
    }
}

2.集群模式

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

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

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

准备一个 Zk 服务端

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

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

public final class ZkBootstrap {
    private static final Logger LOGGER = LoggerFactory.getLogger(ZkBootstrap.class);

    public static void main(String[] args) {
        try {
            ZkServer zkServer = new ZkServer();
            zkServer.startStandalone(ZkConfig.DEFAULT);
        }catch (Exception e){
            LOGGER.error("ZkBootstrap start failed,cause:",e);
            System.exit(1);
        }
    }
}

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

启动主节点

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

public class MasterServerBootstrap {
    public static void main(String[] args) {
        String zkAddress = ZkServer.getZkAddressArgs(args,ZkConfig.DEFAULT);

        // 启动MasterServer
        Server masterServer = new MasterServer(zkAddress);
        masterServer.preStart();
        masterServer.start();
    }
}

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

启动从节点

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

public class SlaveServerBootstrap {

    public static void main(String[] args) {
        String zkAddress = ZkServer.getZkAddressArgs(args,ZkConfig.DEFAULT);
        Node node = Node.getNodeWithArgs(args);

        // 启动SlaveServer
        Server slaveServer = new SlaveServer(zkAddress,node);
        slaveServer.preStart();
        slaveServer.start();
    }

}

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

例子

你可以运行 redant-example 模块中提供的例子来体验一下,example 模块中内置了两个 Controller 。

启动完之后,你可以在浏览器中访问 http://127.0.0.1:8888 来查看具体的效果 (默认的端口可以在 redant.properties 中修改)

如果你看到了这样的消息:"Welcome to redant!" 这就意味着你已经启动成功了。

在 redant-example 模块中,内置了以下几个默认的路由:

方法类型 URL 响应类型
GET / HTML
* * HTML
GET /user/count JSON
GET /user/list JSON
GET /user/info JSON

Bean 管理器

跟 Spring 一样,你可以通过 @Bean 注解来管理所有的对象,通过 @Autowired 来自动注入

Tips: 更多信息请查看wiki: Bean

自定义路由

跟 Spring 一样,你可以通过 @Controller 来自定义一个 Controller.

@Mapping 注解用在方法级别,@Controller + @Mapping 唯一定义一个 http 请求。

@Param 注解用在方法的参数上。通过该注解可以自动将基本类型转成 POJO 对象。

Tips: 更多信息请查看wiki: Router

Cookie 管理器

Cookie 管理器可以管理用户自定义的 Cookie。

Tips: 更多信息请查看wiki: Cookie

联系我

wh_all4you#hotmail.com

contact-me