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.png1.通过@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中
网友评论