一、微服务发展进程
是一种架构风格,将业务拆分成模块,部署在不同的主机上提供结构,提供服务,通过http的方式通信.
1、发展历程(单体应用程序)
将一个应用的所有应用服务都封在一个应用中,无论什么系统,都把数据库访问,web访问,各个功能放在一 个war包内.
好处:①架构简单,项目开发成本低.②所有项目模块部署到一起,对于小型项目来说,维护方便.缺点:①所有模块耦合在一起,虽然对于小型项目来说,维护方便.但是,对于大型项目来说,却是不易开发和维护的.②项目的各模块之前过于耦合,如果一旦有一个模块出现问题,则整个项目将不可用.③无法针对某个具体模块来提升性能.④无法对项目进行水平扩展
(1)水平扩展与垂直扩展
假设有 3 辆卡车 , 每辆车一小时可以运 25 根木材 , 怎么做来使我们每小时可以处理 150 根木材 ?垂直拓展:01. 让每辆卡车的运输量增加一倍01. 让每辆卡车的运输时间减半通过增加系统成员的生产效率来获得期望的负荷量 .水平拓展:01. 增加卡车的数量来运送木材通过增加更多的卡车来提高系统的能力 .
2、发展历程(垂直应用架构)
好处:①系统进行了拆分 , 可根据不同系统的访问情况 , 有针对性的进行优化 .②能够实现应用的水平扩展 .③各系统能够分担整体访问的流量 , 解决了并发问题 .④一个系统发生了故障 , 不应用其他系统的运行情况 , 提高了整体的容错率 .缺点:①拆分后的各系统之间相对比较独立 , 无法进行互相调用 .②各系统难免存在重叠的业务 , 会存在重复开发的业务 , 后期维护比较困难 .
3、发展历程(分布式架构)
好处:①将重复的业务代码抽象出来 , 形成公共的访问服务 , 提高了代码的复用性 .②可以有针对性的对系统和服务进行性能优化 , 以提升整体的访问性能 .缺点:①系统之间的耦合度变高 , 调用关系变得复杂 , 难以维护 .②系统之间交互需要远程通信 , 接口发开增加工作量
集群与分布式垂直拆分(分布式 ): 就是多个子系统互相协作才能完成整个业务流程 , 系统之间需要进行通信 .水平扩展(集群 ): 就是同一个工程部署到多台服务器上 .
4、发展历程(SOA架构)
好处:使用注册中心解决了各个服务之间的服务依赖和调用关系的自动注册与发现 .缺点:服务之间的依赖与调用关系复杂 , 测试部署的困难比较大 .
5、发展历程(微服务架构)
好处:①服务彻底拆分 , 各服务独立打包、独立部署和独立升级 .②每个微服务负责的业务比较清晰 , 利于后期扩展和维护 .③微服务之间可以采用 REST 和 RPC 协议进行通信 .缺点:①涉及到各服务的容错性问题 .②涉及到数据的一致性问题 .③涉及到分布式事务问题
6、SOA架构和微服务架构的区别
推荐观看:https://martinfowler.com/articles/microservices.html
二、SpringBoot
01. 简化的配置①在 Spring 应用中 , 用户将会使用到不同的技术组件 , 包括: JDBC 数据源 (DBCP,Druid) 、消息队列 (RabbitMQ)、文件系统以及应用缓存 (Redis) 等 .②开发人员需要在需要这些功能时 , 停下来 , 仔细分析一下自己究竟需要什么?需要的内容属于哪个依赖 (“哦 , 我需要 MyBatis 依赖 ” ) , 然后花费大量的时间在依赖组织和排除上 .③SpringBoot 提供了功能 ( 一批 jar 包依赖 ) 的依赖 (starter), 它让开发人员声明需要的功能 , 而不用去关系究竟 如何处理依赖关系.02. 应用打包①SpringBoot 是一组 jar 包和符合其约定的配置的构建块 , 因此它不会运行在现有的应用服务器中 , 而使用②SpringBoot 的大多数开发人员更喜欢的是直接运行的这种自包含的 jar 包。
三、使用SpringBoot
方式二: 使用IDEA
新建新模块/新项目->Spring Initializr
版本说明 : SNAPSHOT :快照版,表示开发版本,随时可能修改M1(Mn): M 是 milestone 的缩写,也就是里程碑版本RC1 ( RCn ): RC 是 release candidates 的缩写,也就是发布预览版Release :正式版,也可能没有任何后缀也表示正式版操作 : 编写 Controller 完成访问导入 web 启动器 (starter)banner 修改pompom 中依赖版本 ( 父依赖 )pom 中的启动器主启动类@SpringBootApplication 标识启动类@ComponentScan 开启组件扫描@Configuration 标识配置类(替代XML配置文件)@SpringBootConfiguration 标识配置类(是对@Configuration注解进行了包装,本质上依然是@Configuration注解)@EnableAutoConfiguration 开启自动配置(从classpath中搜索所有META-INF/spring.factories配置文件然后,将其中org.springframework.boot.autoconfigure.EnableAutoConfigurationkey对应的配置项加载到spring容器 只有spring.boot.enableautoconfiguration为true(默认为true)的时候,才启用自动配置)@AutoConfigurationPackage 自动配置包(将添加该注解的类所在的package作为自动配置package进行管理)
四、SpringBoot基本启动
没有修改pom.xml运行的结果:
修改pom.xml
增加:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
它会自动帮你集成Tomcat和ssm
新建成功后,自动出现的目录
controller必须与上面类在同一个包下,不然不会识别。
controller包下新建TestController.java
package com.mwy.code.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@RequestMapping("/home")
public String home(){
return "yes";
}
}
pom.xml中增加后,程序就变成了web程序了,
运行结果:
五、自动配置原理与yml注入
list :- jack- rose- marymap : { k1 : v1 , k2 : v2 }
1、原始配置文件修改路径:
resources下的application.properties
# 应用名称 spring.application.name=SpringBoot02 server.port=8088
推荐格式:yml文件
resources下的新建application.yml
声明文件名字必须是application
server: port: 8086 name: mwy
2、做依赖注入
com.mwy.code下新建pojo软件包新建Student类
package com.mwy.code.pojo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Student {
@Value("${name}")
private String name;
private String password;
}
src/test/java/com.mwy.code.SpringBoot02ApplicationTests.java
package com.mwy.code;
import com.mwy.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);
}
}
测试结果:
看到内容的:
修改Student.java
package com.mwy.code.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
@Value("${name}")
private String name;
private String password;
}
测试结果:
修改 Student .java
package com.mwy.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;
@Component
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties(prefix = "student")
public class Student {
private String name;
private String password;
private String sex;
private String age;
}
修改application.yml:
server: port: 8086 student: name: mwy password: 123 sex: 女 age: 18
测试结果:
解决Student爆红:增加pom依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
5、跨文件加载
yml中支持松散绑定假如Student的属性都是驼峰命名
package com.mwy.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;
@Component
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties(prefix = "student")
public class Student {
// 完成学生的yml注入
// list/Set/Map/String/Boolean/int
private String userName;
private String userPassword;
private String userSex;
private String userAge;
}
那么application.yml必须是:
server:
port: 8086
student:
user_name: mwy
user_password: 123
user_sex: 女
user_age: 18
得到结果:
六、多环境配置
1、多环境配置
格式命名必须是:application
application.yamlapplication-dev.yamlapplication-test.yaml
spring :profiles :active : test
2、配置文件加载位置
1. config/application.properties (项目根目录中 config 目录下)2. config/application.yml3. application.properties (项目根目录下)4. application.yml5. resources/config/application.properties (项目 resources 目录中 config 目录下)6. resources/config/application.yml7. resources/application.properties (项目的 resources 目录下)8. resources/application.yml
新增application-dev.yml
server: port: 8086
修改application.yml
student: user_name: mwy user_password: 123 user_sex: 女 user_age: 18 spring: profiles: active: dev
结果
最终运行:
@ConfigurationProperties,@EnableConfigurationProperties@ConfigurationProperties 会让元素加载配置文件中的内容 , 但是需要成为组件才能实现内容的读取之前的文件中 , 我们是通过在类中加上 @component 注解使其自动加载如果类上没有 @component 等注解 , 则可以通过在其他的组件上加上@EnableConfigurationProperties 来完成对应元素的组件化@Configuration 也是一个组件使用 @ConditionalOnProperty 完成演示public @interface ConditionalOnProperty {// 数组,获取对应 property 名称的值,与 name 不可同时使用String [] value () default {};// 配置属性名称的前缀,比如 spring.http.encodingString prefix () default "" ;// 数组,配置属性完整名称或部分名称// 可与 prefix 组合使用,组成完整的配置属性名称,与 value 不可同时使用String [] name () default {};// 可与 name 组合使用,比较获取到的属性值与 havingValue 给定的值是否相同,相同才加载配置 String havingValue () default "" ;// 缺少该配置属性时是否可以加载。如果为 true ,没有该配置属性时也会正常加载;反之则不会生效boolean matchIfMissing () default false ;}
结束结束