目录
一、微服务
1.什么是微服务?
01.发展历程(单体应用程序)
02.发展历程(垂直应用架构)
?
03.发展历程(分布式架构)
?
05.发展历程(微服务架构)
SOA架构和微服务架构的区别
微服务架构 = 80%的SOA服务架构思想 + 100%的组件化架构思想 + 80%的领域建模思想?
二、构建springBoot项目
②、pom依赖
springBoot主启动类注解:
三、自动配置原理与yml注入
比较
①、依赖注入
四、多环境配置
①、命名要求:
②、可以通过 spring.profiles.active=profile 来完成配置指定
一、微服务
1.什么是微服务?
是一种架构风格 , 将业务拆分成模块 , 部署在不同的主机上提供结构 , 提供服务 , 通过 http 的方式通信
2.发展历程(单体应用程序---》垂直应用架构--》分布式架构--》SOA架构--》微服务架构)
01.发展历程(单体应用程序)
单体应用程序: 将一个应用的所有应用服务都封在一个应用中 , 无论什么系统 , 都把数据库访问 ,web 访问 , 各个功能放在一 个war 包内
好处: ①架构简单, 项目开发成本低 . ②所有项目模块部署到一起, 对于小型项目来说 , 维护方便 . 缺点: ①所有模块耦合在一起 , 虽然对于小型项目来说 , 维护方便 . 但是 , 对于大型项目来说 , 却是不易开发 和维护的 . ②项目的各模块之前过于耦合 , 如果一旦有一个模块出现问题 , 则整个项目将不可用 . ③无法针对某个具体模块来提升性能 . ④无法对项目进行水平扩展 .
02.发展历程(垂直应用架构)
垂直应用架构: 随着企业业务的不断发展 , 发现单节点的单体应用不足以支撑业务的发展 , 于是企业会将单体应用部署多 份 , 分别放在不同的服务器上 . 但是 , 此时会发现不是所有的模块都会有比较大的访问量 . 如果想针对项目中的某些模块进行优化和性能提 升, 此时对于单体应用来说 , 是做不到的 . 于是垂直应用架构诞生了 . 垂直应用架构, 就是将原来一个项目应用进行拆分 , 将其拆分为互不想干的几个应用 , 以此来提升系统的整体性能.
我们将单体应用架构拆分为垂直应用架构之后?,?一旦访问量变大?,?我们只需要针对访问量大的业务增加服务器节点即可,?无需针对整个项目增加服务器节点了?
好处: ①系统进行了拆分 , 可根据不同系统的访问情况 , 有针对性的进行优化 . ②能够实现应用的水平扩展 . ③各系统能够分担整体访问的流量 , 解决了并发问题 . ④一个系统发生了故障 , 不应用其他系统的运行情况 , 提高了整体的容错率 缺点: ①拆分后的各系统之间相对比较独立 , 无法进行互相调用 . ②各系统难免存在重叠的业务 , 会存在重复开发的业务 , 后期维护比较困难
03.发展历程(分布式架构)
分布式架构: 我们将系统演变为垂直应用架构之后 , 当垂直应用越来越多 , 重复编写的业务代码就会越来越多 . 此时 , 我们需要将重复的代码抽象出来 , 形成统一的服务供其他系统或者业务模块来进行调用 , 系统就会演变为分布式架构. 在分布式架构中, 我们会将系统整体拆分为服务层和表现层 . 服务层封装了具体的业务逻辑供表现层调用 , 表现层则负责处理与页面的交互操作.
好处: ①将重复的业务代码抽象出来 , 形成公共的访问服务 , 提高了代码的复用性 . ②可以有针对性的对系统和服务进行性能优化 , 以提升整体的访问性能 . 缺点: 系统之间的耦合度变高 , 调用关系变得复杂 , 难以维护 . 系统之间交互需要远程通信 , 接口发开增加工作量
04.发展历程(SOA架构) 集群与分布式 垂直拆分 ( 分布式 ): 就是多个子系统互相协作才能完成整个业务流程 , 系统之间需要进行通信 . 水平扩展 ( 集群 ): 就是同一个工程部署到多台服务器上 . SOA架构: 在分布式架构下 , 当部署的服务越来越多 , 重复的代码就会越来越多 , 对于容量的评估 , 小服务资源的浪费等 问题比较严重 . 此时 , 我们就需要增加一个统一的调度中心来对集群进行实时管理 . 此时 , 系统就会演变为 SOA (面向服 务)的架构 .
好处:
使用注册中心解决了各个服务之间的服务依赖以及调用关系的自动注册与发现?
.缺点:?
服务之间的依赖与调用关系复杂 , 测试部署的困难比较大
05.发展历程(微服务架构)
微服务架构: 随着业务的发展 , 我们在 SOA 架构的基础上进一步扩展 , 将其彻底拆分为微服务架构 . 在微服务架构下 , 我们将一个大的项目拆分为一个个小的可以独立部署的微服务 , 每个微服务都有自己的数据库?
好处:
服务彻底拆分
,
各服务独立打包、独立部署和独立升级
.
每个微服务负责的业务比较清晰
,
利于后期扩展和维护
.
微服务之间可以采用
REST
和
RPC
协议进行通信
.
缺点:
涉及到各服务的容错性问题
.
涉及到数据的一致性问题
.
涉及到分布式事务问题
SOA架构和微服务架构的区别
①、SOA ( Service Oriented Architecture ) " 面向服务的架构 ": 他是一种设计方法 , 其中包含多个服务 , 服务之间通过相互依赖最终提供一系列的功能 . 一个服务 通常以独立的形式存在与操作系统进程中 . ②、各个服务之间 通过网络调用. ③、MicroServices " 微服务架构 ": 其实和 SOA 架构类似 , 微服务是在 SOA 上做的升华 , 微服务架构强调的一个重点是 “ 业务需要彻底的组件化和服务化 ”, 原有的单个业务系统会拆分为多个可以独立开发、设计、运行的小应用. 这些小应用之间通过服务完成交互和集成
微服务架构 = 80%的SOA服务架构思想 + 100%的组件化架构思想 + 80%的领域建模思想?
二、构建springBoot项目
Spring Boot是一个广泛用来构建Java微服务的框架,它基于Spring依赖注入框架来进行工作
.Spring Boot允许开发人员使用更少的配置来构建微服务,同时框架本身能够尽可能的减少开发人员的冲突.
自动化配置,一般情况下都有默认配置 提供一组流行的starter依赖,方便开发人员使用 简化应用打包 自动化配置,一般情况下都有默认配置
springBoot流程图
①、构建spring initializr项目
???url使用阿里云网站比较好?
②2、点击下一步
②、pom依赖
此处添加依赖时无需添加版本号,此文件spring-boot-dependencies-2.4.1.pom给出了所有的
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zxy</groupId>
<artifactId>springboot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot_02</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.4.1</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<mainClass>com.ysq.code.SpringBoot02Application</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
在这个文件里依赖不需要定义版本号,都是内定好了的
在spring-boot-dependencies文件中
?当敲不出@RestController或者@RequestMapping时,可能是没有web依赖,此时需要在pom文件中添加web依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
springBoot主启动类注解:
@SpringBootApplication 标识启动类 @ComponentScan 开启组件扫描 @Configuration 标识配置类 ( 替代 XML 配置文件 ) @SpringBootConfiguration 标识配置类 ( 是对 @Configuration 注解进行了包装,本质上依然是 @Configuration 注解 ) @EnableAutoConfiguration 开启自动配置 ( 从 classpath 中搜索所有 META-INF/spring.factories 配置文件然后,将其中 org.springframework.boot.autoconfigure.EnableAutoConfiguration key 对应的配置项加载到 spring 容器 只有 spring.boot.enableautoconfiguration 为 true (默认为 true )的时候,才启用自动配置 ) @AutoConfigurationPackage 自动配置包 ( 将添加该注解的类所在的 package 作为自动配置 package 进行管理 )
三、自动配置原理与yml注入
比较
①、yml(支持松散绑定,复杂数据类型) @ConfigurationProperties() 可以通过指定 prefix 指定加载的对象的前缀 如果对象的数据不在 application.xml 中,则需要通过 @PropertySource() 指定文件加载,并且需要配 合 @Value("${xx}") 标签
②、properties(不支持松散绑定) 与上面类似,需要配合 @Value("${xx}") 使用
可在application.properties文件中修改端口号
# 应用名称
spring.application.name=springboot02
#修改端口号
server.port=8081
可删掉这个文件,spring推荐使用yaml文件,文件名缩写为.yml
?使用这个文件写的内容具有层级关系,更易于查看
?优先级关系:先加载 properties 再加载 yml,但是取名都必须是以application开头,后缀可yml,也可properties
1. config/application.properties(项目根目录中config目录下) 2. config/application.yml 3. application.properties(项目根目录下) 4. application.yml 5. resources/config/application.properties(项目resources目录中config目录下) 6. resources/config/application.yml 7. resources/application.properties(项目的resources目录下) 8. resources/application.yml
①、依赖注入
数据:Student
package com.zxy.code.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
@Data
//无参
@NoArgsConstructor
//有参
@AllArgsConstructor
//这个类的属性由student注入,只有yml支持
@ConfigurationProperties(prefix = "student")
public class Student {
// yml与properties都支持
@Value("${name}")
private String userName;
private int userAge;
private List<String> userAihao = new ArrayList<>();
private Map<Integer,String> userMap=new HashMap<>();
}
将属性写入配置文件application.yml
spring:
profiles:
active: dev
student:
user_name: 小明
user_age: 19
user_aihao:
- 跳舞
- 唱歌
- 打游戏
user_map: { 1: 浏览,2: kk }
在Springboot02ApplicationTests.java中注解集成Spring,并且注入数据
package com.zxy.code;
import com.lv.code.pojo.Student;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
//集成spring环境
@ExtendWith(SpringExtension.class)
@SpringBootTest
class Springboot02ApplicationTests {
@Autowired
private Student student;
@Test
void contextLoads() {
System.out.println(student);
}
}
报错:未影响执行,也可打开文档,导入依赖到 pom,xml
?<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
四、多环境配置
①、命名要求:
application.yaml ——》正常情况 application-dev.yaml ——》开发情况 application-test.yaml ——》测试情况
②、可以通过 spring.profiles.active=profile 来完成配置指定
spring: profiles: ?active: test
如:
新建测试文件:application-dev.yaml
server:
port: 8081
?正常总文件就可以直接引用:application.yml
spring:
profiles:
active: dev
student:
user_name:小明
|