返回顶部
首页 > 资讯 > 精选 >Netty中Redant怎么用
  • 775
分享到

Netty中Redant怎么用

2023-06-04 08:06:21 775人浏览 薄情痞子
摘要

这篇文章主要介绍了Netty中Redant怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。快速启动Redant 是一个基于 Netty 的 WEB 容器,类似 Tomca

这篇文章主要介绍了Netty中Redant怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

快速启动

Redant 是一个基于 Netty 的 WEB 容器,类似 Tomcat 和 WebLogic 等容器

只需要启动一个 Server,默认的实现类是 Nettyhttpserver 就能快速启动一个 web 容器了,如下所示:

public final class ServerBootstrap {    public static void main(String[] args) {        Server nettyServer = new NettyHttpServer();        // 各种初始化工作        nettyServer.preStart();        // 启动服务器        nettyServer.start();    }}

我们可以直接启动 redant-example 模块中的 ServerBootstrap 类,因为 redant-example 中有很多示例的 Controller,我们直接运行 example 中的 ServerBootstrap,启动后你会看到如下的日志信息:

Netty中Redant怎么用

在 redant-example 模块中,内置了以下几个默认的路由:

Netty中Redant怎么用

启动成功后,可以访问 http://127.0.0.1:8888/ 查看效果,如下图所示:

Netty中Redant怎么用

如果你可以看到 "Welcome to redant!" 这样的消息,那就说明你启动成功了。

自定义路由

框架实现了自定义路由,通过 @Controller @Mapping 注解就可以唯一确定一个自定义路由。如下列的 UserController 所示:

Netty中Redant怎么用

spring 的使用方式一样,访问 /user/list 来看下效果,如下图所示:

Netty中Redant怎么用

结果渲染

目前支持 JSONhtml、xml、text 等类型的结果渲染,用户只需要在 方法的 @Mapping 注解上通过 renderType 来指定具体的渲染类型即可,如果不指定的话,默认以 json 类型范围。

如下图所示,首页就是通过指定 renderType 为 html 来返回一个 html 页面的:

Netty中Redant怎么用

ioc容器

从 UserController 的代码中,我们看到 userServerce 对象是通过 @Autowired 注解自动注入的,这个功能是任何一个 ioC 容器基本的能力,下面我们来看看如何实现一个简单的 IOC 容器。

首先定义一个 BeanContext 接口,如下所示:

public interface BeanContext {        Object getBean(String name);        <T> T getBean(String name,Class<T> clazz);}

然后我们需要在系统启动的时候,扫描出所有被 @Bean 注解修饰的类,然后对这些类进行实例化,然后把实例化后的对象保存在一个 Map 中即可,如下图所示:

Netty中Redant怎么用

代码很简单,通过在指定路径下扫描出所有的类之后,把实例对象加入map中,但是对于已经加入的 bean 不能继续加入了,加入之后要获取一个 Bean 也很简单了,直接通过 name 到 map 中去获取就可以了。

现在我们已经把所有 @Bean 的对象管理起来了,那对于依赖到的其他的 bean 该如何注入呢,换句话说就是将我们实例化好的对象赋值给 @Autowired 注解修饰的变量。

简单点的做法就是遍历 beanMap,然后对每个 bean 进行检查,看这个 bean 里面的每个 setter 方法和属性,如果有 @Autowired 注解,那就找到具体的 bean 实例之后将值塞进去。

setter注入

Netty中Redant怎么用

field注入

Netty中Redant怎么用

通过Aware获取BeanContext

BeanContext 已经实现了,那怎么获取 BeanContext 的实例呢?想到 Spring 中有很多的 Aware 接口,每种接口负责一种实例的回调,比如我们想要获取一个 BeanFactory 那只要将我们的类实现 BeanFactoryAware 接口就可以了,接口中的 setBeanFactory(BeanFactory factory) 方法参数中的 BeanFactory 实例就是我们所需要的,我们只要实现该方法,然后将参数中的实例保存在我们的类中,后续就可以直接使用了。

那现在我就来实现这样的功能,首先定义一个 Aware 接口,所有其他需要回调塞值的接口都继承自该接口,如下所示:

  1. public interface Aware {

  2. }

