Sofaboot功能描述
文檔地址:https://www.sofastack.tech/sofa-boot/docs/Home
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上下文隔離的機制
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/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類隔離技術分析調研