参考资料

什么是Spring Cloud

是个规范,其实现有Spring Cloud Alibaba,Spring Cloud Netflix

SpringCloud 解决以下问题

  • 服务注册与发现
  • 服务路由
  • 服务调用
  • 负载均衡
  • 断路器
  • 全局锁
  • 选举及集群状态
  • 分布式消息

    Spring Cloud Alibaba

  • Sentinel

  • Nacos
  • RocketMQ
  • Seate
  • Dubbo
  • OSS

Spring Cloud 核心 springboot

Spring boot 核心

  • Starter组件
  • 自动装配
  • Actuator
  • Spring Boot CLI

自动装配原理

  • 自动装配约定规范
  • @SpringBootApplication ->@EnableAutoConfiguration->@Import(AutoConfigurationImportSelector.class)
  • 其他Enablexxx有类似的流程,最终会Import 一些configuration类来实例化bean

    AutoConfigurationImportSelector

  • 实现了ImportSelector

    • ImportSelector有一个selectImports抽象方法,返回一个String数组,这里可以指定要加载的类
    • import一个 ImportSelector时 ,就会装载selectImports返回的指定类到容器里
  • 原理分析

    • AutoConfigurationImportSelector中 selectImports干了什么
      • 从META-INF/spring-autoconfigure-metadata.properties加载自动装配的条件元数据/满足条件的bean才能装配
      • 收集所有符合条件的配置类 完成自动装配
    • AutoConfigurationImportSelector不执行 selectImports 方法,是由ConfigurationClassPostProcesser的 processConfigBeanDefinitions方法来扫描注册所有配置类
      1. public String[] selectImports(AnnotationMetadata annotationMetadata) {
      2. if (!isEnabled(annotationMetadata)) {
      3. return NO_IMPORTS;
      4. }
      5. AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
      6. return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
      7. }
  • getAutoConfigurationEntry

    • 获得exclude excludeName等属性
    • getCandidateConfigurations 获取所有自动装配的配置类 //重点
    • 去除重复配置
    • getExclusions 移除一些类
    • 广播
    • 返回集合
  • getCandidateConfigurations
    • SpringFactoriesLoader
    • 扫描 META-INF/spring.factories ```properties

      Auto Configure

      org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\ org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\

….

  1. ```java
  2. protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
  3. List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
  4. getBeanClassLoader());
  5. Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
  6. + "are using a custom packaging, make sure that file is correct.");
  7. return configurations;
  8. }
  • @ConditionalOnClass
    • 如果classpath下存在指定的类,就注册配置类
      @Configuration(proxyBeanMethods = false)
      @ConditionalOnClass({ RabbitTemplate.class, Channel.class })
      @EnableConfigurationProperties(RabbitProperties.class)
      @Import(RabbitAnnotationDrivenConfiguration.class)
      public class RabbitAutoConfiguration {...
      }
      

      条件装配

  • @Conditional
    • 可以接收 Condition数组
    • Condition有一个matches方法,返回true就注册,否则就不注册
  • springboot 扩展 @Conditional
    • ConditionOnxxx�
  • spring-autoconfigure-metadata 批量自动装配条件配置

    手写starters

    功能

  • 涉及相关组件的jar包依赖

  • 自动实现bean的装配
  • 自动声明加载application.properties文件属性配置

    命名规范

  • 官方

    • spring-boot-starter-xxx
  • 自定义
    • xxx-spring-boot-starter

//TODO demo 写下

服务治理

Dubbo

  • 一个rpc框架
  • 提供了服务治理功能
    • 注册
    • 监控
    • 路由
    • 容错