# spring-boot-netty-http-web
**Repository Path**: tigershi123/spring-boot-netty-http-web
## Basic Information
- **Project Name**: spring-boot-netty-http-web
- **Description**: 本项目是基于netty4.x 实现的一个httpserver,支持NIO, EPOLL, IO_Uring 以及restful风格的mvc框架,适合所有需要提供restful接口的微服务应用, 实现与spring-boot无缝集成,注解化实现了返回requestbody为Json格式, 支持(requestbody , requestparameter, pathvalue)参数自动注入
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-06-04
- **Last Updated**: 2025-02-26
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# netty http server with spring boot
本项目是基于netty4.x 实现的一个http mvc server,支持NIO, EPOLL(linux os), IO_Uring(linux os) 以及restful风格的mvc框架,适合所有需要提供restful接口的微服务应用, 实现与spring-boot无缝集成,注解化实现了返回requestbody为Json格式, 支持(requestbody , requestparameter, pathvalue)参数自动注入 , restful-controller, interceptor, listener, exceptionHandler功能。
## 优点
* 使用注解配置简单,支持所有restful接口的微服务应用
* 支持HTTPS协议
* 支持使用注解实现路由方法
* 实现与spring-boot无缝集成
* netty使用多路复用技术大幅提升性能
* 减少web容器依赖,减少jar包体积
* 完全按照springmvc的模式开发配置相似,容易上手
* 支持支持各种规则的path配置
* 实现了参数注解和自动注入使用方便
* 支持epoll 和 io_uring
# 快速开始
## 先决条件
-------------
- JDK 8
- git
## 怎样得到代码及编译
```
git clone git@gitee.com:tigershi123/spring-boot-netty-http-web.git
cd spring-boot-netty-http-web
gradlew clean build
```
执行完上边的命令就可以看到gradle组织结构netty-http-server项目
* netty-mvc-web netty http sever及mvc核心代码,实现和springboot无缝集成
* netty-web-server-sample项目,使用netty-http-server项目的示例代码:
包括怎样使用注解实现restful风格接口contoller,怎样使用注解实现interceptor,listener,exceptionHandler
## 给项目添加依赖
maven
add repo
```
jitpack.io
https://jitpack.io
```
add dependency
```
com.gitee.tigershi123.spring-boot-netty-http-web
netty-mvc-web
v2.0.0
```
gradle
add repo
```
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
```
add dependency
```
implementation 'com.gitee.tigershi123.spring-boot-netty-http-web:netty-mvc-web:v2.0.0'
```
## 怎样使用restfulcontroller注解
### 基于java class的注解
```
@NettyRestController
public class TestNettyMvcController {
@NettyRequestMapping("/testErr")
public String testError() throws TestException{
throw TestModelExceptionHandlers.TEST_ERROR.vIPException();
//return "test error";
}
@NettyRequestMapping(value = "/testmodel", method=NettyHttpMethods.POST)
public TestModel abc( @NettyRequestBody TestModel test) {
test.setName("this is a test response");
test.setTest("test return is object");
return test;
}
@NettyRequestMapping(value = "/testpathval/{name}/{age}", method=NettyHttpMethods.POST)
public TestModel abc( @NettyPathVal(name="name") String name, @NettyPathVal(name="age")Integer age,
@NettyReqParam(name = "sex") Boolean sex,
@NettyReqParam(name = "phone") String phone,
@NettyReqParam(name = "grade") String grade
) {
TestModel test = new TestModel();
test.setName(name + age + phone+String.valueOf(sex));
test.setTest("test return is object+"+grade);
return test;
}
}
```
### 基于interface的注解
此方式比较适合微服务开发
```
public interface TestRequstMapInterfaceAPI {
@NettyRequestMapping(value = "/test")
public TestModel abc() ;
@NettyRequestMapping(value="/testStr")
public String abcStr();
}
@NettyRestController
public class TestRequstMapByInterfaceController implements TestRequstMapInterfaceAPI {
public TestModel abc() {
TestModel test = new TestModel();
test.setId(23);
test.setName("this is a test");
test.setTest("test return is object");
return test;
}
public String abcStr() {
return "this is a test";
}
}
```
## 如何使用interceptor
```
@NettyInterceptor
public class TestInterceptor implements NettyMvcInterceptor{
private static Logger logger = LoggerFactory.getLogger(TestInterceptor.class);
@Override
public void postHandle(NettyHttpRequest request, NettyHttpResponse response, Object responseObj) throws Exception {
// TODO Auto-generated method stub
logger.info("this is test the postHander interceptor");
}
@Override
public boolean isIterceptPath(String formatPath, NettyHttpRequest request) {
// TODO Auto-generated method stub
return true;
}
@Override
public void afterCompletion(NettyHttpRequest request, NettyHttpResponse response, Object responseObj, Exception ex)
throws Exception {
// TODO Auto-generated method stub
logger.info("this is test the afterCompletion interceptor");
}
@Override
public boolean preHandle(NettyHttpRequest request, NettyHttpResponse response) throws Exception {
// TODO Auto-generated method stub
logger.info("this is test the preHander interceptor");
return true;
}
}
```
## 如何使用listener
```
@NettyListener
public class TestListener implements NettyAppListener{
private static Logger logger = LoggerFactory.getLogger(TestListener.class);
@Override
public void created(NettyRestConfigures configure) {
// TODO Auto-generated method stub
logger.info("this is test the start TestListener");
}
@Override
public void destoryed(NettyRestConfigures configure) {
// TODO Auto-generated method stub
logger.info("this is test the stop TestListener");
}
}
```
## 如何使用exceptionHandler
```
@NettyMvcExceptionHandler
public class TestException extends NettyMvcException{
/**
*
*/
private static final long serialVersionUID = -368517557855937761L;
private static HttpResponseStatus status = new HttpResponseStatus(512, "bussiness ERROR");
private int errorCode = -1;
public TestException(String message, int errcode) {
super( message);
// TODO Auto-generated constructor stub
this.setErrorCode(errcode);
}
public TestException(int errcode, String message, Throwable cause) {
super(message, cause);
// TODO Auto-generated constructor stub
this.setErrorCode(errcode);
}
@Override
public String getMessage() {
// TODO Auto-generated method stub
return "Error Code: [" +getErrorCode()+ "] Error Message: " + super.getMessage();
}
@Override
public String getExceptionJsonMsg() {
// TODO Auto-generated method stub
StringBuilder sb = new StringBuilder();
sb.append("{");
sb.append("\"errCode\":");
sb.append(getErrorCode());
sb.append(", \"message\":");
sb.append("\"");
sb.append("[Netty Test Server] ");
sb.append(super.getMessage());
sb.append("\"");
sb.append(", \"timestamp\":");
sb.append(System.currentTimeMillis());
sb.append("}");
return sb.toString();
}
@Override
public HttpResponseStatus getResponseStatus() {
// TODO Auto-generated method stub
return status;
}
public int getErrorCode() {
return errorCode;
}
public void setErrorCode(int errorCode) {
this.errorCode = errorCode;
}
}
```
##运行netty-web-server-sample项目
```
运行netty-web-server-sample\src\main\java\io\netty\springboot\sample\TestAppBoot.java 类
就可以运行sample项目
```
在浏览器的地址是:
> https://localhost:8099
具体的如何应用请参考netty-web-server-sample项目
有问题欢迎随时提issues.
Thanks