SOFABoot 是蚂蚁金服开源的基于 Spring Boot 的研发框架,它在 Spring Boot 的基础上,提供了诸如 Readiness Check,类隔离,日志空间隔离等等能力。在增强了 Spring Boot 的同时,SOFABoot 提供了让用户可以在 Spring Boot 中非常方便地使用 SOFAStack 相关中间件的能力。
Spring Boot 是一个非常优秀的开源框架,可以非常方便地就构建出一个基于 Spring 的应用程序,但是在使用过程中,还是会遇到一些问题:
为了解决以上的问题,又因为 SOFAStack 中的诸多中间件本身就需要集成 Spring Boot,所以蚂蚁金服基于 Spring Boot 开发并开源了 SOFABoot,来解决以上的问题,也方便使用者在 Spring Boot 中方便地去使用 SOFAStack 中间件。
为了解决 Spring Boot 在实施大规模微服务架构时候的问题,SOFABoot 提供了以下的能力:
针对 Spring Boot 缺少 Readiness Check 能力的情况,SOFABoot 增加了 Spring Boot 现有的健康检查的能力,提供了 Readiness Check 的能力。利用 Readiness Check 的能力,SOFAStack 下各种中间件只有在 Readiness Check 通过之后,才将流量引入到应用的实例中,比如 RPC,只有在 Readiness Check 通过之后,才会向服务注册中心注册,后面来自上游应用的流量才会进入。
除了中间件可以利用 Readiness Check 的事件来控制流量的进入之外,PAAS 系统也可以通过访问 http://localhost:8080/health/readiness
来获取应用的 Readiness Check 的状况,用来控制例如负载均衡设备等等的流量。
为了解决 Spring Boot 下的类依赖冲突的问题,SOFABoot 基于 SOFAArk 提供了 Spring Boot 上的类隔离的能力,在一个 SOFABoot 的系统中,只要引入 SOFAArk 相关的依赖,就可以将 SOFAStack 的中间件相关的类和应用相关的类的 ClassLoader 进行隔离,防止出现类冲突。当然,用户也可以基于 SOFAArk,将其他的中间件、第三方的依赖和应用的类进行隔离。
为了统一大规模微服务场景下的中间件日志的打印,SOFABoot 提供了日志空间隔离的能力给各个 SOFAStack 的中间件,各个 SOFAStack 的中间件采用日志空间隔离的能力之后,自动就会将本身的日志和应用的普通日志隔离开来,并且打印的日志的路径也是相对固定,非常方便进行统一地监控。
基于 Spring Boot 的自动配置能力,SOFABoot 提供了 SOFAStack 中间件统一易用的编程接口以及 Spring Boot 的 Starter,方便在 Spring Boot 环境下使用 SOFAStack 中间件,每一个 SOFAStack 中间件都是独立可插拔的组件,节约开发时间,和后期维护的成本。
下满我们创建一个 Spring Boot 的工程,引入 SOFABoot 基础依赖,并且引入 SOFABoot 的健康检查扩展能力,演示如何快速上手 SOFABoot。
要使用 SOFABoot,需要先准备好基础环境,SOFABoot 依赖以下环境:
SOFABoot 是直接构建在 Spring Boot 之上,因此可以使用 Spring Boot 的工程生成工具 来生成,在本文档中,我们需要添加一个 Web 的依赖,以便最后在浏览器中查看效果。
在创建好一个 Spring Boot 的工程之后,接下来就需要引入 SOFABoot 的依赖,首先,需要将上文中生成的 Spring Boot 工程的 zip
包解压后,修改 maven 项目的配置文件 pom.xml
,将
org.springframework.boot
spring-boot-starter-parent
${spring.boot.version}
替换为:
com.alipay.sofa
sofaboot-dependencies
2.3.1
然后,添加一个 SOFABoot 健康检查扩展能力的依赖:
com.alipay.sofa
healthcheck-sofa-boot-starter
最后,在工程的 application.properties 文件下添加一个 SOFABoot 必须要使用的参数,包括spring.application.name 用于标示当前应用的名称;logging path 用于指定日志的输出目录。
#Application Name
spring.application.name=SOFABoot Demo
# logging path
logging.path=./logs
可以将工程导入到 IDE 中运行生成的工程里面中的 main
方法(一般上在 XXXApplication 这个类中)启动应用,也可以直接在该工程的根目录下运行 mvnw spring-boot:run
,将会在控制台中看到启动打印的日志:
2018-04-05 21:36:26.572 INFO ---- Initializing ProtocolHandler ["http-nio-8080"]
2018-04-05 21:36:26.587 INFO ---- Starting ProtocolHandler [http-nio-8080]
2018-04-05 21:36:26.608 INFO ---- Using a shared selector for servlet write/read
2018-04-05 21:36:26.659 INFO ---- Tomcat started on port(s): 8080 (http)
可以通过在浏览器中输入 http://localhost:8080/sofaboot/versions 来查看当前 SOFABoot 中使用 Maven 插件生成的版本信息汇总,结果类似如下:
[
{
GroupId: "com.alipay.sofa",
Doc-Url: "https://github.com/alipay/sofa-boot",
ArtifactId: "infra-sofa-boot-starter",
Built-Time: "2018-04-05T20:55:26+0800",
Commit-Time: "2018-04-05T20:54:26+0800",
Commit-Id: "049bf890bb468aafe6a3e07b77df45c831076996",
Version: "2.3.1"
}
]
可以通过在浏览器中输入 http://localhost:8080/health/readiness 查看应用 Readiness Check 的状况,类似如下:
{
status: "UP",
sofaBootComponentHealthCheckInfo: {
status: "UP"
},
springContextHealthCheckInfo: {
status: "UP"
},
DiskSpace: {
status: "UP",
total: 250140434432,
free: 22845308928,
threshold: 10485760
}
}
status: "UP" 表示应用 Readiness Check 健康的。可以通过在浏览器中输入 http://localhost:8080/health 来查看应用的运行时健康状态(可能会随着时间发生变化)。
在上面的 application.properties 里面,我们配置的日志打印目录是 ./logs 即当前应用的根目录(我们可以根据自己的实践需要配置),在当前工程的根目录下可以看到类似如下结构的日志文件:
./logs
├── health-check
│ ├── sofaboot-common-default.log
│ └── sofaboot-common-error.log
├── infra
│ ├── common-default.log
│ └── common-error.log
└── spring.log
如果应用启动失败或者健康检查返回失败,可以通过相应的日志文件找到错误的原因,有些需要关注 common-error.log 日志。
我们知道,SpringBoot 官方提供了和 JUnit4 集成的 SpringRunner
, 用于集成测试用例的编写; 在 SOFABoot 中,依然可以使用原生的 SpringRunner
, 但是推荐使用 SOFABoot 自带的 SofaBootRunner
以及 SofaJUnit4Runner
编写集成测试和单元测试;应用需要额外引入如下 Starter:
com.alipay.sofa
test-sofa-boot-starter
需要注意的是,如果需要使用 SOFABoot 的类隔离的能力,则必须需要引入上述的依赖,并且使用 SofaBootRunner 和 SofaJUnit4Runner 来测试。
本文转载自--https://www.xttblog.com/?p=2677