Netty实现类SpringMvcRestHttp服务器(完整代码在github上)
Github地址在最下面,正常使用的话可以无视server包,只关注controller,service和database即可,第一次请求比较耗时应该是netty的某些初始化之后正常,没加gitignore稍微有些不太干净…
主要运用的技术:
- Netty4.x
- Mybatis3
- guice
- druid
摘要
主要运用自定义注解,和反射完成参数与方法的映射,参数类型转换等,以Netty为基础框架,实现了基本的GET,POST,DELETE等请求方式,和文件上传,实现了@RequestMapping,@RequestBody,@RestController等使用,均以JSON格式进行响应,以Google的Guice框架完成Service到Controller的注入,持久层使用Mybatis,使用MybatisGeneratorMaven插件进行逆向生成Mapper和实体类,FastJson序列化,和lombok插件,使用alibabaDruid作为数据源,LogBack作为日志管理.打包方式为jar,通过mvn package打包,java - jar 运行即可
注解对比
SpringMVC | HttpNetty |
---|---|
@RequestMapping | @NettyRequestMapping |
@RequestBody | @NettyRequestBody |
@Controller | @NettyRestController |
@RequestParam | @NettyRequestParam |
Service注入方式
在GModel中绑定接口与实现类
public class GModel extends AbstractModule{
@Override
protected void configure() {
//接口 to 实现类
bind(UserService.class).to(UserServiceImpl.class).in(Scopes.SINGLETON);
}
}
在Controller或其他Service中使用如下方式注入
//需要注入的service
private UserService userService;
{
//通过注入器去拿到接口
userService = ServiceInjector.getService(UserService.class);
}
Mapper使用方式
首先是增删改,需要开启自动事务
@Override
public void save(TUser tUser) {
//获取自动提交事务
try(SqlSession sqlSession= SqlSessionUtils.openTransaction()) {
//直接get逆向生成的mapper类,调用其中的方法
TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);
mapper.insert(tUser);
}catch (Exception e){
e.printStackTrace();
}
}
然后是query,分为@Select注解形式,和使用逆向生成的Mapper两种(其实也可以手写XML)
@Override
public TUser findUserById(Integer id) {
//获取非自动提交事务
try(SqlSession sqlSession= SqlSessionUtils.openQuery()) {
TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);
TUser tUser = mapper.selectByPrimaryKey(id);
return tUser;
}catch (Exception e){
e.printStackTrace();
}
//返回NULL会给浏览器响应500
return null;
}
然后是注解形式,写在逆向生成的Mapper中就可以
@Select("select * from t_user where id = #{id}")
TUser findUser(@Param("id") Integer id);
配置文件在Netty.properties中
server.port=8080
db.driverClass=com.mysql.jdbc.Driver
db.connectionUrl=jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=utf-8&useSSL=false
db.userName=root
db.password=root
#controller包的相对路径 *代表通配符
controller.package=controller.*
下面贴上部分代码,和压测图
压测条件,1000线程10S启动执行一次
插入:
随机主键无缓存查询