一、什么是 SOFABoot

1.1 概述

SOFABoot 是由蚂蚁科技自研的,基于 Spring Boot 的开发框架,是对Spring Boot的一次针对性增强,它最大的特点是集成了更多的企业级功能和全套金融级中间件为构建金融级的微服务系统提供了强有力的支持,具体来说:

  1. 基础与扩展:SOFABoot是基于Spring Boot框架进行开发的,它继承了Spring Boot的所有优点,如快速启动、简化配置、自动装配等特性,使得开发者能够快速构建应用程序。因此,可以将SOFABoot视作Spring Boot的一个功能扩展,它在Spring Boot的基础上增添了更多企业级功能,如Readiness Check、类隔离、日志空间隔离等,以适应大规模团队在云原生微服务环境下开发的需求。

  2. 中间件集成:SOFABoot特别强化了对蚂蚁集团内部金融科技中间件的集成能力,通过引入starter模块,开发者可以轻松地将这些中间件集成到Spring Boot应用中,实现轻量级、低侵入式的微服务架构搭建。每个中间件都被设计成可插拔的组件,便于根据项目需求灵活配置和管理[1][2]

  3. 开发灵活性:SOFABoot支持创建Web和Core两种类型的工程项目,分别对应有Web页面访问需求的应用和无Web界面的后台服务,这种灵活性让开发者可以根据实际应用场景选择最适合的开发模式。

  4. 兼容与集成:SOFABoot与Spring Boot、Spring Cloud之间保持高度兼容,不仅能够无缝集成Spring Boot生态下的各种组件,还能够与Spring Cloud的微服务管理与治理能力相结合,为开发者提供了从基础框架到微服务架构全面的解决方案。

综上所述,使用 SOFABoot 开发框架,就相当于是在进行“Spring Boot 应用 + SOFA 中间件”的开发。

SOFABoot、中间件服务、Spring Boot 以及 SpringCloud 的关系,示意如下:

1.2 开源版和商业版介绍

SOFABoot 目前对外开放的有开源版和商业版,本文介绍这两个版本的特点及适用场景,您可以根据自身需求自由选择合适的版本。

选型指南

各个版本的能力和适用场景信息见下表:

版本

能力

场景

文档

开源版本

具有模块化开发、类隔离、日志隔离、SOFA-RPC 等能力。

适合寻求开源解决方案。

开源版参考文档。

商业版本

除了开源版能力,还对接服务注册中心,支持消息、分布式事务等能力。

适合有上云需求、对外(公有云、外部专有云)输出需求的场景。

商业版参考文档。

1.3 版本关系

SOFABoot 基于 Spring Boot 框架开发,并依赖 Apache Maven 进行构建。SOFABoot 和 Spring Boot 版本对应关系,以及 JDK 和 Maven 版本要求说明如下:

SOFABoot 版本

Spring Boot 版本

JDK 版本

Maven 版本

3.10.2~3.10.x

2.7.15~2.7.x

JDK 8、JDK 11(支持 Oracle、OpenJDK、Dragonwell JDK 版本)

3.6.3 +

3.6.3~3.6.x

2.3.12.RELEASE

JDK 8(支持 Oracle、OpenJDK、Dragonwell JDK 版本)

3.2.5 +

3.3.2~3.4.x

2.1.13.RELEASE

JDK 8(支持 Oracle、OpenJDK、Dragonwell JDK 版本)

3.2.5 +

3.3.0~3.3.1

2.1.11.RELEASE

3.2.5 +

3.2.x

2.1.0.RELEASE

3.2.5 +

3.1.x

2.1.0.RELEASE

3.2.5 +

二、快速开始

2.1 搭建环境

版本要求

  • JDK 版本 ≥ 8

  • Maven 版本 ≥ 3.2.5

SOFABoot 的 JAR 包并未上传到 Maven 的中央仓库。为便于在构建工程时能够正常下载所依赖的 JAR 包,你需要单击 settings,下载 Maven 的 settings.xml 文件,覆盖原本的settings.xml 文件(请自行做好备份)。该settings.xml 中已经配置好的信息主要包括 profile 标签(用来配置一些全局信息及其激活条件,主要包括一些仓库标签),内容如下:

<profile>
    <id>cloud-open-archetype</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <repositories>
        <repository>
            <id>archetype</id><!-- Don't change this! -->
            <url>http://mvn.cloud.alipay.com/nexus/content/groups/open</url>
            <releases>
                <enabled>true</enabled>
                <checksumPolicy>fail</checksumPolicy>
            </releases>
            <snapshots>
                <enabled>true</enabled>
                <checksumPolicy>warn</checksumPolicy>
            </snapshots>
        </repository>
    </repositories>
