美文网首页
初识SpringCloudAlibaba

初识SpringCloudAlibaba

作者: 一个头发茂密的程序员 | 来源:发表于2021-02-01 15:42 被阅读0次

    SOA和微服务架构的区别

    SOA为粗粒度的服务治理,关注的是服务的重用性和信息孤岛问题

    微服务为细粒度的服务治理,粒度分化更细,主要侧重点在于业务的解耦,重点关注的是服务的重用性。

    可将每个具体的业务构成可独立运行的微服务。

    微服务架构图

    image.png
    图片来源:https://blog.csdn.net/qq_42914528/article/details/81779758

    SpringCloud是基于SpringBoot的一套微服务解决方案。是SpringCloud的标准实现。

    版本对应关系:


    image.png

    组件版本对应关系:


    image.png

    Springboot设计思想:约定优于配置

    约定优于配置是一种软件设计范式,目的在于减少配置、降低理解难度,提升开发效率。
    思想主要体现于:

    • Maven目录结构的约定
    • Springboot 默认的配置文件及配置文件中配置属性的约定
    • 对于SpringMvc的依赖,自动依赖内置的tomcat
    • 对于stater组件自动完成装配
      Springboot 核心
    • starter组件,提供开箱即用的组件
    • 自动装配,自动根据上下文完成bean的装配
    • Actuator,Springboot 应用的监控
    • SpringBoot CLI 基于命令行工具快速创建Springboot 应用

    Springboot自动装配的实现

    @EnableAutoConfiguration

    通过@EnableAutoConfiguration注解来开启的,这个注解声明在@SpringbootApplication内
    
    image.png
    @Enable注解本质上是对@Configuration 和 @Bean注解的封装,
    使用@Enable注解后,Springboot会解析到@Import导入的导入的配置类,
    从而根据这个配置类完成Bean的装配
    
    @EnableAutoConfiguration注解中不光有@Import注解,
    还有一个@AutoConfigurationPackage注解。
    (它的作用是把使用该注解的类的包及子包下所有组件扫描到Spring IOC容器中。),
    并且@Import注解中导入的并不是一个Configuration配置类,
    而是一个AutoConfigurationImportSelector类。该注解就跟其他的@Enable注解有很大的不同。
    不过该AutoConfigurationImportSelector一定也是实现配置类导入的。
    
    image.png

    AutoConfigurationImportSelector

    image.png
    1.通过@Import(AutoConfigurationImportSelector) 实现配置类的导入,但这并不是传统意义上的单个配置类装配
    2. AutoConfigurationImportSelector实现了ImportSelector接口,重写了方法selectImports,它用于实现选择性批量配置类装配
    3.通过Spring提供的SpringFactoriesLoader机制,扫描classpath路径下的META-INF/spring.factories,读取需要实现自动装配的配置类
    4. 通过条件筛选的方式,把不符合的配置类移除,最终完成自动装配
    

    @Conditional条件装配

    image.png
    @Conditional是Spring Framework提供的一个核心注解,这个注解的作用是提供自动装配的条件约束,一般与@Configuration和@Bean配合使用
    Spring在解析@Configuration配置类时,如果该配置类添加了@Conditional注解,那么会根据注解配置的条件来决定是否要实现Bean的装配
    

    该注解可以接收一个Condition数组


    image.png

    Condition是一个函数式接口,提供了matchers 方法,它主要提供一个匹配规则,返回true表示可以注入Bean,反之则不注入

    例:

    public class MyCondition implements Condition {
        @Override
        public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
            String os = conditionContext.getEnvironment().getProperty("os.name");
            //如果是·windows系统就返回true
            if (os.contains("Windows")){
                return true;
            }
            return false;
        }
    }
    
    @Configuration
    public class ConditionConfig {
        @Bean
        @Conditional(MyCondition.class)
        public User1 user1(){
            return new User1();
        }
    }
    
    public class ConditionMain {
        public static void main(String[] args) {
            AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(ConditionConfig.class);
            User1 user = annotationConfigApplicationContext.getBean(User1.class);
            System.out.println(user);
        }
    }
    
    image.png

    Springboot中的@Conditional

    针对@Conditional做了扩展,提供了更简便的使用方式

    • @ConfitionalOnBean/@ConditionalOnMissBean: 在存在某个类或者不存在某个Bean时进行加载
    • @ConditionOnClass/@ConditionalOnMissingClass: classpath下存在指定类或者不存在指定类时进行Bean装载
    • @ConditionalOnProperty:系统中指定属性是否有对应的值
    • @ConditionalOnResource: 要加载的Bean依赖指定资源是否存在于classpath中

    相关文章

      网友评论

          本文标题:初识SpringCloudAlibaba

          本文链接:https://www.haomeiwen.com/subject/icrjtltx.html