  3. public interface BeanContextAware extends Aware{

  4.    

  5.    void setBeanContext(BeanContext beanContext);

  6. }

接下来需要将 BeanContext 的实例注入到所有 BeanContextAware 的实现类中去。BeanContext 的实例很好得到,BeanContext 的实现类本身就是一个 BeanContext 的实例,并且可以将该实例设置为单例,这样的话所有需要获取 BeanContext 的地方都可以获取到同一个实例。

拿到 BeanContext 的实例后,我们就需要扫描出所有实现了 BeanContextAware 接口的类,并实例化这些类,然后调用这些类的 setBeanContext 方法,参数就传我们拿到的 BeanContext 实例。

逻辑理清楚之后,实现起来就很简单了,如下图所示:

Netty中Redant怎么用

Cookie管理

基本上所有的 web 容器都会有 cookie 管理的能力,那我们的 redant 也不能落后。首先定义一个 CookieManager 的接口,核心的操作 cookie 的方法如下:

  1. public interface CookieManager {

  2.    Set<Cookie> getCookies();

  3.    Cookie getCookie(String name);

  4.    void addCookie(String name,String value);

  5.    void setCookie(Cookie cookie);

  6.    boolean deleteCookie(String name);

  7. }

其中我只列举了几个核心的方法,另外有一些不同参数的重载方法,这里就不详细介绍了。最关键的是两个方法,一个是读 Cookie 一个是写 Cookie 。

读 Cookie

Netty 中是通过 HttpRequest 的 Header 来保存请求中所携带的 Cookie的,所以要读取 Cookie 的话,最关键的是获取到 HttpRequest。而 HttpRequest 可以在 ChannelHandler 中拿到,通过 HttpServerCodec 编解码器,Netty 已经帮我们把请求的数据转换成 HttpRequest 了。但是这个 HttpRequest 只在 ChannelHandler 中才能访问到,而处理 Cookie 通常是用户自定义的操作,并且对用户来说他是不关心 HttpRequest 的,他只需要通过 CookieManager 去获取一个 Cookie 就行了。

这种情况下,最适合的就是将 HttpRequest 对象保存在一个 ThreadLocal 中,在 CookieManager 中需要获取的时候,直接到 ThreadLocal 中去取出来就可以了,如下列代码所示:

@Overridepublic Set<Cookie> getCookies() {    HttpRequest request = TemporaryDataHolder.loadHttpRequest();    Set<Cookie> cookies = new HashSet<>();    if(request != null) {        String value = request.headers().get(HttpHeaderNames.COOKIE);        if (value != null) {            cookies = ServerCookieDecoder.STRICT.decode(value);        }    }    return cookies;}

TemporaryDataHolder 就是那个通过 ThreadLocal 保存了 HttpRequest 的类。

写 Cookie

写 Cookie 和读 Cookie 面临着一样的问题,就是写的时候需要借助于 HttpResponse,将 Cookie 写入 HttpResponse 的 Header 中去,但是用户执行写 Cookie 操作的时候,根本就不关心 HttpResponse,甚至他在写的时候,还没有 HttpResponse。

这时的做法也是将需要写到 HttpResponse 中的 Cookie 保存在 ThreadLocal 中,然后在最后通过 channel 写响应之前,将 Cookie 拿出来塞到 HttpResponse 中去即可,如下列代码所示:

  1. @Override

  2. public void setCookie(Cookie cookie) {

  3.    TemporaryDataHolder.storeCookie(cookie);

  4. }

