首页 > 其他分享 >SOFABoot 入门及基本使用

SOFABoot 入门及基本使用

时间:2024-10-14 15:34:11浏览次数:6  
标签:基本 异步 入门 初始化 Spring Boot SOFABoot 方法

1.前言

SOFABoot是蚂蚁金服开源的基于 Spring Boot 的研发框架,它在 Spring Boot 的基础上,提供了诸如 Readiness Check,类隔离,日志空间隔离等能力。在增强了 Spring Boot 的同时,SOFABoot 提供了让用户可以在 Spring Boot 中非常方便地使用 SOFA 中间件的能力。阿里官方文档

由于是基于Spring Boot 开发,故与其有着版本对应关系,SOFABoot 3.x 系列版本将构建在 Spring Boot 2.x 基础之上,SOFABoot 4.x 系列版本将构建在 Spring Boot 3.x 基础之上。

注:本文以SOFABoot 3.17.0 和 Spring Boot 2.7.8 (maven 3.8.8)为例进行说明!

2.快速开始

 为了能顺利拉取jar包,需要先配置本地maven,在setting.xml 文件增加如下 profile 配置:

<profile>
    <id>default</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <repositories>
        <repository>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
            <id>maven-snapshot</id>
            <url>https://oss.sonatype.org/content/repositories/snapshots</url>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
            <id>maven-snapshot</id>
            <url>https://oss.sonatype.org/content/repositories/snapshots</url>
        </pluginRepository>
    </pluginRepositories>
</profile>

首先新建一个SpringBoot的项目,我以阿里云源进行创建,创建后在依赖管理中用 SOFABoot 替换SpringBoot的版本

 

