阿里微服务

一、微服务概述

软件架构的演变过程有五个:单体架构、垂直应用架构、流式计算架构 SOA 、微服务架构和服务网格。
微服务是一种软件开发架构,将一个大的应用程序分解为一系列小的、独立的服务。每个服务都可以独立开发、部署和扩展,还有通过轻量级的通信机制进行交互。
微服务架构的目标是提高系统的可伸缩性、灵活性和可维护性,同时降低开发和部署的复杂性。每个微服务都有一个特定的业务功能,可以使用不同的编程语言和技术栈进行开发。这种分布式架构可以更快地开发和部署新功能,同时减少对整个系统的影响。
1.1 Spring Cloud

 Spring Cloud 是一个用来建立分布式系统的开发工具集合,基于 Spring 框架,提供了很多实用的解决方案和工具,用来简化分布式系统的开发和部署。Spring Cloud 提供了服务注册与发现、负载均衡、断路器、配置管理等功能,可以更容易的构建和管理分布式系统。

我查找了资料,发现提供的组件分别有以下:分布式及版本化配置管理;服务注册与发现;服务路由、服务调用、负载均衡;断路器;全局锁;选举和集群状态管理;分布式消息。
Spring Cloud 本质上就 是一个给各大公司开源技术的微服务开发规范标准,通过 SpringBoot 框架来封装后屏蔽复杂的配置,提供开箱就可以用的开发体验,而 SpringCloud Neflix SpringCloud alibaba才是 SpringCloud 规范的实现。
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 DubboRPC 框架,用于实现服务之间的远程调用。

 1.3  DevOps

 DevOps 是一种软件开发和运维的方法论,意思是在通过自动化和协作来加速软件交付和提高系统的稳定性。DevOps 通过自动化工具和流程来实现持续集成、持续交付和持续部署。

DevOps 的目标是通过减少手工、减少错误和提高交付速度来提高软件交付的质量和效率。
微服务和 DevOps 之间的关系是相辅相成的。微服务架构提供了可独立部署的服务单元,而 DevOps提供了自动化和协作的能。一起促进了软件交付的质量、效率和可靠性!!!
1.4  领域驱动设计 DDD
领域驱动设计 DDD 是一种软件开发方法论,就是指通过将业务领域的专业知识带入到软件设计中来解决复杂的业务问题。DDD 着重 将软件系统划分为不同的领域,并将业务逻辑和领域模型作为核心驱动因素。DDD 提供了一些概念和模式,例如聚合根、实体、值对象、领域事件等,通过这些我可以更好的理解和设计复杂的业务逻辑。
DDD 的目标是提高软件系统的可维护性、可扩展性和灵活性,来满足不断变化的业务需求。

二、RestTemplate

RestTemplate 是来进行 HTTP 请求的 Java 类库,一般用来与 RESTful API 进行交互。提供了一组简单而强大的方法,使发送 HTTP 请求、处理响应和解析数据变得更加容易了。使用 RestTemplate可以进行各种 HTTP 操作,如 GET POST PUT DELETE 等。

 1. 创建 RestTemplate 实例:

RestTemplate restTemplate = new RestTemplate();

2. 发送 GET 请求并获取响应:

ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
String obj=restTemplate.getForObject(url,String.class);
3. 发送 POST 请求并获取响应:
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);
4. 发送 PUT 请求并获取响应:
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> requestEntity = new HttpEntity<>(requestBody, headers);
restTemplate.put(url, requestEntity);
5. 发送 DELETE 请求并获取响应:
restTemplate.delete(url);

通过 RestTemplate 可以更方便地设置请求头、请求参数、请求体等,并处理响应结果。也可以使用 RestTemplate 的其他方法来处理不同类型的请求和响应。

三、SpringBoot 原理

手写 starter 组件
概括的说starter 组件有三个方面的功能: 1 、相关组件的 jar 包依赖。 2 、自动实现 bean 的装配。 3 、自动声明并且加载 application.properties 文件中的属性配置
3.1  核心注解
  • @Configuration 或者@SpringBootConfiguration @Bean 以 Java 代码的 bean 配置为基础的;
  •  @Conditional 设置自动配置条件依赖;
  • @EnableConfigurationProperties 与@ConfigurationProperties 读取配置文件转换为 bean;
  • @EnableAutoConfiguration @Import 是用来实现 bean 发现与加载的。