  5. private void writeResponse(){

  6.    boolean close = isClose();

  7.    response.headers().add(HttpHeaderNames.CONTENT_LENGTH, String.valueOf(response.content().readableBytes()));

  8.    // 从ThreadLocal中取出待写入的cookie

  9.    Set<Cookie> cookies = TemporaryDataHolder.loadCookies();

  10.    if(!CollectionUtil.isEmpty(cookies)){

  11.        for(Cookie cookie : cookies){

  12.            // 将cookie写入response中

  13.            response.headers().add(HttpHeaderNames.SET_COOKIE, ServerCookieEncoder.STRICT.encode(cookie));

  14.        }

  15.    }

  16.    ChannelFuture future = channel.write(response);

  17.    if(close){

  18.        future.addListener(ChannelFutureListener.CLOSE);

  19.    }

  20. }

拦截器

拦截器是一个框架很重要的功能,通过拦截器可以实现一些通用的工作,比如登录鉴权,事务处理等等。记得在 Servlet 的年代,拦截器是非常重要的一个功能,基本上每个系统都会在 web.xml 中配置很多的拦截器。

拦截器的基本思想是,通过一连串的类去执行某个拦截的操作,一旦某个类中的拦截操作返回了 false,那就终止后面的所有流程,直接返回。

这种场景非常适合用责任链模式去实现,而 Netty 的 pipeline 本身就是一个责任链模式的应用,所以我们就可以通过 pipeline 来实现我们的拦截器。这里我定义了两种类型的拦截器:前置拦截器和后置拦截器。

前置拦截器是在处理用户的业务逻辑之前的一个拦截操作,如果该操作返回了 false 则直接 return,不会继续执行用户的业务逻辑。

后置拦截器就有点不同了,后置拦截器主要就是处理一些后续的操作,因为后置拦截器再跟前置拦截器一样,当操作返回了 false 直接 return 的话,已经没有意义了,因为业务逻辑已经执行完了。

理解清楚了具体的逻辑之后,实现起来就很简单了,如下列代码所示:

前置拦截器

Netty中Redant怎么用

后置拦截器

Netty中Redant怎么用

有了实现之后,我们需要把他们加到 pipeline 中合适的位置,让他们在整个责任链中生效,如下图所示:

Netty中Redant怎么用

指定拦截器的执行顺序

目前拦截器还没有实现指定顺序执行的功能,其实也很简单,可以定义一个 @InterceptorOrder 的注解应用在所有的拦截器的实现类上,扫描到拦截器的结果之后,根据该注解进行排序,然后把拍完序之后的结果添加到 pipeline 中即可。

集群模式

到目前为止,我描述的都是单节点模式,如果哪一天单节点的性能无法满足了,那就需要使用集群了,所以我也实现了集群模式。

集群模式是由一个主节点和若干个从节点构成的。主节点接收到请求后,将请求转发给从节点来处理,从节点把处理好的结果返回给主节点,由主节点把结果响应给请求。

要想实现集群模式需要有一个服务注册和发现的功能,目前是借助于 Zk 来做的服务注册与发现。

准备一个 Zk 服务端

因为主节点需要把请求转发给从节点,所以主节点需要知道目前有哪些从节点,我通过 ZooKeeper 来实现服务注册与发现。

如果你没有可用的 Zk 服务端的话,那你可以通过运行下面的 Main 方法来启动一个 ZooKeeper 服务端:

  1. public final class ZkBootstrap {

  2.    private static final Logger LOGGER = LoggerFactory.getLogger(ZkBootstrap.class);

  3.    public static void main(String[] args) {

  4.        try {

  5.            ZkServer zkServer = new ZkServer();

  6.            zkServer.startStandalone(ZkConfig.DEFAULT);

  7.        }catch (Exception e){

  8.            LOGGER.error("ZkBootstrap start failed,cause:",e);

  9.            System.exit(1);

  10.        }

  11.    }

  12. }

这样你就可以在后面启动主从节点的时候使用这个 Zk 了。但是这并不是必须的,如果你已经有一个正在运行的 Zk 的服务端,那么你可以在启动主从节点的时候直接使用它,通过在 main 方法的参数中指定 Zk 的地址即可。

启动主节点

只需要运行下面的代码,就可以启动一个主节点了:

  1. public class MasterServerBootstrap {

  2.    public static void main(String[] args) {

  3.        String zkAddress = ZkServer.getZkAddressArgs(args,ZkConfig.DEFAULT);

  4.        // 启动MasterServer

  5.        Server masterServer = new MasterServer(zkAddress);

  6.        masterServer.preStart();

  7.        masterServer.start();

  8.    }

  9. }

如果在 main 方法的参数中指定了 Zk 的地址,就通过该地址去进行服务发现,否则会使用默认的 Zk 地址。

启动从节点

只需要运行下面的代码,就可以启动一个从节点了:

