{"id":15014339,"url":"https://github.com/all4you/redant","last_synced_at":"2025-04-06T11:09:58.975Z","repository":{"id":28329929,"uuid":"108949548","full_name":"all4you/redant","owner":"all4you","description":"A lightweight distributed web container based on Netty  一个基于Netty的轻量级Web容器","archived":false,"fork":false,"pushed_at":"2022-06-17T02:04:15.000Z","size":9012,"stargazers_count":309,"open_issues_count":4,"forks_count":132,"subscribers_count":26,"default_branch":"master","last_synced_at":"2025-03-30T10:06:54.165Z","etag":null,"topics":["container","http","netty","web"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/all4you.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-10-31T05:28:58.000Z","updated_at":"2025-03-08T03:56:53.000Z","dependencies_parsed_at":"2022-09-01T23:41:23.696Z","dependency_job_id":null,"html_url":"https://github.com/all4you/redant","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/all4you%2Fredant","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/all4you%2Fredant/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/all4you%2Fredant/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/all4you%2Fredant/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/all4you","download_url":"https://codeload.github.com/all4you/redant/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247471521,"owners_count":20944158,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["container","http","netty","web"],"created_at":"2024-09-24T19:45:29.846Z","updated_at":"2025-04-06T11:09:58.954Z","avatar_url":"https://github.com/all4you.png","language":"Java","readme":"# RedAnt 项目\n\n**RedAnt** 是一个基于 Netty 的轻量级 Web 容器\n\n **特性:**\n\n- [x] **IOC容器** : 通过 @Bean 注解可以管理所有对象，通过 @Autowired 注解进行对象注入\n- [x] **自定义路由**  : 通过 @Controller @Mapping @Param 注解可以自定义路由\n- [x] **自动参数转换**  : 通过 TypeConverter 接口，http 参数会被转成对象(支持基本类型,Map,List,JavaBean)\n- [x] **结果渲染**  : 支持对结果进行渲染，支持 html, xml, plain, json 格式\n- [x] **Cookie管理**  : 内置一个 Cookie 管理器\n- [x] **前置后置拦截器** ：支持前置拦截器与后置拦截器\n- [x] **单机模式**  : 支持单机模式\n- [x] **集群模式**  : 支持集群模式\n- [x] **服务注册与发现** ：实现了一个基于 Zk 的服务注册与发现，来支持多节点模式\n- [ ] **Session管理**  : 因为涉及到多节点模式，分布式 session 暂未实现\n\n\n\n\n\n## 快速启动\n\n### 1.单机模式\n\nRedant 是一个基于 Netty 的 Web 容器，类似 Tomcat 和 WebLogic 等容器\n\n只需要启动一个 Server，默认的实现类是 NettyHttpServer 就能快速启动一个 web 容器了，如下所示：\n\n``` java\npublic final class ServerBootstrap {\n    public static void main(String[] args) {\n        Server nettyServer = new NettyHttpServer();\n        // 各种初始化工作\n        nettyServer.preStart();\n        // 启动服务器\n        nettyServer.start();\n    }\n}\n```\n\n\n\n### 2.集群模式\n\n到目前为止，我描述的都是单节点模式，如果哪一天单节点的性能无法满足了，那就需要使用集群了，所以我也实现了集群模式。\n\n集群模式是由一个主节点和若干个从节点构成的。主节点接收到请求后，将请求转发给从节点来处理，从节点把处理好的结果返回给主节点，由主节点把结果响应给请求。\n\n要想实现集群模式需要有一个服务注册和发现的功能，目前是借助于 Zk 来做的服务注册与发现。\n\n\n#### 准备一个 Zk 服务端\n\n因为主节点需要把请求转发给从节点，所以主节点需要知道目前有哪些从节点，我通过 ZooKeeper 来实现服务注册与发现。\n\n如果你没有可用的 Zk 服务端的话，那你可以通过运行下面的 Main 方法来启动一个 ZooKeeper 服务端：\n\n``` java\npublic final class ZkBootstrap {\n    private static final Logger LOGGER = LoggerFactory.getLogger(ZkBootstrap.class);\n\n    public static void main(String[] args) {\n        try {\n            ZkServer zkServer = new ZkServer();\n            zkServer.startStandalone(ZkConfig.DEFAULT);\n        }catch (Exception e){\n            LOGGER.error(\"ZkBootstrap start failed,cause:\",e);\n            System.exit(1);\n        }\n    }\n}\n```\n\n这样你就可以在后面启动主从节点的时候使用这个 Zk 了。但是这并不是必须的，如果你已经有一个正在运行的 Zk 的服务端，那么你可以在启动主从节点的时候直接使用它，通过在 main 方法的参数中指定 Zk 的地址即可。\n\n\n\n#### 启动主节点\n\n只需要运行下面的代码，就可以启动一个主节点了：\n\n``` java\npublic class MasterServerBootstrap {\n    public static void main(String[] args) {\n        String zkAddress = ZkServer.getZkAddressArgs(args,ZkConfig.DEFAULT);\n\n        // 启动MasterServer\n        Server masterServer = new MasterServer(zkAddress);\n        masterServer.preStart();\n        masterServer.start();\n    }\n}\n```\n\n如果在 main 方法的参数中指定了 Zk 的地址，就通过该地址去进行服务发现，否则会使用默认的 Zk 地址\n\n\n\n#### 启动从节点\n\n只需要运行下面的代码，就可以启动一个从节点了：\n\n``` java\npublic class SlaveServerBootstrap {\n\n    public static void main(String[] args) {\n        String zkAddress = ZkServer.getZkAddressArgs(args,ZkConfig.DEFAULT);\n        Node node = Node.getNodeWithArgs(args);\n\n        // 启动SlaveServer\n        Server slaveServer = new SlaveServer(zkAddress,node);\n        slaveServer.preStart();\n        slaveServer.start();\n    }\n\n}\n```\n\n如果在 main 方法的参数中指定了 Zk 的地址，就通过该地址去进行服务注册，否则会使用默认的 Zk 地址\n\n\n\n## 例子\n\n你可以运行 redant-example 模块中提供的例子来体验一下，example 模块中内置了两个 Controller 。\n\n启动完之后，你可以在浏览器中访问 http://127.0.0.1:8888 来查看具体的效果 (默认的端口可以在 redant.properties 中修改)\n\n如果你看到了这样的消息：\"Welcome to redant!\" 这就意味着你已经启动成功了。\n\n在 redant-example 模块中，内置了以下几个默认的路由:\n\n| 方法类型           | URL                          | 响应类型                       |\n| ----------------- | ---------------------------- | ----------------------------- |\n| GET               | /                            | HTML                          |\n| \\*                | \\*                           | HTML                          |\n| GET               | /user/count                  | JSON                          |\n| GET               | /user/list                   | JSON                          |\n| GET               | /user/info                   | JSON                          |\n\n\n\n\n## Bean 管理器\n\n跟 Spring 一样，你可以通过 @Bean 注解来管理所有的对象，通过 @Autowired 来自动注入\n\n**Tips：** 更多信息请查看wiki: [Bean][1]\n\n\n\n## 自定义路由\n\n跟 Spring 一样，你可以通过 @Controller 来自定义一个 Controller.\n\n@Mapping 注解用在方法级别，@Controller + @Mapping 唯一定义一个 http 请求。\n\n@Param 注解用在方法的参数上。通过该注解可以自动将基本类型转成 POJO 对象。\n\n**Tips：** 更多信息请查看wiki: [Router][2]\n\n\n\n## Cookie 管理器\n\nCookie 管理器可以管理用户自定义的 Cookie。\n\n**Tips：** 更多信息请查看wiki: [Cookie][4]\n\n\n\n## 联系我\n\n\u003e wh_all4you#hotmail.com\n\n![contact-me](./logo.jpg)\n\n\n\n\n[1]: https://github.com/all4you/redant/wiki/1:Bean\n[2]: https://github.com/all4you/redant/wiki/2:Router\n[3]: https://github.com/all4you/redant/wiki/3:Session\n[4]: https://github.com/all4you/redant/wiki/4:Cookie\n\n\n","funding_links":[],"categories":["网络编程"],"sub_categories":["Spring Cloud框架"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fall4you%2Fredant","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fall4you%2Fredant","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fall4you%2Fredant/lists"}