GithubHelp home page GithubHelp logo

all4you / redant Goto Github PK

View Code? Open in Web Editor NEW
309.0 27.0 132.0 8.8 MB

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

License: Apache License 2.0

Java 100.00%
netty http web container

redant's Introduction

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

redant's People

Contributors

all4you avatar e0c9 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

redant's Issues

线程复用了netty IO worker线程以及拦截器异步等

1, 复用worker线程在遇到IO阻塞的时候, 譬如调用三方服务的时候,导致全局阻塞, 需要有线程池进行拆解.
2, Interceptor 拦截器也是基于IO线程复用方式, 一个IO线程仅仅映射一个channel原则, 所以preHandle/postHandle 才可以重用start变量记时有效
3, 异步CompletableFuture如何支持, 通过异步上下文传递.

请教一个问题

我看到了redant里面用到了threadlocal才存放一些重要的信息。对于netty这种异步的框架而言,同一个线程是会处理多个不同的请求的,这样做,是否正确?
我对此有些疑惑,可能是我知识有限,烦请解答一下,谢谢了。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.