</profile>

该文件中并未配置本地仓库位置(`<localRepository>`)和私服坐标(`<mirrors>`),请自行完善。

2.2 快速入门

接下来我们使用 SOFABoot 框架创建一个Web 工程,实现本地运行或部署到云端运行,以及如何引入中间件服务。

2.2.1 创建 Web 工程

  1. 打开命令行工具,输入并执行以下语句:

    mvn archetype:generate -DarchetypeGroupId=com.alipay.sofa -DarchetypeArtifactId=sofaboot-web-archetype -DarchetypeVersion=1.0-SNAPSHOT -DarchetypeCatalog=internal
  2. 在执行过程中,根据系统提示输入以下 Maven 坐标信息:

    • groupId:是 Maven 仓库中的唯一标识,一般为公司域名或组织域名的反写。作为示例,可填为 com.alipay.sofa

    • artifactId:表示项目名称或应用名称。作为示例,可填为 web-app

    • version:版本号,默认为 1.0-SNAPSHOT。SNAPSHOT 意为快照,说明该项目还在开发中,是不稳定的版本。作为示例,此处可维持默认值。

    • package:应用包名,默认等同于 groupId。

  3. 确认输入的 Maven 坐标信息。

    • 如果信息无误,输入 Y 确认,则工程继续创建。

    • 如需修改信息,输入 N 重新定义工程属性。

  4. 工程创建完成。命令行提示以下信息。您可以在当前命令执行路径下的找到创建的工程文件。

  5. 请移步版本说明,查看最新的SOFABoot版本,然后在工程根目录下的主 pom.xml 中,修改 <parent>标签的版本号,示例如下:

2.2.2 将 Web 工程导入 IDE并运行

SOFABoot 工程是标准的 Maven 工程。您可以使用经典的 Java 开发工具(如 IntelliJ IDEA 、Eclipse 等)对其进行开发。导入完成后,您可以在工程文件目录中查看工程结构与内容。

成功运行后,在浏览器中访问 http://localhost:8080,您可以看到以下静态页面信息:

三、应用开发

3.1 工程结构与代码说明

Web 工程模型默认生成 endpointweb 两个模块:

  • endpoint 模块:SOFAREST 的服务模块,对外提供 SOFAREST 服务。

  • web 模块:包含 main 函数的启动模块,可以直接运行。另外,还包含全局配置文件、测试模块和静态资源等。

SOFABoot 的全局属性配置解决方案和日志配置解决方案,请参考 SOFABoot 技术栈的 技术栈使用指南。 应用的测试模块,在 service 模块的 src/test/java 目录下,测试用例包含一个测试基类(base)和一个测试类(usercases)。测试类中启动了 Spring Boot 进行 bean 的简单功能测试。

endpoint 模块中提供了rest facade 接口如下:

@Path("/sofarest")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.APPLICATION_JSON + ";charset=UTF-8")
public interface SampleRestFacade {
    /**
     * http://localhost:8341/sofarest/hello
     */
    @GET
    @Path("/hello")
    String hello();
}

以及facade 的实现类如下:

public class TestServiceImpl implements TestFacade{
     @Override
     public String test(){
         return "test";
     }
}

在浏览器中访问 http://localhost:8341/sofarest/hello,可以看到 rest 接口返回的数据。

这里用的注解你可能比较陌生,这种叫JAX-RS注解(Java API for RESTful Web Services 注解),是一组Java标注,用于简化创建RESTful风格Web服务的过程。它们是Java EE规范的一部分,旨在提供一套标准的API来开发基于HTTP的Web服务,特别是那些遵循REST原则的服务。JAX-RS注解包括但不限于`@Path`, @GET, @POST, @PUT, @DELETE, @Consumes, @Produces, @QueryParam, @PathParam, 等,这些注解帮助开发者定义资源的URL路径、HTTP方法、请求和响应的内容类型等。

Spring MVC注解则是Spring框架中用于构建基于Spring的Web应用程序的一套注解,它不仅支持RESTful服务的开发,还广泛应用于传统的基于表单的Web应用。Spring MVC注解包括`@Controller`, @RequestMapping, @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PathVariable, @RequestParam, @RequestBody, @ResponseBody, 等。这些注解同样用于映射HTTP请求到控制器方法,管理请求参数和响应体等。

