Sofaboot學習整理


目錄

Sofaboot功能描述

文檔地址:https://www.sofastack.tech/sofa-boot/docs/Home

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。

 

1.擴展 Spring Boot 的健康檢查的能力

在 Spring Boot 健康檢查能力的基礎上,提供了 Readiness Check 的能力,保證應用實例安全上線。

 

liveness check and readiness check

1)liveness check

存活檢測,通過liveness check可以用於檢測服務狀態是否正常

2)readiness check

就緒檢測,通過readiness check可以確定服務是否已經就緒可以接收流量

 

Sofaboot的Readiness Check

1)為什么要對Spring boot健康檢查進行擴展

Springboot提供的健康檢查只有liveness的能力,即檢查應用狀態是否正常。但是應用狀態正常並不代表可以提供服務了。

2)sofaboot的Readiness check

可能應用啟動之后,要進行一些前置工作才能對外提供服務,比如加載數據,構建緩存等。Sofaboot提供的Readiness check就是提供了這個功能的。

 

參考資料:

[1] https://k8smeetup.github.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/ k8s的liveness探針和readiness探針

[2] https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html

[3] http://www.glmapper.com/2018/11/16/sofaboot-health-one/ SoftBoot健康檢查能力分析

 

2.提供模塊化開發能力

模塊化方式

說明

代碼組織模塊化

開發期:不同功能代碼在不同java工程下

編譯期:打進不同jar包

運行期:所有Java類在同一個classpath下

spring上下文隔離模塊化

開發期、編譯期:代碼、配置放在不同java工程下

運行期:不同模塊擁有自己的spring上下文。(所有java類在一個classLoader下)

基於Classloader隔離的模塊化

每個模塊有獨立的classloader,模塊與模塊之間classpath不同

sofaboot模塊化開發

基於spring上下文隔離,每個sofaboot模塊使用獨立的spring上下文,避免不同sofaboot模塊間的beanid沖突

 

關於Spring上下文隔離的機制

 

root context
student module context
teacher module context

 

application.xml存放spring bean配置(root context)

student-servlet.xml存在student相關配置(student module context)

teacher-servlet.xml存放teacher相關配置(teacher module context)

某個module查找bean的時候,首先從自己context里找,如果找不到,從parent context找

    <servlet>
        <servlet-name>student</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet><servlet-mapping>
        <servlet-name>student</servlet-name>
        <url-pattern>/student/*</url-pattern>
    </servlet-mapping>
  <servlet>
        <servlet-name>teacher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet><servlet-mapping>
        <servlet-name>teacher</servlet-name>
        <url-pattern>/teacher/*</url-pattern>
    </servlet-mapping>
 

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/BeanFactory.html

https://stackoverflow.com/questions/43452644/what-is-the-difference-between-spring-parent-context-and-child-context

https://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-servlet

https://dzone.com/articles/spring-boot-and-application-context-hierarchy

http://javafreakers.com/application-context-level-hierarchy-in-spring-web-application/

 

模塊化后帶來的問題

上下文隔離后,模塊之間的bean無法直接注入,無法通信。

sofa專門提供了服務引用和發布解決模塊間調用問題。

 

Sofaboot模塊化的應用場景

很是疑問,模塊化的作用除了容易解決beanid沖突,到底有啥用?

(beanid,不顯式配置id,id為類名?是因為這個嗎?)

 

3.提供模塊並行加載和Spring Bean異步初始化能力

基於模塊化開發,因為模塊之間隔離,所以可以並行加載bean配置

 

4.日志空間隔離能力

什么是日志空間隔離能力?

應用X依賴中間件A、中間件B,中間件(A,B)的日志和應用的日志分開。

比如,應用X的日志打到/xxxx/logs,中間件A日志打到/xxxx/a/logs,中間件B日志打到/xxxx/b/logs。

 

引入namespace概念,每個中間件一個namespace。

JVM啟動參數里配置,logging.path.{spaceName},就可以將日志打到相應的文件夾。

比如,logging.path.A=/xxxx/a/logs,logging.path.B=/xxxx/b/logs

 

5.提供類隔離能力

要解決的問題痛點/使用場景

依賴沖突:項目依賴的jar包與外部依賴的jar包沖突,兩個三方包依賴的包沖突(A-->B-->D1,A-->C-->D2)

 

SofaArk類隔離實現方法

基於ClassLoader的隔離,FatJar

 

參考資料

https://blog.mythsman.com/2018/12/09/1/ sofa-ark類隔離技術分析調研


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM