前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring boot如何集成resteasy-netty使用netty作为http服务器

spring boot如何集成resteasy-netty使用netty作为http服务器

作者头像
MickyInvQ
发布2021-02-04 10:06:17
1.9K0
发布2021-02-04 10:06:17
举报
文章被收录于专栏:InvQ的专栏InvQ的专栏

文章目录

背景

为什么底层要使用Netty? 在互联网公司中,对性能的要求一般都比较高,spring boot web 默认是Tomcat,但是Tomcat的I/O性能不如Netty。spring boot 默认的还有另外2个内嵌web容器。从源码中也可以看到

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

另外在spring boot启动的时候会初始化,会根据当前类型的来判断初始化的web容器类型。

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

然后在run方法中进行创建ApplicationContext的时候,根据webEnvironment字段来选择要创建的contextClass。

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

使用更换逻辑

引入pom依赖:

代码语言:javascript
复制
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-spring</artifactId>
            <version>3.1.0.Final</version>
        </dependency>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.6.Final</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-netty4</artifactId>   
            <version>3.1.0.Final</version>
        </dependency>

直接通过在自己写的starter中的META-INF下的spring-factories中,加入

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

因为@EnableAutoConfiguration 作用: 从classpath中搜索所有META-INF/spring.factories配置文件然后,将其中org.springframework.boot.autoconfigure.EnableAutoConfiguration key对应的配置项加载到spring容器 只有spring.boot.enableautoconfiguration为true(默认为true)的时候,才启用自动配置

@EnableAutoConfiguration还可以进行排除,排除方式有2中,一是根据class来排除(exclude),二是根据class name(excludeName)来排除 其内部实现的关键点有: ImportSelector 该接口的方法的返回值都会被纳入到spring容器管理中SpringFactoriesLoader 该类可以从classpath中搜索所有META-INF/spring.factories配置文件,并读取配置。

先看一下@EnableAutoConfiguration的定义:

代码语言:javascript
复制
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    /**
     * Exclude specific auto-configuration classes such that they will never be applied.
     * @return the classes to exclude
     */
    Class<?>[] exclude() default {};

    /**
     * Exclude specific auto-configuration class names such that they will never be
     * applied.
     * @return the class names to exclude
     * @since 1.3.0
     */
    String[] excludeName() default {};

}

注意这一行: @Import(AutoConfigurationImportSelector.class)

AutoConfigurationImportSelector实现了ImportSelector接口,并会在实例化时调用selectImports。下面是其方法:

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

这个方法中的getCandidateConfigurations会从类加载器中查找所有的META-INF/spring.factories,并加载其中实现了@EnableAutoConfiguration的类。

如果你一步一步追下去,你会发现,是在SpringApplication类的refreshContext方法的时候调用了上面的selectImports方法。

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

说回来,那么这个ResteasyAutoConfiguration,里面需要做什么呢? 1、封装ResteasyProviderFactory 和 ResourceMethodRegister,这两个都是jboss包下reastesy提供的

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

比如你可以在你想的项目中自定义自己的provider类,然后注册到resteasy的ProviderFactory中

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

2、实例化resteasy的SpringBeanProcessor,这个处理器会把任何加了@path或者@provier的bean注册到resteasy框架中。

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

3、实例化ApplicationListener的bean,并实现它的onApplicationEvent方法进行监听,在监听到上下文刷新的时候,将netty启动。

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

创建NettyJaxrsServer:

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

为什么呢? 因为SpringApplication.run方法中调用refreshContext方法,然后再调用refresh方法,其中该方法中的finishRefresh容器启动完成最后刷新,发布ContextRefreshedEvent事件。

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

执行finishRefresh方法发布ContextRefreshedEvent事件,标志的容器已经启动完成。

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-01-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 背景
  • 使用更换逻辑
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档