主要区别

  1. 适用范围与标准:JAX-RS是一个Java EE标准,专注于RESTful服务的开发,具有良好的跨平台兼容性。而Spring MVC是Spring框架的一部分,虽然也能很好地支持REST服务,但其功能更全面,涵盖从基本的Web应用到复杂的MVC模式应用。

  2. 注解命名与使用:两者在注解命名上有所不同,比如JAX-RS使用`@GET`, @POST等直接对应HTTP方法的注解,而Spring MVC在较新的版本中提供了更为语义化的注解,如`@GetMapping`, @PostMapping等,使得代码更加直观易读。

  3. 依赖与集成:JAX-RS实现(如Jersey, RESTEasy)可以独立于任何特定的Web容器运行,但通常需要在Java EE环境中部署。Spring MVC则深度集成于Spring生态系统,便于与其他Spring组件(如数据访问、安全、事务管理等)一起工作。

  1. 社区与生态:Spring框架拥有庞大的开发者社区和丰富的第三方库支持,提供了更多的扩展性和灵活性。而JAX-RS作为标准,也有成熟的实现和一定的社区支持,但在某些特定场景下,可能不如Spring生态那么丰富。

总的来说,选择JAX-RS还是Spring MVC,取决于项目的需求、团队的技术栈偏好以及是否需要与特定的生态系统集成。两者都能有效支持RESTful服务的开发,只是在细节和整体解决方案上有所差异,如果你想切换到SpringMVC的模式,可以引入Spring MVC

3.2 引入 Spring MVC

SOFABoot 基于 Spring Boot 2.1.0.RELEASE 版本开发,各 SOFA 中间件可通过添加相应的依赖模块来使用服务。按照官网文档 创建工程 创建的 SOFABoot Web 工程默认包含 Spring MVC 的能力。如果尚未引入Spring Boot 原生服务 Spring MVC,则引入步骤如下:

  1. 添加 SOFABoot 依赖

    在主 pom.xml 文件中,添加最新版的 SOFABoot 依赖。具体版本号见 版本说明

    <parent>
          <groupId>com.alipay.sofa</groupId>
          <artifactId>sofaboot-enterprise-dependencies</artifactId>
          <version>3.3.2</version>
    </parent>
  2. 添加 Web 相关的下述依赖:

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

    引入后,可以间接将 Spring MVC 和 Servlet 容器 Tomcat 引入到工程中,便可基于此进行开发。

  3. 测试:

    @RestController
    public class TestController {
    
        @GetMapping("hello")
        public String test() {
            return "test";
        }
    }

3.2 Web 工程的 pom.xml 配置说明

Web 工程完整版 pom.xml 配置,请参考 完整版 pom.xml。下文将就 SOFABoot Web 工程 pom.xml 中的重要标签进行详细介绍。

parent 标签说明

请移步 版本说明,查看最新的 SOFABoot 版本,在工程根目录下的主 pom.xml 中,修改下图所示例项的版本号:

project 标签说明

<project> 标签中,所声明的工程坐标,包括以下内容,可根据工程需要,进行修改:

  • modelVersion:声明工程描述应遵循的 POM 模型版本。

  • groupId:工程的全球唯一标识符,一般为公司域名或组织域名的反写。示例工程为:com.alipay.sofa

  • artifactId:工程的构件标识符。

  • version:工程版本号。SNAPSHOT 意为快照,说明该项目还在开发中,是不稳定的版本。

  • packaging:工程产生的构件类型,例如 jar、war、ear、pom。

  • name:工程的名称,非必选项。

  • url:工程主页的 URL,非必选项。

2.3 引入中间件服务

在成功创建 SOFABoot 工程后,通过在主 pom 文件中引入 starter,即可实现使用中间件服务。

  • 中间件服务类别,以及对应 starter 版本信息的说明,请参考 引入 SOFA 中间件

  • 对于各中间件服务的示例 demo,请参考对应产品的快速入门。

四、应用发布

4.1 云端发布

SOFABoot 应用不仅能在本地运行,也能部署至 SOFAStack 平台,为更多的用户提供应用服务。本文将介绍将应用工程发布至云端的整个流程。

4.1.1 原理

SOFABoot 在云上的编译、运行方式和本地开发一致,只是在 SOFAStack 平台上封装了 SOFABoot 技术栈,用于适配 SOFAStack 平台的环境。在创建应用时,需选择技术栈为 SOFABoot。更多技术栈信息,请参考 技术栈配置方案