<dependency>
    <groupId>com.alipay.sofa</groupId>
    <artifactId>sofaboot-dependencies</artifactId>
    <version>${sofa.boot.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

其中sofa版本如下

 接着引入SOFABoot 健康检查扩展能力的依赖及 Web 依赖(方便查看健康检查结果)

<dependency>
    <groupId>com.alipay.sofa</groupId>
    <artifactId>healthcheck-sofa-boot-starter</artifactId>
</dependency>

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
</dependency>

在配置目录中新增配置文件 application.properties 文件,添加 SOFABoot 工程常用的参数配置,其中 spring.application.name 是必需的参数,用于标示当前应用的名称;logging path 用于指定日志的输出目录。

spring.application.name=SOFABoot Demo
logging.path=./logs

最后直接在启动类上运行main方法,启动成功后在浏览器访问 http://localhost:8080/actuator/versions 来查看当前 SOFABoot 中使用 Maven 插件生成的版本信息汇总。如果是SOFABoot 4.x 则需要把路径替换为  /sofaboot/versions 

在浏览器输入 http://localhost:8080/actuator/readiness 查看应用 Readiness Check 的状况。如果是SOFABoot 4.x 则需要把路径替换为  /health/readiness 

 status: "UP" 表示应用 Readiness Check 健康的。

另外也可以查看日志,由于上述配置了日志文件的目录是项目目录下,故打开可以看到有个log目录,里面的结构如下

自此SOFABoot 集成和启动就完成了。

但是,它具体有何用,目前还未体现出来,下面进行说明。

3.启动加速

在实际使用 Spring/Spring Boot 开发中,会有一些 Bean 在初始化过程中执行准备操作,如拉取远程配置、初始化数据源等等。在应用启动期间,这类 Bean 会增加 Spring 上下文刷新时间,导致应用启动耗时变长。

为了加速应用启动,SOFABoot 通过配置可选项,将 Bean 的初始化方法(init-method) 使用单独线程异步执行,加快 Spring 上下文加载过程,提高应用启动速度。那么是如何去做的?

先来demo

首先是两个类,分别有两个初始化的方法(有延迟),然后手动方式注入到Spring

 启动后查看启动时间

 这是正常逻辑下的bean注入,没有问题对吧。下面就模拟在启动过程中有耗时操作(这里就指定初始化的方法)

 重启后再次查看日志,有初始化的打印日志,并且时间都9S多,这是在情理之中的,因为 Bean 的初始化动作是串行的,3S+5S,再加系统自带的启动时间

 如果一个大型项目启动过程中有大量的耗时操作,那么按照这种方式是不是启动非常缓慢。而Sofa Boot就解决了这个问题,其实逻辑很简单,就是将上述Bean 串行初始化改为并行异步。

如果使用呢?在注入bean时添加注解@SofaAsyncInit,再次启动观察日志

 是不是很神奇,只是简单加了个注解,就减少了启动的时间。

再看初始化方法的日志,发现并不是使用的main线程,而是其他线程执行的,且是并行

看起来是不是非常简单,在实际场景中可有效的加快启动时间。但是,它也有弊端,就像上面的两个类的init方法,需要手动在这种初始化耗时的方法上添加注解@SofaAsyncInit,也就是说需要我们开发人员去判断哪些类是可以异步初始化的。

用法讲完了,下一步就是啃原理了,进入注解 @SofaAsyncInit  ,下载源码

com.alipay.sofa.runtime.api.annotation.SofaAsyncInit

这个注解也只有一个value属性,默认值是true,根据注释是说为true时才对初始化的方法进行异步调用

 通过点击这个value(),可以看到只有一个地方调用

 进入这个类,

com.alipay.sofa.runtime.spring.AsyncInitBeanFactoryPostProcessor#registerAsyncInitBea

可以看出在异步初始化的方法中只有value属性为true时才调用 registerAsyncInitBean()  ,和上面的注释不谋而合。

 那么这个方法 registerAsyncInitBean() 是干啥的?

com.alipay.sofa.runtime.spring.async.AsyncInitBeanHolder

这个类中有一个map和两个方法

 其中map看起来应该是存储bean的,那么究竟存储的数据是什么格式?打断点后重启项目

 原来它是以模块进行区分,内层的map即为bean名称和初始化的方法名。也就是说这个方法就是把模块与bean名称和初始化的方法名放入map。方法 registerAsyncInitBean() 是放入,那么什么时候来取这个对应关系?那就是 getAsyncInitMethodName() 的作用,稍后再看。

那么如何知道哪些类的方法在初始化时需要异步?那肯定是标记了 @SofaAsyncInit 注解的方法,既然如此,我们来看有哪些类引入了此注解。可以看出,除了我们自己使用外,只有 AsyncInitBeanFactoryPostProcessor  这个类引入了

进入这个类

com.alipay.sofa.runtime.spring.AsyncInitBeanFactoryPostProcessor

 

 其他代码无需关注,只从L45开始阅读,是走if分支还是else?不知道就打断点看执行过程,可以看出都会执行L145的if的分支,而在if分支里面就是获取@SofaAsyncInit 注解,然后调用 registerAsyncInitBean() ,而这个方法是不是在哪见过

这就和上述的value判断串起来了。

 下面来看 getAsyncInitMethodName() 的作用,通过调用可以看到在AsyncProxyBeanPostProcessor类中

com.alipay.sofa.runtime.spring.AsyncProxyBeanPostProcessor

会从map中获取方法名并传入类AsyncInitializeBeanMethodInvoker

 那么AsyncInitializeBeanMethodInvoker是干啥的,继续看

此类定义了几个参数,重要看下面三个 

  • initCountDownLatch:CountDownLatch 对象,其中 count 初始化为 1
  • isAsyncCalling:表示是否正在异步执行 init 方法。
  • isAsyncCalled:表示是否已经异步执行过 init 方法。

那么是否可以推测通过这几个字段就可以判断一个bean是否已经执行或正在执行初始化方法?由于此类实现了MethodInterceptor接口,我们看起invoke(),

其中L121~L143的if分支,逻辑是什么?即没有异步执行初始化bean的init方法并且是异步的方法,那么就会放入线程池去执行。

如果不满足if,那就是后续的逻辑。不满足的条件是什么?可能是正在初始化或者已经初始化过了,那么这种情况下也不会重复把初始化丢入线程池去执行,也就是一个异步执行bean的初始化方法只会执行一次。

如此来看,加速bean初始化是不是还是比较简单。

 

其他功能待续

 

参考https://www.cnblogs.com/thisiswhy/p/17457499.html

 

标签:基本,异步,入门,初始化,Spring,Boot,SOFABoot,方法
From: https://www.cnblogs.com/zys2019/p/18455748

相关文章

  • 大模型AI产品经理学习路线,2024最新,从零基础入门到精通,非常详细收藏我这一篇
    随着人工智能技术的发展,尤其是大模型(LargeModel)的兴起,越来越多的企业开始重视这一领域的投入。作为大模型产品经理,你需要具备一系列跨学科的知识和技能,以便有效地推动产品的开发、优化和市场化。以下是一份详细的大模型产品经理学习路线,旨在帮助你构建所需的知识体系,从零基......
  • 入行网络安全需要学习哪些知识点?白帽子佬都给你汇总在这里,一文全懂_网络安全入门应该
    都说IT互联网行业吃香,那么如何才能高效入行,习得一技之长换取心仪offer?一般来说,0基础小白想入行到网络安全行业,按照如下学习逻辑肯定是错不了的:一、基础知识掌握1、计算机基础知识:理解计算机体系结构、操作系统、网络通信等基础知识,这是进入网络安全领域的基础。2、网络......
  • aardio入门到精通05-名字空间
    名字空间importconsole;/*名字空间组织、归类、标识一组具名对象的名字,是模块化编程的重要基础。1.var定义的局部变量有保护变量的作用,其它文件不能调用2.成员变量是名字空间里的变量,加前缀名字空间名来访问,在全局名字空间里可以不加前缀名字空间名3.不同的名字空间,相......
  • 神仙级AI大模型入门教程(非常详细),从零基础入门到精通,从看这篇开始!
    一.初聊大模型1.为什么要学习大模型?在学习大模型之前,你不必担心自己缺乏相关知识或认为这太难。我坚信,只要你有学习的意愿并付出努力,你就能够掌握大模型,并能够用它们完成许多有意义的事情。在这个快速变化的时代,虽然新技术和概念不断涌现,但希望你能静下心来,踏实地学习。一旦......
  • mybatis入门案例-传参类型和方式
    mybatis传参类型和方式主要分享一下mybatis的mapper接口参数类型和传参方式,适用于初学者。直接上代码:pom.xml文件<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-insta......
  • Linux系统之ipcalc命令的基本使用
    (Linux系统之ipcalc命令的基本使用)一、ipcalc命令介绍ipcalc命令是一个用于计算和显示IP地址和子网掩码相关信息的工具。它可以帮助用户快速计算出IP地址、子网掩码、网络地址、广播地址等信息。二、ipcalc命令的使用帮助2.1ipcalc命令的help帮助信息使用--help,查询ipca......
  • K8s-实战入门-ns、pod、label、deployment
    一、 Namespace(ns)Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分......
  • AI绘画StableDiffusion零基础入门,轻松制作你的赛博Coser,SD图生图全网最强指南
    AI绘画因“赛博Coser”事件大规模破圈,以前只在二次元中存在的角色变成栩栩如生的真人跃出画面,你是否好奇这些老婆们是怎么画出来的?缘起:赛博Coser事件AI绘画第一次大规模破圈源于早前科技博主“勘云工造”使用AI技术创作的一系列作品。他训练的“赛博Coser”......
  • AI绘画StableDiffusion零基础入门—文生图:全面解析AI绘画中提示词的妙用和各种语法,Pro
    AI绘画的一个必不可少的环节就是告诉AI描述画面的Prompt(提示词),但是这种很长很乱、穿插着各种奇怪的数字符号、高深莫测的提示词,究竟在说着什么?难道真的是咒语吗?魔法?咒语?你绝对不曾想到,有生之年竟然能迎来这么一个奇迹时代:画画竟然还能用魔法,岂不是只要会念咒、人人都......
  • AI绘画SD零基础入门到精通教程,新手小白AI扫盲教程,一文搞懂MIdjourney和StableDiffusio
    大家好,我是强哥Midjourney是目前全网最强大的AI绘画平台,用户只需要简单地输入关键词描述,就能获得多幅风格各异的绘画作品,无需任何专业的绘画技能,即刻拥有让人惊叹的艺术创造力。在MidjourneyV5版本之前,用户可以享受免费使用额度,只需要注册一个账户即可在线体验AI绘画。......