# SOFAStack-Quickstart **Repository Path**: wangfugui-ma/sofastack-quickstart ## Basic Information - **Project Name**: SOFAStack-Quickstart - **Description**: SOFAStack框架的快速启动 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-05-31 - **Last Updated**: 2023-12-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: sofaboot, sofastack, sofa ## README > 最近发现了一个新的开源项目:SOFABoot,再加上公司用的框架也是SOFABoot,所以给将这个框架分享给大家,希望能扩展大家的视野。 ## 首先我们需要知道什么是SOFABoot? > SOFABoot 是蚂蚁集团开源的基于 Spring Boot 的研发框架,它在 Spring Boot 的基础上,提供了诸如 > Readiness Check,类隔离,日志空间隔离等等能力。 下面是他的项目地址: [https://gitee.com/sofastack/sofa-boot](https://gitee.com/sofastack/sofa-boot) ## 为什么要选择SOFABoot?他能解决什么问题? 根据官方介绍,他主要能解决以下的问题: 1. Spring Boot 的健康检查只有 Liveness Check 的能力,缺少 Readiness Check 的能力 这里给大家科普一下`Liveness Check` 和 `Readiness Check` 是什么东西 *Liveness Check 和 Readiness Check 概念来自于 Kuberentes,分别代表运行时检查和启动时检查。 利用 Readiness Check 的能力,SOFA 中间件中的各个组件只有在 Readiness Check 通过之后,才将流量引入到应用的实例中,比如 RPC,只有在 Readiness Check 通过之后,才会向服务注册中心注册,后面来自上游应用的流量才会进入* 2. 提供模块化开发的能力 *基于 Spring 上下文隔离提供模块化开发能力,每个 SOFABoot 模块使用独立的 Spring 上下文,避免不同 SOFABoot 模块间的 BeanId 冲突* 3. 增加日志空间隔离的能力 *在超大规模微服务运维的场景下,运维能力的平台化是一定要解决的问题,而监控又是其中非常主要的一个点,针对于日志监控这种情况,Spring Boot 并没有提供任何解决方案。大部分的开源组件,具体要打印哪些日志,打印到什么路径,什么文件下面,都是由应用的使用者来决定,这样会导致每一个应用的日志配置都各式各样,每一个应用都需要去监控系统中配置自己应用的日志监控,导致关键的监控的实施成本特别高* *中间件框架自动发现应用的日志实现依赖并独立打印日志,避免中间件和应用日志实现绑定,通过 sofa-common-tools 实现* 4. 增加类隔离的能力 *基于 SOFAArk 框架提供类隔离能力,方便使用者解决各种类冲突问题* **为了解决以上的问题,又因为 SOFA 中间件中的各个组件本身就需要集成 Spring Boot,所以蚂蚁集团基于 Spring Boot 开发并开源了 SOFABoot,来解决以上的问题,也方便使用者在 Spring Boot 中方便地去使用 SOFA 中间件。** 以上都是官方给出的解释。 那么我们怎样快速搭建一个SOFABoot工程呢? ## 第一步 创建一个springboot项目 ![在这里插入图片描述](https://img-blog.csdnimg.cn/88a9593970344910b055923ecdff0c44.png) ## 第二步,替换`pom.xml`中的以下内容: ![在这里插入图片描述](https://img-blog.csdnimg.cn/39d91f633f1243d289aca3c41b8fe070.png) 第三步,添加`healthcheck`和`web`包 这步非常重要添加之前控制台启动依旧是打印spring ![在这里插入图片描述](https://img-blog.csdnimg.cn/431fb1835e5647e6a73ac664614d3230.png) 而且没有健康检查的机制,添加之后我们再看控制台打印 ![在这里插入图片描述](https://img-blog.csdnimg.cn/06357db627c841f689504b373e573ceb.png) 直到现在,我们的SOFABoot项目就搭建完成了,非常简单, 我们也可以查看当前项目的健康状况: ``` http://localhost:8087/actuator/readiness ``` ![在这里插入图片描述](https://img-blog.csdnimg.cn/74a93fd93f0443fbab5ab70a4d11a77b.png) 好了,今天先分享到这里,大家已经快速入门了一波,后面我会继续带大家走入SOFABoot的世界,欢迎大家关注一波!! **上次我们介绍了sofaboot:** [https://blog.csdn.net/csdnerM/article/details/124750460](https://blog.csdn.net/csdnerM/article/details/124750460) 这次我们来介绍SOFAStack家族中的SOFARPC ![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/ec86637b53eecd03a8014ce57879ccab.png#pic_center) 首先我们知道了sofaboot是在Spring Boot 的基础上,提供了诸如 Readiness Check,类隔离,日志空间隔离等等能力。 ## 那么,sofarpc又是什么呢? > SOFARPC 是蚂蚁金服开源的一款基于 Java 实现的 RPC 服务框架,为应用之间提供远程服务调用能力,SOFARPC 是一个高可扩展性、高性能、生产级的 Java `RPC` 框架。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/685f4c387f3c43f49ef4c3b4bb5623e3.png) 下面是它的开源仓库地址: [https://gitee.com/sofastack/sofa-rpc](https://gitee.com/sofastack/sofa-rpc) ## sofarpc的原理是什么? ![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/628104557179761150c96a603499aeb0.png#pic_center) > 1.当一个 SOFARPC 的应用启动的时候,如果发现当前应用需要发布 RPC 服务的话,那么 SOFARPC 会将这些服务注册到服务注册中心上。如图中 Service 指向 Registry。 2.当引用这个服务的 SOFARPC 应用启动时,会从服务注册中心订阅到相应服务的元数据信息。服务注册中心收到订阅请求后,会将发布方的元数据列表实时推送给服务引用方。如图中 Registry 指向 Reference。 3.当服务引用方拿到地址以后,就可以从中选取地址发起调用了。如图中 Reference 指向 Service。 熟悉`springcloud`的同学是不是觉得它和`eureka`和`fegin`之间的关系特别像? ## 我们来开始他的快速使用 大家也可以拉我仓库的代码下载起来直接启动: [https://gitee.com/WangFuGui-Ma/sofastack-quickstart](https://gitee.com/WangFuGui-Ma/sofastack-quickstart) 我们是按照sofaboot的方式进行框架的快速启动 所以如果不知道sofaboot怎么启动的话请查看我的上篇文章sofaboot的快速入门 [https://blog.csdn.net/csdnerM/article/details/124750460](https://blog.csdn.net/csdnerM/article/details/124750460) 第一步,引入 RPC Starter: ```xml com.alipay.sofa rpc-sofa-boot-starter ``` ![在这里插入图片描述](https://img-blog.csdnimg.cn/a56e2978003d46af88077ae6a4f912c7.png) 第二步,编写xml文件 ```xml ``` ![在这里插入图片描述](https://img-blog.csdnimg.cn/1d18fd92e8034c2dabf396dd6338c87b.png) 第三步,定义服务接口与实现 ```java public interface HelloSyncService { String saySync(String string); } ``` ```java public class HelloSyncServiceImpl implements HelloSyncService { @Override public String saySync(String string) { return string; } } ``` ![在这里插入图片描述](https://img-blog.csdnimg.cn/8a2893ae38e9435da8391c0ee03f6c51.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/860563fd08be4c489faabb498b5f6d83.png) 第四步,服务端发布服务 > 在 xml 文件中编写如下配置。Spring 上下文在刷新时,SOFABoot 就将该服务实现注册到了服务器上,以 bolt 协议与客户端进行通信地址,并将地址等元数据发布到了注册中心(这里默认使用的本地文件作为注册中心)。 ```xml ``` ![在这里插入图片描述](https://img-blog.csdnimg.cn/15098056a58c40339c45c37eff83c333.png) 第四步,客户端引用服务 > 在 xml 文件中编写如下配置。Spring 上下文刷新时,SOFABoot 会生成一个RPC的代理 bean,即 personReferenceBolt 。这样就可以直接在代码中使用该 bean 进行远程调用了。 ```xml ``` ![在这里插入图片描述](https://img-blog.csdnimg.cn/1261dd3de6b3476e89c5d11f02f97d82.png) 第五步,运行 > 在 SpringBoot 的启动类中编码如下。其中利用 ImportResource 将上述的xml文件加载。 ```java @ImportResource({ "classpath*:rpc-sofa-boot-starter-samples.xml" }) @SpringBootApplication public class SofabootApplication { public static void main(String[] args) { SpringApplication springApplication = new SpringApplication(SofabootApplication.class); ApplicationContext applicationContext = springApplication.run(args); HelloSyncService helloSyncServiceReference = (HelloSyncService) applicationContext .getBean("helloSyncServiceReference"); System.out.println(helloSyncServiceReference.saySync("hello , 王富贵")); } } ``` ![在这里插入图片描述](https://img-blog.csdnimg.cn/d39b26d52480445b8ae287f6d0f39cd1.png) 这样就可以在容器中拿到服务类并且进行访问了 控制台输入打印: ![在这里插入图片描述](https://img-blog.csdnimg.cn/1b8bade09ab74d49878b3bcbb2173171.png) 到此,一个sofarpc的快速启动就已经成功完成了!!