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 运行即可

注解对比

SpringMVCHttpNetty
@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
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

CLICK ME TO GIT HUB

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 SpringBoot 整合 Netty 实现 TCP 服务器可以让我们更方便地管理和部署我们的应用程序。下面是一些基本的步骤: 1. 创建一个 SpringBoot 项目,并添加 Netty 和相应的依赖。 2. 创建一个 Netty 服务类,实现 ChannelInboundHandlerAdapter 接口。在这个类中,你可以实现接收、处理和发送 TCP 消息的逻辑。 3. 通过 SpringBoot 的配置文件,配置 Netty 服务器的端口和其他参数。 4. 在 SpringBoot 的启动类中,使用 @Bean 注解将 Netty 服务类注册为 bean。 5. 启动 SpringBoot 应用程序,Netty 服务器将开始监听传入的连接。 下面是一个简单的示例: ``` // 服务类 @Component public class MyNettyServer extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { // 处理接收到的消息 ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); // 返回响应消息 String response = "Hello, " + message; ctx.writeAndFlush(Unpooled.copiedBuffer(response.getBytes())); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { // 处理异常 cause.printStackTrace(); ctx.close(); } } // 启动类 @SpringBootApplication public class MyApplication { @Autowired private MyNettyServer myNettyServer; @Value("${netty.port}") private int port; @PostConstruct public void start() throws Exception { // 创建 EventLoopGroup EventLoopGroup group = new NioEventLoopGroup(); try { // 创建 ServerBootstrap ServerBootstrap b = new ServerBootstrap(); b.group(group) .channel(NioServerSocketChannel.class) .localAddress(new InetSocketAddress(port)) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { // 添加处理器 ch.pipeline().addLast(myNettyServer); } }); // 启动服务器 ChannelFuture f = b.bind().sync(); f.channel().closeFuture().sync(); } finally { // 关闭 EventLoopGroup group.shutdownGracefully().sync(); } } public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } // 配置文件 netty.port=8080 ``` 在这个例子中,我们创建了一个名为 `MyNettyServer` 的服务类,并实现了 `ChannelInboundHandlerAdapter` 接口。在 `channelRead` 方法中,我们处理接收到的消息,并返回响应消息。在 `exceptionCaught` 方法中,我们处理异常。 在启动类中,我们使用 `@Autowired` 注解将 `MyNettyServer` 注入到启动类中,并使用 `@Value` 注解获取配置文件中的端口号。在 `start` 方法中,我们创建了一个 `EventLoopGroup`,并使用 `ServerBootstrap` 创建了一个 Netty 服务器。然后,我们将 `MyNettyServer` 添加到 `SocketChannel` 的处理器中。最后,我们启动服务器,并在关闭服务器之前等待连接。 这只是一个简单的示例,你可以根据你的需求修改和扩展它。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值