  1. public class SlaveServerBootstrap {

  2.    public static void main(String[] args) {

  3.        String zkAddress = ZkServer.getZkAddressArgs(args,ZkConfig.DEFAULT);

  4.        node node = Node.getNodeWithArgs(args);

  5.        // 启动SlaveServer

  6.        Server slaveServer = new SlaveServer(zkAddress,node);

  7.        slaveServer.preStart();

  8.        slaveServer.start();

  9.    }

  10. }

如果在 main 方法的参数中指定了 Zk 的地址,就通过该地址去进行服务注册,否则会使用默认的 Zk 地址。

实际上多节点模式具体的处理逻辑还是复用了单节点模式的核心功能,只是把原本一台实例扩展到多台实例而已。

感谢你能够认真阅读完这篇文章,希望小编分享的“Netty中Redant怎么用”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: Netty中Redant怎么用

本文链接: https://lsjlt.com/news/236999.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Netty中Redant怎么用
    这篇文章主要介绍了Netty中Redant怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。快速启动Redant 是一个基于 Netty 的 Web 容器,类似 Tomca...
    99+
    2023-06-04
  • netty中的frame解码器怎么用
    这篇文章主要介绍“netty中的frame解码器怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“netty中的frame解码器怎么用”文章能帮助大家解决问题。简介netty中的数据是通过Byte...
    99+
    2023-06-30
  • netty的怎么实现及运用到gmq中
    本篇内容主要讲解“netty的怎么实现及运用到gmq中”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“netty的怎么实现及运用到gmq中”吧! 一、背景 书...
    99+
    2024-04-02
  • netty中常用的xml编码解码器怎么用
    这篇文章主要讲解了“netty中常用的xml编码解码器怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“netty中常用的xml编码解码器怎么用”吧!简介在json之前,xml是最常用的数...
    99+
    2023-06-30
  • Springboot中怎么用Netty开启UDP服务方式
    这篇文章主要介绍了Springboot中怎么用Netty开启UDP服务方式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。NettyNetty是一种提供网络编程的工具,是对so...
    99+
    2023-06-25
  • 怎么在Netty中注解使用Service或者Mapper
    这篇文章主要介绍了怎么在Netty中注解使用Service或者Mapper,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Netty注解使用Service或MapperSpri...
    99+
    2023-06-29
  • 怎么用Springboot和Netty实现rpc
    这篇文章主要介绍“怎么用Springboot和Netty实现rpc”,在日常操作中,相信很多人在怎么用Springboot和Netty实现rpc问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Spring...
    99+
    2023-06-29
  • Netty分布式ByteBuf怎么使用命中缓存分配
    今天小编给大家分享一下Netty分布式ByteBuf怎么使用命中缓存分配的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。分析先...
    99+
    2023-06-29
  • Netty-在-Dubbo-中如何应用
    前言众所周知,国内知名框架 Dubbo 底层使用的是 Netty 作为网络通信,那么内部到底是如何使用的呢?今天我们就来一探究竟。 dubbo 的 Consumer 消费者如何使用 Netty注意:此次代码使用了从 github 上 clo...
    99+
    2023-06-05
  • Netty分布式FastThreadLocal的set方法怎么用
    本文小编为大家详细介绍“Netty分布式FastThreadLocal的set方法怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Netty分布式FastThreadLocal的set方法怎么用”文章能帮助大家解决疑惑,下面跟着小编的...
    99+
    2023-06-29
  • 怎么用SpringBoot+Netty实现简单聊天室
    本篇内容主要讲解“怎么用SpringBoot+Netty实现简单聊天室”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用SpringBoot+Netty实现简单聊天室”吧!一、实现1.User...
    99+
    2023-06-29
  • 怎么理解Netty、Kafka中的零拷贝技术
    本篇内容介绍了“怎么理解Netty、Kafka中的零拷贝技术”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2024-04-02
  • netty中spring对象注入失败怎么解决
    本文小编为大家详细介绍“netty中spring对象注入失败怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“netty中spring对象注入失败怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。net...
    99+
    2023-06-29
  • Java中的netty原理是什么
    一、 Netty简介Netty是一个高性能、异步事件驱动的NIO框架,基于JAVA NIO提供的API实现。它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Lis...
    99+
    2020-04-09
    java教程 java netty 原理
  • Java中的Netty缓冲区的用法
    这篇文章主要介绍“Java中的Netty缓冲区的用法”,在日常操作中,相信很多人在Java中的Netty缓冲区的用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的Netty缓冲区的用法”的疑惑有所...
    99+
    2023-06-16
  • 如何在PHP中使用Netty函数
    Netty是一个高性能的网络编程框架,可以用于构建稳定、灵活的网络应用程序,而PHP则是一种流行的服务器端脚本语言,被广泛应用于Web开发。在本文中,我们将介绍如何在PHP中使用Netty函数。安装Java和Netty在使用Netty之前,...
    99+
    2023-05-18
    函数 PHP netty
  • 怎么用Netty编写一个服务端程序
    本篇内容主要讲解“怎么用Netty编写一个服务端程序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Netty编写一个服务端程序”吧!1.编写一个Serve...
    99+
    2024-04-02
  • 怎么用MINA、Netty、Twisted来实现消息分割
    这篇文章主要介绍了怎么用MINA、Netty、Twisted来实现消息分割,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。本文介绍一种消息分割方式,use a fixed le...
    99+
    2023-06-03
  • 怎么开发基于Netty的HTTP/HTTPS应用程序
    这篇文章主要介绍“怎么开发基于Netty的HTTP/HTTPS应用程序”,在日常操作中,相信很多人在怎么开发基于Netty的HTTP/HTTPS应用程序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么开发基...
    99+
    2023-06-20
  • Springboot中用 Netty 开启UDP服务方式
    目录Netty新建一个springboot项目。在pom中引入jar创建NettyUDPServerNettyUdpSimpleChannelInboundHandler修改启动类,...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作