美文网首页
初识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