Spring Boot
约定优于配置
约定优于配置是一种软件设计范式,就是遵循约定
Spring 解决SSM的问题
- 起步依赖,将具备某种功能的依赖坐标打包
- 自动配置,springboot 自动配置bean,可以直接使用
Spring入门
spring-boot-starter-parent
- 指定项目编码utf-8
- 指定JDK1.8 版本
- 对项目依赖的版本进行管理,当前项目引入其他常用依赖不需要指定版本号
- 默认的资源过滤和插件管理
spring-boot-starter-web
引入 spring web和spring mvc 相关的依赖
SpringBoot的启动类
SpringBoot的启动类通常放在二级包中,比如:com.lagou.SpringBootDemo1Application 。 因为SpringBoot项目在做包扫描,会扫描启动类所在的包及其子包下的所有内容。
//标识当前类为SpringBoot项目的启动类
@SpringBootApplication
public class SpringBootDemo1Application {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemo1Application.class,args); }
}
整合mybatis
注解方式
- 创建一个对t_comment表数据操作的接口CommentMapper
public interface CommentMapper {
@Select("SELECT * FROM t_comment WHERE id =#{id}") public Comment findById(Integer id);
}
- 在Spring Boot项目启动类上添加@MapperScan("xxx")注解
@SpringBootApplication
@MapperScan("com.lagou.mapper")
public class Springboot02MybatisApplication {
public static void main(String[] args){
SpringApplication.run(Springboot02MybatisApplication.class, args);
}
}
配置文件方式
- 创建一个用于对数据库表t_article数据操作的接口ArticleMapper
@Mapper
public interface ArticleMapper {
public Article selectArticle(Integer id);
}
- 创建XML映射文件
- 配置XML映射文件路径
mybatis:
#配置MyBatis的xml配置文件路径
mapper-locations: classpath:mapper/*.xml #配置XML映射 #文件中指定的实体类别名路径
type-aliases-package: com.lagou.base.pojo
单元测试
@SpringBootTest,标记当前类为SpringBoot测试类,加载项目的ApplicationContext 上下文环境
@RunWith(SpringRunner.class) 指定运行器,
热部署
- 添加SpringBoot热部署依赖
- 开启idea自动编译,Settings->Compiler->Build project automatically
- 开启idea运行中自动编译,Mac option+Command+Shift+/, Win Ctrl+Shift+Alt+/,勾选 compiler.automake.allow.when.app.running
全局配置文件
- application.properties
- application.yaml
- application.yml
application.yml,application.properties,application.yaml可以共存
加载顺序 yml < yaml < properties,后加载的会覆盖先加载文件中相同配置的内容
@ConfigurationProperties(prefix=“person”)
,配置文件中所有以person开头的配置信息注入当前类
- 配置文件person的属性和实体类属性名一致
- Person类属性有set方法
@Value注解
支持基本数据类型和String。${person.name} 取出配置文件中的person.name
注入
@Value(“${person.name}”)
private String name;
加载自定义配置文件
@PropertysSource("classpath:my.properties") // 自定义配置文件 my.properties
@ConfigurationProperties(prefix=“person”) //属性值注入
class Product {
...
}
配置类
// 标识当前类是配置类,springboot会扫描该类,所有标识@Bean注解返回值注入容器
@Configuration
public class MyConfig {
@Bean
public MyService myservice(){
return new MyService();
}
}
// 测试配置类是否成功,ApplicationContext导入spring包
@Autowired private ApplicationContext applicationContext; @Test
public void iocTest(){
System.out.println(
applicationContext.containsBean("myService));
}
SpringBoot原理剖析
依赖管理
springboot项目 → spring-boot-starter-parent → spring-boot-dependeencies(定义了依赖版本,引入其他相关依赖,可以不指定版本)
SpringBoot视图
Thymeleaf
标准表达式
变量表达式
${…}选择变量表达式
*{…},选定对象取属性值
titile: 标题.
Thymeleaf 使用
template中的页面不能直接访问,需要通过控制器
静态资源
SpringBoot 依次从resouces目录下的public,resouces,static 寻找静态资源
Spring Boot项目部署
- 需要添加打包组件将项目中的资源、配置、依赖包打到一个jar包中;可以使用maven的 package 命令
- 部署:java -jar 包名
微服务架构
服务拆分粒度更小,关键在于微小,独立,轻量级通信
微服务优缺点
优点
- 微服务很小,便于特定业务功能聚焦
- 解耦,实施敏捷开发
- 重用和模块组装
- 微服务独立,松耦合
缺点
- 分布式复杂难以管理,治理困难
- 分布式链路追踪难
熔断
熔断即断路保护。下游服务访问压力过大,上游服务切断对下游服务调用,保护系统可用性
Spring Cloud
一系列框架的有序集合,是一个规范(有哪些功能组件,组件之间怎么配合)。利用springboot 简化了分布式系统基础设施的开发。
Spring Cloud解决的问题
- 微服务服务注册发现
- 熔断
- 服务调用
- 负载均衡
- 选举和集群管理
- 分布式消息传递平台
MyBatis-Plus
继承BaseMapper
核心组件
网关
所有服务的入口,每个请求都会到达网关
服务注册中心 Eureka
微服务的名称,IP,端口号
配置中心
对配置文件统一管理
服务注册中心 Eureka
本质是为了解耦服务提供者和服务消费者
Eureka集群
搭建Eureka集群应用名称一样
服务提供者改造
@Autowired private DiscoveryClient discoveryClient;
//1.获得Eureka中注册的lagou-service-product实例集合
List instances = discoveryClient.getInstances("lagou-service-product");
//2.获得实例集合中的第一个
ServiceInstance instance = instances.get(0);
//3.根据实例信息拼接IP地址
String host = instance.getHost();
int port = instance.getPort();
String url = "http://"+host+":"+port+"/product/query/"+id;
Eureka元数据
- 标准元数据 主机名,ip,端口
- 自定义元数据 eureka.instance.metadata-map配置,符合KEY/VALUE的存储格式
Ribbon负载均衡
客户端负载均衡
负载均衡策略:
默认区域权衡策略:先过滤,再轮训
服务雪崩效应
是一种因“服务提供者的不可用”(原因)导致“服务调用者不可用”(结果),并将不 可用逐渐放大的现象。
扇入:该服务被调用
扇出:该服务对下游调用
雪崩效应解决方案
- 服务熔断
- 服务降级
@HystrixCommand( // 线程池标识,要保持唯一,不唯一的话就共用
// commandProperties熔断的一些细节属性配置commandProperties = {
// 每一个属性都是一个HystrixProperty
@HystrixProperty(name =
},
// 回退方法
fallbackMethod = "myFallBack"
)
@RequestMapping("/getPort3") public String getProductServerPort3() {
String url = "http://lagou-service-product/server/query";
return restTemplate.getForObject(url, String.class); }
/* 定义回退方法,返回预设默认值 * 注意:该方法形参和返回值与原始方法保持一致 */
public String myFallBack() { return "-1"; // 兜底数据 }
- 服务限流
Hystrix
Hystrix舱壁模式
不进行任何设置,所有熔断方法使用一个Hystrix线程
池(10个线程)
queueSizeRejectionThreshold属性,这个属性是控制队列最大阈值的,而Hystrix默认只配置了5个
Feign远程调用
轻量级RESTful 风格的HTTP 服务客户端(发起请求,远程调用)
Fegin = RestTemplate+ Ribbon+Hystrix
将调用一个 微服务的信息都定义在一个Feign接口中。
对熔断器支持
设置超时时间 Ribbon Hystrix ,熔断的时候是根据这两个时间的最小 值来进行的。
GateWay
#网关的配置 cloud:
gateway:
routes: #配置路由
- id: service-page-router
uri: http://127.0.0.1:9100
predicates: #当断言成功后,交给某一个微服务处理时使用的是转发
- Path=/page/**
- id: service-product-router
uri: http://127.0.0.1:9000
predicates:
- Path=/product/**
filters:
# http://127.0.0.1:9300/product/service/port--> /service/port -->商品微服务
- StripPrefix=1 #去掉uri中的第一部分,所以就要求我们通过网关访问的时候,把uri 的第一部分设置为product,从uri的第二部分开始才是真正的uri
网关过滤器
实现自定义过滤器,要实现GlobalFilter,Ordered(过滤顺序)接口
Spring Cloud Config分布式配置中心
config和bus实现配置自动更新
实现一次通知,处处生效
在微服务架构中,结合消息总线(Bus)实现分布式配置的自动更新(Spring Cloud Config + Spring Cloud Bus)
Spring Cloud Alibaba
Nacos
Nacos数据模型
一个命名空间中可以定义多个group,各个分组相互隔离。
一个group可以定义多个 service/dataid
Namespace + Group + Service 如同 Maven 中的GAV坐标,GAV坐标是为了锁定Jar,而这里是为了锁定服务
Namespace + Group + DataId 如同 Maven 中的GAV坐标,GAV坐标是为了锁定Jar,而这里是为了锁定配置文件
流量防卫兵Sentinel
流量控制,熔断降级
链路限流
指定入口资源,进行限流统计时,只统计入口进来的流量
Warm Up 预热
场景项目刚上线时,缓存还没有加载。预热时长默认为秒,10s内属于预热期,预热期的阈值是设定阈值的 1/3
降级
流控是对外部来的大流量进行控制,熔断降级的视角是对内部问题进行处理。
RT: 请求平均的响应时间
访问一个资源,1s持续进入 5个或以上请求,平均响应时间 > RT,
触发熔断,接下来的时间窗口处于熔断降级状态,时间窗口结束后,恢复正常