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

猜你喜欢

转载自www.cnblogs.com/yeyang/p/12577881.html