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

  • 相关阅读:
    ACM第六周竞赛题目——A LightOJ 1317
    数学概念——J
    数学概念——I
    数学概念——D 期望
    数学概念——A 几何概型
    数学概念——E 期望(经典问题)
    数学概念——F 概率(经典问题)birthday paradox
    数学概念——H 最美素数
    数学概念——G 最大公约数
    UVa1328
  • 原文地址:https://www.cnblogs.com/yeyang/p/12577881.html
Copyright © 2020-2023  润新知