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类隔离技术分析调研