前言

大家好,我是老马。

sofastack 其实出来很久了,第一次应该是在 2022 年左右开始关注,但是一直没有深入研究。

最近想学习一下 SOFA 对于生态的设计和思考。

sofaboot 系列

SOFABoot-00-sofaboot 概览

SOFABoot-01-蚂蚁金服开源的 sofaboot 是什么黑科技?

SOFABoot-02-模块化隔离方案

SOFABoot-03-sofaboot 介绍

SOFABoot-04-快速开始

SOFABoot-05-依赖管理

SOFABoot-06-健康检查

SOFABoot-07-版本查看

SOFABoot-08-启动加速

SOFABoot-09-模块隔离

SOFABoot-10-聊一聊 sofatboot 的十个问题

缘起

最近晚上和公司的同事闲聊,说到了阿里开源的 SOFA 系列,代码写的比较干净,值得学习研究一下。

于是白天花时间学习了一下,感觉确实收获颇丰。

这里分享给大家,希望这会是一个完整的 SOFA 技术栈学习系列。

SOFABoot

SOFABoot 是蚂蚁金服开源的基于 Spring Boot 的研发框架,它在 Spring Boot 的基础上,提供了诸如 Readiness Check,类隔离,日志空间隔离等能力。

在增强了 Spring Boot 的同时,SOFABoot 提供了让用户可以在 Spring Boot 中非常方便地使用 SOFA 中间件的能力。

蚂蚁金服

功能描述

SOFABoot 在 Spring Boot 基础上,提供了以下能力:

  • 扩展 Spring Boot 健康检查的能力:在 Spring Boot 健康检查能力基础上,提供了 Readiness Check 的能力,保证应用实例安全上线。
  • 提供模块化开发的能力:基于 Spring 上下文隔离提供模块化开发能力,每个 SOFABoot 模块使用独立的 Spring 上下文,避免不同 SOFABoot 模块间的 BeanId 冲
    突。
  • 增加模块并行加载和 Spring Bean 异步初始化能力,加速应用启动;
  • 增加日志空间隔离的能力:中间件框架自动发现应用的日志实现依赖并独立打印日志,避免中间件和应用日志实现绑定,通过 sofa-common-tools 实现。
  • 增加类隔离的能力:基于 SOFAArk 框架提供类隔离能力,方便使用者解决各种类冲突问题。
  • 增加中间件集成管理的能力:统一管控、提供中间件统一易用的编程接口、每一个 SOFA 中间件都是独立可插拔的组件。
  • 提供完全兼容 Spring Boot的能力:SOFABoot 基于 Spring Boot 的基础上进行构建,并且完全兼容 Spring Boot。

快速开始

看了这么多,没什么实际的感觉。

我们直接上手一个入门案例直观感受一下。

代码开源地址:https://gitee.com/houbinbin/sofaboot-learn/tree/master/sofaboot-learn-quickstart

基本的 springboot 项目

你可以基于 springboot init 自己生成,主要内容如下:

xml 依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.github.houbb</groupId>
    <artifactId>sofaboot-learn</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>sofaboot-learn</name>
    <description>Demo project for SOFA Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

启动类

package com.github.houbb.sofaboot.learn;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SofabootLearnApplication {

    public static void main(String[] args) {
        SpringApplication.run(SofabootLearnApplication.class, args);
    }

}

引入 SOFABoot 依赖

修改 maven 项目的配置文件 pom.xml,将

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>${spring.boot.version}</version>
    <relativePath/> 
</parent>

替换为:

<parent>
    <groupId>com.alipay.sofa</groupId>
    <artifactId>sofaboot-dependencies</artifactId>
    <version>${sofa.boot.version}</version>
</parent>

这里我们使用最新版本 3.4.6。

然后,添加 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 用于指定日志的输出目录。

# Application Name
spring.application.name=SOFABoot Demo
# logging path
logging.path=./logs

运行

直接运行我们的启动类 main 方法,日志如下:

 ,---.    ,-----.  ,------.   ,---.     ,-----.                     ,--.
'   .-'  '  .-.  ' |  .---'  /  O  \    |  |) /_   ,---.   ,---.  ,-'  '-.
`.  `-.  |  | |  | |  `--,  |  .-.  |   |  .-.  \ | .-. | | .-. | '-.  .-'
.-'    | '  '-'  ' |  |`    |  | |  |   |  '--' / ' '-' ' ' '-' '   |  |
`-----'   `-----'  `--'     `--' `--'   `------'   `---'   `---'    `--'


Spring Boot Version: 2.1.13.RELEASE (v2.1.13.RELEASE)
SOFABoot Version: 3.4.6 (v3.4.6)
Powered By Ant Group
...
2021-01-05 09:57:50.623  INFO 12720 --- [2)-172.17.160.1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 7 ms

可以发现整体启动时间只用了 7ms,还是很快的。

检查

maven

直接浏览器访问 http://localhost:8080/actuator/versions 来查看当前 SOFABoot 中使用 Maven 插件生成的版本信息汇总。

我们选取一个,如下:

{
  "GroupId": "com.alipay.sofa",
  "Doc-Url": "http://www.sofastack.tech/sofa-boot/docs/Home",
  "ArtifactId": "healthcheck-sofa-boot-starter",
  "Commit-Time": "2020-11-18T13:07:33+0800",
  "Commit-Id": "0e6f10b9f5f1c4c8070814691b8ef9cbff8a550d",
  "Version": "3.4.6",
  "Build-Time": "2020-11-23T13:49:02+0800"
}

Readiness Check

可以通过在浏览器中输入 http://localhost:8080/actuator/readiness 查看应用 Readiness Check 的状况

{"status":"UP","details":{"SOFABootReadinessHealthCheckInfo":{"status":"UP","details":{"HealthChecker":{"sofaComponentHealthChecker":{"status":"UP"}}}},"diskSpace":{"status":"UP","details":{"total":127083565056,"free":69193203712,"threshold":10485760}}}}

日志

SOFABoot 提供了日志的物理隔离:

./logs
├── health-check
│   ├── sofaboot-common-default.log
│   └── sofaboot-common-error.log
├── infra
│   ├── common-default.log
│   └── common-error.log
└── spring.log

个人感受

这里基本上和 springboot 使用起来没什么差异,学习成本基本为 0。

不过这个入门案例也只是展示了 SOFABoot 比较基础的几个特性:

(1)Readiness Check

(2)日志文件物理隔离

小结

本节我们主要介绍了 SOFABoot 的入门使用,以及如何解决模块化开发的实战。

说起模块化我们也可以想到 OSGi 以及 jdk9 的 module 支持,不过每一种解决方案都有对应的优势和限制。

SOFABoot 解决了模块的隔离,SOFAArk 则专注于解决类的隔离,我们下一节一起来学习下 SOFA 的另一个神器 SOFAArk。

希望本文对你有所帮助,如果喜欢,欢迎点赞收藏转发一波。

我是老马,期待与你的下次相遇。


老马啸西风
191 声望34 粉丝