Netty实现SpringBoot服务器

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.*

下面贴上部分代码,和压测图
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190816150440173.png
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

压测条件,1000线程10S启动执行一次

插入:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

随机主键无缓存查询

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

CLICK ME TO GIT HUB

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章