{"id":26271953,"url":"https://github.com/farsunset/netty-http-server","last_synced_at":"2025-05-05T16:29:29.097Z","repository":{"id":55635051,"uuid":"160799798","full_name":"farsunset/netty-http-server","owner":"farsunset","description":"Springboot项目中使用Netty来替代传统Web容器，提升性能，简化配置","archived":false,"fork":false,"pushed_at":"2018-12-07T10:09:23.000Z","size":26,"stargazers_count":79,"open_issues_count":2,"forks_count":48,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-03-30T22:24:41.845Z","etag":null,"topics":[],"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/farsunset.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":"2018-12-07T09:12:05.000Z","updated_at":"2024-10-30T01:58:36.000Z","dependencies_parsed_at":"2022-08-15T05:01:01.774Z","dependency_job_id":null,"html_url":"https://github.com/farsunset/netty-http-server","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/farsunset%2Fnetty-http-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/farsunset%2Fnetty-http-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/farsunset%2Fnetty-http-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/farsunset%2Fnetty-http-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/farsunset","download_url":"https://codeload.github.com/farsunset/netty-http-server/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252533520,"owners_count":21763607,"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":[],"created_at":"2025-03-14T07:15:34.376Z","updated_at":"2025-05-05T16:29:29.081Z","avatar_url":"https://github.com/farsunset.png","language":"Java","funding_links":[],"categories":["Web服务器"],"sub_categories":["微服务框架"],"readme":"#### 使用介绍\n参见简书图文教程\n## [https://www.jianshu.com/p/89403b1b314d](https://www.jianshu.com/p/89403b1b314d)\n\n### 1启动 NettyServer\n```\n@Configuration\npublic class NettyHttpServer implements ApplicationListener\u003cApplicationStartedEvent\u003e {\n\n    private static final Logger LOGGER = LoggerFactory.getLogger(NettyHttpServer.class);\n\n    @Value(\"${server.port}\")\n    private int port;\n\n    @Resource\n    private InterceptorHandler interceptorHandler;\n\n    @Resource\n    private HttpServerHandler httpServerHandler;\n\n    @Override\n    public void onApplicationEvent(@NonNull ApplicationStartedEvent event) {\n\n        ServerBootstrap bootstrap = new ServerBootstrap();\n        EventLoopGroup bossGroup = new NioEventLoopGroup();\n        EventLoopGroup workerGroup = new NioEventLoopGroup();\n\n        bootstrap.group(bossGroup, workerGroup);\n        bootstrap.channel(NioServerSocketChannel.class);\n        bootstrap.childOption(NioChannelOption.TCP_NODELAY, true);\n        bootstrap.childOption(NioChannelOption.SO_REUSEADDR,true);\n        bootstrap.childOption(NioChannelOption.SO_KEEPALIVE,false);\n        bootstrap.childOption(NioChannelOption.SO_RCVBUF, 2048);\n        bootstrap.childOption(NioChannelOption.SO_SNDBUF, 2048);\n        bootstrap.childHandler(new ChannelInitializer\u003cSocketChannel\u003e() {\n            @Override\n            public void initChannel(SocketChannel ch) {\n                ch.pipeline().addLast(\"codec\", new HttpServerCodec());\n                ch.pipeline().addLast(\"aggregator\", new HttpObjectAggregator(512 * 1024));\n                ch.pipeline().addLast(\"logging\", new FilterLogginglHandler());\n                ch.pipeline().addLast(\"interceptor\", interceptorHandler);\n                ch.pipeline().addLast(\"bizHandler\", httpServerHandler);\n            }\n        })\n        ;\n        ChannelFuture channelFuture = bootstrap.bind(port).syncUninterruptibly().addListener(future -\u003e {\n            String logBanner = \"\\n\\n\" +\n                    \"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\\n\" +\n                    \"*                                                                                   *\\n\" +\n                    \"*                                                                                   *\\n\" +\n                    \"*                   Netty Http Server started on port {}.                         *\\n\" +\n                    \"*                                                                                   *\\n\" +\n                    \"*                                                                                   *\\n\" +\n                    \"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\\n\";\n            LOGGER.info(logBanner, port);\n        });\n        channelFuture.channel().closeFuture().addListener(future -\u003e {\n            LOGGER.info(\"Netty Http Server Start Shutdown ............\");\n            bossGroup.shutdownGracefully();\n            workerGroup.shutdownGracefully();\n        });\n    }\n\n}\n```\n\n### 2实现HttpHandler 也就是SpringMvc的Controller\n```\n@NettyHttpHandler(path = \"/hello/world\")\npublic class HelloWorldHandler implements IFunctionHandler\u003cString\u003e {\n\n    @Override\n    public Response\u003cString\u003e execute(NettyHttpRequest request) {\n         return Response.ok(\"Hello World\");\n    }\n}\n\n\n```\n\nPathVariable\n\n```\n@NettyHttpHandler(path = \"/moment/list/\",equal = false)\npublic class PathVariableHandler implements IFunctionHandler\u003cList\u003cHashMap\u003cString,String\u003e\u003e\u003e {\n    @Override\n    public Response\u003cList\u003cHashMap\u003cString,String\u003e\u003e\u003e execute(NettyHttpRequest request) {\n\n        /**\n         * 通过请求uri获取到path参数\n         */\n        String id = request.getStringPathValue(3);\n\n        List\u003cHashMap\u003cString,String\u003e\u003e list = new LinkedList\u003c\u003e();\n        HashMap\u003cString,String\u003e data = new HashMap\u003c\u003e();\n        data.put(\"id\",\"1\");\n        data.put(\"name\",\"Bluesky\");\n        data.put(\"text\",\"hello sea!\");\n        data.put(\"time\",\"2018-08-08 08:08:08\");\n        list.add(data);\n        return Response.ok(list);\n    }\n}\n\n```\n\nRequestBody\n\n```\n@NettyHttpHandler(path = \"/request/body\",method = \"POST\")\npublic class RequestBodyHandler implements IFunctionHandler\u003cString\u003e {\n    @Override\n    public Response\u003cString\u003e execute(NettyHttpRequest request) {\n        /**\n         * 可以在此拿到json转成业务需要的对象\n         */\n        String json = request.contentText();\n        return Response.ok(json);\n    }\n}\n\n```\n\n### 3执行请求查看效果\n![image.png](https://upload-images.jianshu.io/upload_images/2154278-752e5909766228df.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n\n![image.png](https://upload-images.jianshu.io/upload_images/2154278-4132dc17ef929834.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n\n\n#### 优缺点\n-------------------------------------------------------------------------------------------\n优点\n\n1 netty使用多路复用技术大幅提升性能\n\n2 减少web容器依赖，减少jar包体积\n\n3 灵活配置简单，适合所有需要提供restful接口的微服务应用\n\n4 完全按照springmvc的模式开发配置\n\n缺点\n\n1 还没能做到和spirng DispatcherServlet那么强大到支持各种规则的path配置\n\n2 获取各种参数还需要在controller里面通过HttpRequest来获取，没有springmvc自动注入参数方便\n\n有问题欢迎随时提issues. Thanks\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffarsunset%2Fnetty-http-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffarsunset%2Fnetty-http-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffarsunset%2Fnetty-http-server/lists"}