三万字图文归纳整理分布式系统微服务
上一篇:微服务架构设计总结实践
大家好,我是顶级架构师。
目录
一、架构设计相关
二、SpringCloud
三、Dubbo
四、SpringBoot
一、架构设计相关
0. 什么是微服务?什么是分布式系统?什么是集群?
比如在淘宝买东西,会有一个商品展示的系统,看到合适的商品了就会下单这是会有一个订单系统,下单完成了就进入发货阶段,这个时候就会有一个物流系统,买东西就形成了一个分布式系统,而每个系统又由多个微服务组成,所以微服务是构建分布式系统的一种架构方式,当买东西的人多了,系统就会出现慢的现象,这个时候就需要把每个系统里面的微服务多部署几台机器来承载更多的请求,这样就形成了集群。
1. RPC和RPC框架
RPC的核心过程包括了客户端和服务端的通讯协议,寻址,数据序列化/反序列化;
2. 序列化方式及作用
反序列化:将可以在网络上传输和可以在磁盘上存储的格式(流)的数据转为java对象或者内存中其他形式的数据。
序列化方式: json,jdk serializable, Hessian,Dubbo, Protobuf。
序列化的作用:压缩、持久化存储、跨网络传输。
3. 分布式系统中事务的处理
3.1 事务相关必了解的概念:
AP(放弃C):放弃强一致性,用最终一致性来保证。
CP(放弃A):一旦系统遇见故障,受到影响的服务器需要等待一段时间,在恢复期间无法对外提供服务。
Machine1-db1-tbl_person、tbl_order
Machine2-db2-tbl_person、tbl_order
Machine3-db3-tbl_person、tbl_order
1)当向machine1的db1的表tbl_person、tbl_order插入数数据时,同时要把插入的数据同步到machine2、machine3,这就是一致性
2)当其中的一台机器宕机了,可以继续对外提供服务,把宕机的机器重新启动起来可以继续服务,这就是可用性
3)当machine1的机器坏了,数据全部丢失了,不会有任何问题,因为machine2和machine3上还有数据,重新加一台机器machine4,把machine2和machine3其中一台机器的备份数据同步过来就可以了,这就是分区容错性
S(Soft state)软状态:允许分布式系统出现中间状态。而且中间状态不影响系统的可用性。
这里的中间状态是指不同的数据复制data replication之间的数据更新可以出现延时的最终一致性。如CAP理论里面的示例,当向machine1的db1的表tbl_person、tbl_order插入数数据时,同时要把插入的数据同步到machine2、machine3,当machine3的网络有问题时,同步失败,但是过一会网络恢复了就同步成功了,这个同步失败的状态就称为软状态,因为最终还是同步成功了。
E(Eventually Consistent)最终一致性:数据复制data replications经过一段时间达到一致性。
3.2 分布式事务实现方式:
2. 后台任务定期校对数据;
3. 通过消息队列,实现最终一致(确保消息到达MQ,幂等性);
4. TCC机制(Try,Confirm,Cancel)
Try 阶段主要是对业务系统做检测及资源预留 Confirm 阶段主要是对业务系统做确认提交,Try阶段执行成功并开始执行 Confirm阶段时,默认 Confirm阶段是不会出错的。即:只要Try成功,Confirm一定成功。 Cancel 阶段主要是在业务执行错误,需要回滚的状态下执行的业务取消,预留资源释放。
我们有一个本地方法,里面依次调用
1、首先在 Try 阶段,要先调用远程接口把 Smith 和 Bob 的钱给冻结起来。
2、在 Confirm 阶段,执行远程调用的转账的操作,转账成功进行解冻。
3、如果第2步执行成功,那么转账成功,如果第二步执行失败,则调用远程冻结接口对应的解冻方法 (Cancel)。
参考文章:聊聊分布式事务,再说说解决方案:https://www.cnblogs.com/savorboard/p/distributed-system-transaction-consistency.html
4. 系统监控
Spring‐Cloud‐Sleuth + Zipkin
Sleuth收集微服务之间的接口调用信息以及内部方法调用。通过采样之后,将数据传输致Zipkin,由Zipkin负责存储和可视化查询;
· cs-Client Sent:客户端发出一个请求,描述的是一个 Span 开始;
· sr-Server Received:服务端接收请求,利用 sr-cs 就属于发送的网络延迟;
· ss-Server Sent:服务端发送请求(回应处理),ss-sr 就属于服务端的消耗时间;
· cr-Client Received:客户端接收到服务端数据,cr-ss 就表示回复所需要的时间。
ELK
1)ElasticSearch搜索服务器,提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。
2)Logstash是可以对日志进行收集、过滤、分析,并将其存储供以后使用;
3)Kibana 是Elasticsearch前端展示工具,可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志
搭建方式参考资料: https://www.cnblogs.com/kevingrace/p/5919021.html
Metrics:度量;我们需要为某个系统某个服务做监控、做统计,就需要用到Metrics;代码执行的吞吐量,响应时间,并发量,瞬时状态值。
5. 高可用
多实例:一个服务部署多个实例,通过负载均衡机制降低单实例的负载以及实现容错;
自检测:系统预留健康检查接口,通过docker集群模式的健康检查机制来实现自动重启和预警;
自恢复:对于网络抖动的问题,需要程序有一定的容错性,比如:熔断机制,Eureka的自我保护措施;
快速扩容:互联网应用的特殊性,在特定时候会出现高峰期的海量请求,此时,需要我们的分布式系统能够快速扩容。docker的服务编排就可以实现已有硬件资源的情况下秒扩容;
对于硬件资源,需要结合云计算技术来实现;
6. 服务调用的负载均衡
优势:屏蔽了微服务地址多变的复杂性,统一管理,控制;对外部调用友好;
劣势:性能要求高,流量大对负载服务本身有很高的要求;管理复杂,大多数服务端负载器需要手工配置服务实例信息;
# 客户端负载均衡:
由客户端自己选择目标服务器,直调对应的地址;dubbo(源码参考com.alibaba.dubbo.rpc.cluster.LoadBalance),springcloud(ribbon)都是客户端负载均衡;
优势:性能好,可以根据具体应用微调负载策略;易管理,服务实例信息自发现
劣势:服务实例信息在多客户端之间的不同步;通常是集群内部使用;
类似产品有很多:360 Qconf,百度 Disconf,淘宝 Diamond 参考:https://www.cnblogs.com/zhangxh20/p/5464103.html
一旦使用了 SpringCloudConfig 之中,现在的项目的中心就变为了 SpringCloudConfig 服务; 为了解决配置文件的安全问题,在 SpringCloudConfig 之中还提供有一个所谓的安全加密处理,例如:一些重要的密码有可能需要被加密,所以可以使用两种加密处理(密钥处理、jks 安全处理)。
服务注册:服务提供者启动实例时,将信息存储到注册中心;
注册中心:保存服务提供者或者消费者的实例信息(服务名称,IP,端口,方法地址等等)
服务发现:服务消费者,通过服务名在注册中心的信息中查询出具体的服务提供者实例信息。
9. 分布式系统如何拆分?
技术栈(php,java,nodejs,go)
二、SpringCloud
1. 微服务是如何保护自己的
对代码侵入性很小。因为微服务集群不直接对外提供服务,由统一的网关来提供业务API(zuul,nginx都可以的)。
2. 客户端 ‐> 微服务 ‐> 校验token
长度有限,不能撤销,需要设置过期时间;
# 可以在网关层做;也可以构建成通用的组件,放在每个微服务上面去做;
# 根据不同的业务场景:token可以发放一次,也可以在每次请求的时候去申请,这样能够实现分控需要的账户禁用,黑名单等功能
2. 微服务网关
三个重要概念:动态路由表,路由定位,反向代理
反向代理:客户端请求到网关,网关受理后,再对目标服务发起请求,拿到响应之后,再响应给客户端;
动态路由表:zuul支持eureka路由,手动配置的路由,这两种都支持动态更新;
路由定位:根据请求路径,zuul有一套自身的服务定位规则以及路由匹配的表达式;
3. 各服务之间如何调用
Fegin是cloud提供的一种服务调用客户端;
Resttemplate也可以快速的发起服务调用;
同时,也可以手动获取对应接口的具体地址,通过平常的httpclient进行调用;
# Feign和Resttemplate 都可以集成负载均衡,失败重试,熔断的功能;
4. 如何保证服务健康的情况
3. 日志信息也是我们监控服务监控情况的一个重要手段,常用通过ELK实现日志收集,分析和查看;
4. 在通过docker部署微服务时,我们可以利用docker的健康检查机制,实现服务的自动重启;
5. 容错机制
通过服务名获取实例信息,根据负载策略选择合适的实例去访问;
服务调用失败时,可以配置重试次数,以及实例切换的次数;
# Hystrix熔断机制
限流:限制接口访问并发量,限制缓冲区大小,超出限制,调用Fallback方法
熔断:出错率超过阈值,一定时间内不再请求该接口。(超时、run方法抛出异常)
降级:凡是没有正常的从接口中拿到数据,就会调用Fallback方法,获取一个结果
一个服务挂了后续的服务跟着不能用了,这就是雪崩效应
对于熔断技术的实现需要考虑以下几种情况:
· 出现错误之后可以 fallback 错误的处理信息;
· 如果要结合 Feign 一起使用的时候还需要在 Feign(客户端)进行熔断的配置。
6. SpringCloud中的服务注册与发现机制
server提供httpapi服务,存储服务实例的信息,并且具备主动剔除服务(心跳检测)和server高可用的功能;
client集成在具体的微服务中,在服务启动时,将服务实例信息post到server上;client也会定时同步server上面其他service信息;
# eureka的工作大多是后台thread在定时工作,任务执行的间隔时间都可以通过配置文件进行配置;
7. SpringCloud的实施推广
微服务改造的过渡期,在传统的SpringMvc项目中,引入部分SpringCloud的特性,即可通过微改造变成微服务;
# 其他语言的项目加入SpringCloud微服务系统
Eureka提供HttpApi,使得非java语言加入到SpringCloud微服务集群成为可能;
三、Dubbo
注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
新的服务将无法发现;服务下架后仍旧有被调用的可能;
连接注册中心:消费者动态发现服务提供者,实现软负载均衡和集群容错;
直连:不能动态增减提供者;开发、测试环境可通过指定Url方式绕过注册中心直连指定的服务地址,快速测试;另外,搜索公众号顶级python后台回复“进阶”,获取一份惊喜礼包。
3. dubbo服务的容错机制
# http://dubbo.io/books/dubbo‐user‐book/demos/fault‐tolerent‐strategy.html
Failover Cluster:失败自动切换,当出现失败,重试其它服务器,默认两次;
Failfast Cluster:失败立即报错
Failsafe Cluster:失败安全,出现异常时,直接忽略
Failback Cluster:失败自动恢复,后台记录失败请求,定时重发
Forking Cluster:并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源
Broadcast Cluster:播调用所有提供者,逐个调用,任意一台报错则报错
# 要注意分布式事务
3.1 Failover Cluster
失败自动切换,缺省值,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)。
配置如下:
生产者:
<dubbo:service retries="2" />
消费者:
<dubbo:reference retries="2" />
消费者具体到调用生产者的哪个方法:
<dubbo:reference>
<dubbo:method name="findFoo" retries="2" />
</dubbo:reference>
3.2 Failfast Cluster
配置如下:
生产者:
<dubbo:service cluster="failfast" />
<dubbo:reference cluster="failfast" />
3.3 Failsafe Cluster
配置如下:
生产者:
<dubbo:service cluster="failsafe" />
<dubbo:reference cluster="failsafe" />
3.4 Failback Cluster
失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
配置如下:
生产者:
<dubbo:service cluster="failback" />
消费者:
<dubbo:reference cluster="failback" />
3.5 Forking Cluster
配置如下:
生产者:
<dubbo:service cluster=“forking" />
<dubbo:reference cluster=“forking" />
配置如下:
生产者:
<dubbo:service cluster="broadcast" />
<dubbo:reference cluster="broadcast" />
4. 具体问题示例1:关于服务调用超时
全局控制
<dubbo:consumer timeout="1000"></dubbo:consumer>
接口控制
方法控制
服务端
全局控制
<dubbo:provider timeout="1000"></dubbo:provider>
接口控制
方法控制
消费端发起远程请求后,线程不会阻塞等待服务端的返回,而是马上得到一个ResponseFuture(ReponseFuture的实现类:DefaultFuture),消费端通过不断的轮询机制判断结果是否有返回。因为是通过轮询,轮询有个需要特别注要的就是避免死循环,所以为了解决这个问题就引入了超时机制,只在一定时间范围内做轮询,如果超时时间就返回超时异常
5. 服务提供者能实现失效踢出是什么原理
源码参考 RegistryService, 文档参考https://www.jianshu.com/p/f42c69e4bd3e?fromApp=1
# zookeeper ‐ 的临时节点
6. dubbo通讯协议
客户端服务端之间进行数据流转的一种约定,将数据按照标准格式来组装;
# 协议内容
头部信息(调用控制协议16B) + body(序列化)
head = 魔数(2) + 标识(1) + 响应状态(1) + 消息ID(8) + 内容长度(4)
body = dubbo版本 + 服务接口路径 + 服务版本号 + 服务方法名 + 参数描述符 + 参数值序列化 + 隐式参数
7. 大概率的问题
# dubbo文档,仔细阅读一遍,面试官可能随便抽取一个。
1. 服务提供者
package com.alibaba.dubbo.demo;
public interface DemoService {
String sayHello(String name);
}
package com.alibaba.dubbo.demo.provider;
import com.alibaba.dubbo.demo.DemoService;
public class DemoServiceImpl implements DemoService {
public String sayHello(String name) {
return "Hello " + name;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="hello-world-app" />
<!-- 使用multicast广播注册中心暴露服务地址 -->
<dubbo:registry address="multicast://224.5.6.7:1234" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" />
<!-- 和本地bean一样实现服务 -->
<bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" />
</beans>
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Provider {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"http://10.20.160.198/wiki/display/dubbo/provider.xml"});
context.start();
System.in.read(); // 按任意键退出
}
}
2. 服务消费者
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
<dubbo:application name="consumer-of-helloworld-app" />
<!-- 使用multicast广播注册中心暴露发现服务地址 -->
<dubbo:registry address="multicast://224.5.6.7:1234" />
<!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" />
</beans>
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.alibaba.dubbo.demo.DemoService;
public class Consumer {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"http://10.20.160.198/wiki/display/dubbo/consumer.xml"});
context.start();
DemoService demoService = (DemoService)context.getBean("demoService"); // 获取远程服务代理
String hello = demoService.sayHello("world"); // 执行远程方法
System.out.println( hello ); // 显示调用结果
}
}
3. 总结
3.2 对服务消费方隐藏实现
3.3 也可以使用IoC注入
参考文章:https://www.cnblogs.com/leeSmall/p/9824591.html
7.3 dubbo服务注册与发现流程
1. 服务容器负责启动,加载,运行服务提供者。
2. 服务提供者在启动时,向注册中心注册自己提供的服务。
3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败, 再选另一台调用。
6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
四、SpringBoot
1、SpringBoot与SpringMVC差异化在哪
2.Spring MVC是基于 Servlet 的一个 MVC 框架,通过Dispatcher Servlet, ModelAndView解决 WEB 开发的问题.但是它的配置繁琐,大量 .xml、.properties文件。并且用maven管理项目的时候很容易出现jar包冲突。
3.而Spring Boot 是基于Spring的一套快速开发整合包,它不仅仅包含了spring mvc ,还包括 spring JPA、spring security等实现自动配置,降低项目搭建的复杂度.而且自带tomcat.pom.xml 中可以使用 starter的方式配置,简化配置还能解决jar包冲 突问题。
spring-boot-starter-web spring-boot-starter-data-jpa spring-boot-starter-redis
4.但他们的基础都是Spring 的 IOC 和 AOP
5.spring mvc 打包后是war包,spring boot 是jar包
2、为什么说Spring是一个容器
3、常用注解@Required @Autowired @Qualifier @Controller @RequestMapping
@Required
注解作用于Bean setter
方法上,用于检查一个Bean的属性的值在配置期间是否被赋予或设置(populated),否则,容器会抛出一个BeanInitializationException异常。
示例:
package com.jsoft.testspring.testannotationrequired;import org.springframework.beans.factory.annotation.Required;public class Student { private Integer age; private String name;
@Required public void setAge(Integer age){ this.age = age;
}
public Integer getAge(){ return this.age;
}
public void setName(String name){ this.name = name;
}
public String getName(){ return this.name;
}
}
beans.xml:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean id="student" class="com.jsoft.testspring.testannotationrequired.Student">
<property name="name" value="Jim"/>
</bean></beans>
App.java:
package com.jsoft.testspring.testannotationrequired;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;/**
* Hello world!
* */public class App
{ public static void main( String[] args )
{
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
Student student = (Student)applicationContext.getBean("student");
System.out.println(student.getAge());
System.out.println(student.getName());
}
}
而此时的运行结果是出现了错误的,因为age的setter方法没有在bean中注入,而age的setter方法标记了@Required,也就是必须要输入,抛出的异常为:BeanInitializationException。
那么我们将beans.xml补全之后:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean id="student" class="com.jsoft.testspring.testannotationrequired.Student">
<property name="name" value="Jim"/>
<property name="age" value="27"/>
</bean></beans>
此时的运行结果一切正常:
@Autowired自动装配
@Autowired顾名思义,就是自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留。
@Autowired默认按类型匹配的方式,在容器查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。
@Qualifier(指定注入Bean的名称)
如果容器中有一个以上匹配的Bean,则可以通过@Qualifier注解限定Bean的名称
使用 @Controller 定义一个 Controller 控制器
例1:
@Controllerpublic class MyController {
@RequestMapping ( "/showView" ) public ModelAndView showView() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName( "viewName" );
modelAndView.addObject( " 需要放到 model 中的属性名称 " , " 对应的属性值,它是一个对象 " ); return modelAndView;
}
}
< context:component-scan base-package = "com.host.app.web.controller" >
< context:exclude-filter type = "annotation"
expression = "org.springframework.stereotype.Service" />
</ context:component-scan >
例2:
@Controller
@RequestMapping ( "/test" )public class MyController {
@RequestMapping ( "/showView" ) public ModelAndView showView() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName( "viewName" );
modelAndView.addObject( " 需要放到 model 中的属性名称 " , " 对应的属性值,它是一个对象 " ); return modelAndView;
}
}
4、谈谈对AOP的理解
5、怎样开启注解装配
6、描述模板JdbcTemplate RestTemplate
JdbcTemplate :
execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句; update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句; query方法及queryForXXX方法:用于执行查询相关语句; call方法:用于执行存储过程、函数相关语句。
RestTemplate:
7、Spring支持的事务管理类型
8、Spring框架的事务管理有哪些优点
它为编程式事务管理提供了一个简单的API而非一系列复杂的事务API(如JTA).
它支持声明式事务管理。
它可以和Spring 的多种数据访问技术很好的融合。
9、Spring Boot Starter内容及工作原理
让所有的开发者几乎可以零适应进行完整过渡。其次是开发快速、简单、方便
2. @springbootApplication是 @Confifiguration @EnableAutoConfifiguration @ComponentScan 三个注解的组合
3. @EnableAutoConfifiguration
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata,
AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
+ "are using a custom packaging, make sure that file is correct."); return configurations;
}
这个属性配置文件就指明了springboot工程启动的时候需要做哪些自动配置:
# Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer
# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer
# Auto Configuration Import Listeners
org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener
# Auto Configuration Import Filters
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
org.springframework.boot.autoconfigure.condition.OnClassCondition
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\
org.springframework.boot.autoconfigure.elasticsearch.jest.JestAutoConfiguration,\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\
org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\
org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\
org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\
org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\
org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\
org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\
org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\
org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\
org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.DeviceResolverAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.DeviceDelegatingViewResolverAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.SitePreferenceAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityFilterAutoConfiguration,\
org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.OAuth2AutoConfiguration,\
org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\
org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\
org.springframework.boot.autoconfigure.social.SocialWebAutoConfiguration,\
org.springframework.boot.autoconfigure.social.FacebookAutoConfiguration,\
org.springframework.boot.autoconfigure.social.LinkedInAutoConfiguration,\
org.springframework.boot.autoconfigure.social.TwitterAutoConfiguration,\
org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\
org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\
org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration,\
org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration,\
org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration,\
org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration,\
org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration
# Failure analyzers
org.springframework.boot.diagnostics.FailureAnalyzer=\
org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer,\
org.springframework.boot.autoconfigure.jdbc.DataSourceBeanCreationFailureAnalyzer,\
org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer
# Template availability providers
org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.mustache.MustacheTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.web.JspTemplateAvailabilityProvider
上面都是类的全限定名,那么这些类放在哪里呢?就在spring-boot-autoconfiguration.jar下面
从上面可以看出springboot工程一起动,其实自动帮助我们配置很多东西比如(solr、redis、mq、web等等),只不过这些以前是程序员手动通过xml配置的,现在呢,是springboot通过java配置的方式自动帮助我们配置的。
欢迎大家进行观点的探讨和碰撞,各抒己见。如果你有疑问,也可以找我沟通和交流。扩展:接私活儿
最后给读者整理了一份BAT大厂面试真题,需要的可扫码回复“面试题”即可获取。
「顶级架构师」建立了读者架构师交流群,大家可以添加小编微信进行加群。欢迎有想法、乐于分享的朋友们一起交流学习。
扫描添加好友邀你进架构师群,加我时注明【姓名+公司+职位】
版权申明:内容来源网络,版权归原作者所有。如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。
猜你还想看
牛逼!接私活必备的 N 个系统项目!赶快收藏吧(附源码合集第 3 期)!