一、微服务概述
1.1 Spring Cloud
Spring Cloud 是一个用来建立分布式系统的开发工具集合,基于 Spring 框架,提供了很多实用的解决方案和工具,用来简化分布式系统的开发和部署。Spring Cloud 提供了服务注册与发现、负载均衡、断路器、配置管理等功能,可以更容易的构建和管理分布式系统。
1.2 Spring Cloud Alibaba
Spring Cloud Alibaba 是在 Spring Cloud 基础上集成了阿里巴巴的开源项目,提供了更多的分布式系统解决方案。包括了服务注册与发现、负载均衡、断路器、配置管理等功能,还提供了阿里巴巴的分布式事务解决方案、消息队列等特点。Spring Cloud Alibaba 可以与 Spring Cloud 直接合成,帮助构建高可靠、高性能的分布式系统。
1.2.1 组件分类
- Nacos:服务注册和发现中心,提供了服务注册、发现、配置和管理等功能。
- Sentinel:流量控制和熔断降级组件,用来保护服务的稳定性和可靠性。
- RocketMQ:分布式消息队列,用来实现异步通信和解耦系统之间的依赖关系。
- Alibaba Cloud OSS:对象存储服务,用来存储和管理大量的非结构化数据。
- Alibaba Cloud ACM:配置管理中心,用来集中管理应用程序的配置信息。
- Alibaba Cloud SMS:短信服务,用来实现短信发送和接收功能。
- Alibaba Cloud Dubbo:RPC 框架,用于实现服务之间的远程调用。
1.3 DevOps
DevOps 是一种软件开发和运维的方法论,意思是在通过自动化和协作来加速软件交付和提高系统的稳定性。DevOps 通过自动化工具和流程来实现持续集成、持续交付和持续部署。
1.4 领域驱动设计 DDD
二、RestTemplate
1. 创建 RestTemplate 实例:
RestTemplate restTemplate = new RestTemplate();
2. 发送 GET 请求并获取响应:
ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
String obj=restTemplate.getForObject(url,String.class);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON); 设置相应内容类型
HttpEntity<String> requestEntity = new HttpEntity<>(requestBody, headers);
ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> requestEntity = new HttpEntity<>(requestBody, headers);
restTemplate.put(url, requestEntity);
restTemplate.delete(url);
通过 RestTemplate 可以更方便地设置请求头、请求参数、请求体等,并处理响应结果。也可以使用 RestTemplate 的其他方法来处理不同类型的请求和响应。
三、SpringBoot 原理
3.1 核心注解
- @Configuration 或者@SpringBootConfiguration 与@Bean 以 Java 代码的 bean 配置为基础的;
- @Conditional 设置自动配置条件依赖;
- @EnableConfigurationProperties 与@ConfigurationProperties 读取配置文件转换为 bean;
- @EnableAutoConfiguration 与@Import 是用来实现 bean 发现与加载的。
3.2 建议性质的命名规范
- 创建项目 c3p0-spring-boot-starter;
- c3p0 需要的依赖库 c3p0 打包时不包含此依赖、自动配置需要的依赖库 spring-boot-autoconfigure、配置文件处理依赖库 spring-boot-configuration-processor 打包时不包含此依赖;
- 创建 C3p0DataSourceProperties 配置文件@ConfigurationProperties(prefix = "spring.datasource.c3p0") 将从 yaml 文件读取的属性之前赋值给当前属性配置类对象。prefix 属性要求写 yaml 文件是必须有这个前缀。
- 创建 C3p0DatasourceAutoConfigure 自动配置类。
@Configuration
@EnableConfigurationProperties(C3p0DataSourceProperties.class)
public class C3p0DatasourceAutoConfigure {
@Autowired
private C3p0DataSourceProperties dataSourceProperties;
@Bean
public DataSource c3p0DataSource(){ 提供基于 c3p0 配置的 DataSource 实例
ComboPooledDataSource dataSource = new ComboPooledDataSource();
try {
dataSource.setDriverClass(dataSourceProperties.getDriverClassName());
dataSource.setJdbcUrl(dataSourceProperties.getUrl());
dataSource.setUser(dataSourceProperties.getUsername());
dataSource.setPassword(dataSourceProperties.getPassword());
return dataSource;
} catch (PropertyVetoException e) {
e.printStackTrace();
new RuntimeException(e.getMessage());
return null;
}
}
}
- 在 resource 目录下创建 META-INF 文件夹并创建 spring.factories。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.yan.C3p0DatasourceAutoConfigure
- 安装到本地仓库。
3.3 使用自定义 starter
spring:
datasource:
c3p0:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC
username: root
password: 123456
@SpringBootTest
class SpringBootTestC3p0ApplicationTests {
@Autowired 注入 c3p0DataSource
private DataSource c3p0DataSource;
@Test
void testC3p0(){
try { 直接通过数据源获取数据库连接,并测试连接是否成功
Connection connection = c3p0DataSource.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT *
from t_user");
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next())
System.out.println(resultSet.getObject(1)+" "+resultSet.getObject(2));
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
四、SpringBoot 自动装配
Spring Boot的自动装配是通过在启动类上使用@SpringBootApplication注解来开启的。这个注解的作用就是告诉Spring Boot要自动扫描约定目录下的文件进行解析。
Spring Boot的自动装配原理其实就是利用了Spring框架的依赖注入和控制反转机制。它会自动扫描应用程序的类路径,然后根据配置文件和注解的内容来自动配置和装配各种Spring组件和功能。这样,我们只需要按照Spring Boot的约定来编写代码和配置文件,就能自动注入和使用这些组件,而无需手动进行繁琐的配置和装配过程。
当我们引入Spring Boot的starter依赖时,它会自动扫描类路径上的配置文件和注解。根据这些内容,Spring Boot会自动配置和装配相关的Bean,使得我们可以在应用程序中直接使用它们,而不需要手动进行额外的配置和装配操作。这样,我们可以更加专注于业务代码的编写,提高开发效率。
4.1 装配步骤
SpringBoot 的自动装配原理主要包括 5 个步骤:
- 扫描:SpringBoot 会扫描应用程序的类路径,包括主配置类所在的包及其子包。
- 配置:SpringBoot 会根据约定的配置规则,自动读取和解析配置文件,如 application.properties或 application.yml 中的配置信息。
- 条件判断:SpringBoot 会根据条件判断机制,判断是否满足特定的条件,以确定是否需要自动配置相关的 Bean。
- 装配:如果满足条件,SpringBoot 会自动配置和装配相关的 Bean,并将它们注册到 Spring 的应用上下文中。
- 使用:可以直接在应用程序中使用这些被自动配置的 Bean,而无需手动进行配置和装配。 通过自动装配,SpringBoot 大大简化了应用程序的配置和开发过程,提高了开发效率。同时 SpringBoot也提供了很多可扩展的自定义配置选项,可以根据实际需求进行定制和调整。总的来说 SpringBoot的自动装配原理是基于扫描、配置、条件判断、装配和使用等步骤,通过自动读取配置文件和解析注解的方式,实现了自动配置和装配相关的 Bean,简化了应用程序的配置和开发过程。
4.2 SpringBoot 应用启动原理
SpringBoot 的启动过程都是通过@SpringBootApplication 注解和 SpringApplication.run 方法来实现的,一般会使用 ApplicationEvent 事件机制搞事环境当前应用的状况。 启动过程可以概括为:
4.3 @SpringBootApplication 注解
@SpringBootApplication 注解实际上是 SpringBoot 提供的一个复合注解,由三个注解组成:
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Import({AutoConfigurationImportSelector.class})