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啓動執行一次
插入:
隨機主鍵無緩存查詢