3.2  建议性质的命名规范
官方提供的场景启动器名字为 spring-boot-starter-xxx,第三方提供的场景启动器 xxx-spring-boot-starter。
  • 创建项目 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
1 、依赖: c3p0-spring-boot-starter stater 主要导入自定义启动器模块和相关依赖,不需要编写任何的代码;
2 、配置数据源;
spring:
datasource:
c3p0:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC
username: root
password: 123456
3 、在单元测试类中注入数据源,测试获取数据库连接,最后再测试连接数据库是否成功。
@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.propertiesapplication.yml 中的配置信息。
  • 条件判断:SpringBoot 会根据条件判断机制,判断是否满足特定的条件,以确定是否需要自动配置相关的 Bean
  • 装配:如果满足条件,SpringBoot 会自动配置和装配相关的 Bean,并将它们注册到 Spring 的应用上下文中。
  • 使用:可以直接在应用程序中使用这些被自动配置的 Bean,而无需手动进行配置和装配。 通过自动装配,SpringBoot 大大简化了应用程序的配置和开发过程,提高了开发效率。同时 SpringBoot也提供了很多可扩展的自定义配置选项,可以根据实际需求进行定制和调整。总的来说 SpringBoot的自动装配原理是基于扫描、配置、条件判断、装配和使用等步骤,通过自动读取配置文件和解析注解的方式,实现了自动配置和装配相关的 Bean,简化了应用程序的配置和开发过程。
4.2  SpringBoot 应用启动原理

 SpringBoot 的启动过程都是通过@SpringBootApplication 注解和 SpringApplication.run 方法来实现的,一般会使用 ApplicationEvent 事件机制搞事环境当前应用的状况。 启动过程可以概括为:

1 、 通 过 SpringFactoriesLoader 加 载 META-INF/spring.factories 文 件 , 获 取 并 创 建  
SpringApplicationRunListener 对象。然后由 SpringApplicationRunListener 来发出 starting 消息。
2 、 创建 参数 ,并 配置 当前 SpringBoot 应用 将要 使用 的 Environment 。完 成之 后, 依然 由
SpringApplicationRunListener 来发出 environmentPrepared 消息。
3 、创建 ApplicationContext 。初始化 ApplicationContext 并设置 Environment ,加载相关配置等。然后由 SpringApplicationRunListener 来发出 contextPrepared 消息,告知 SpringBoot 应用使用的 ApplicationContext 已准备完毕。
4 、 将 各 种 beans 装 载 入 ApplicationContext , 继 续 由 SpringApplicationRunListener 来 发 出contextLoaded 消息,告知 SpringBoot 应用使用的 ApplicationContext 已装填完毕
5 refresh ApplicationContext ,完成 IoC 容器可用的最后一步,由 SpringApplicationRunListener 来发出 started 消息。完成最终的程序的启动。
6 、最后由 SpringApplicationRunListener 来发出 running 消息,告知程序已运行起来了。
4.3  @SpringBootApplication 注解

 @SpringBootApplication 注解实际上是 SpringBoot 提供的一个复合注解,由三个注解组成:

1 @SpringBootConfiguration 来源于 @Configuration ,二者功能都是将当前类标注为配置类,并将当前类里以@Bean 注解标记的方法的实例注入到 srping 容器中。可以在主类种添加各种受管 bean 定义。
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
2 @EnableAutoConfiguration 启 用 自 动 配 置 其 可 以 帮 助 SpringBoot 应 用 将 所 有 符 合 条 件 的 @Configuration 配置都加载到当前 IoC 容器之中。
@Import({AutoConfigurationImportSelector.class})
3 @ComponentScan 对应于 XML 配置形式中的 <context:component-scan> ,用于将一些标注了特定注解的 bean 定义批量采集注册到 Spring IoC 容器之中,这些特定的注解大致包括: @Controller 、@Component、 @Service @Repository
注:因此 @SpringBootApplication 注解主要作为一个配置类,能够触发包扫描和自动配置的逻辑,而使得 SpringBoot 的相关 bean 被注册进 Spring 容器。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值