SpringBoot启动流程
-
new springApplication对象,利用spi机制加载applicationContextInitializer, applicationLister接口实例(META-INF/spring.factories);
-
调run方法准备Environment,加载应用上下文(applicationContext),发布事件 很多通过lister实现
-
创建spring容器, refreshContext() ,实现starter自动化配置,spring.factories文件加载, bean实例化
SpringBoot自动配置的原理
-
- @EnableAutoConfiguration找到META-INF/spring.factories(需要创建的bean在里面)配置文件
- 读取每个starter中的spring.factories文件
Spring Boot 的核心注解
核心注解是@SpringBootApplication 由以下三种组成
- @SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
- @EnableAutoConfiguration:打开自动配置的功能。
- @ComponentScan:Spring组件扫描。
SpringBoot常用starter都有哪些
spring-boot-starter-web - Web 和 RESTful 应用程序;spring-boot-starter-test - 单元测试和集成测试;spring-boot-starter-jdbc - 传统的 JDBC;spring-boot-starter-security - 使用 SpringSecurity 进行身份验证和授权;spring-boot-starter-data-jpa - 带有 Hibernate 的 Spring Data JPA;spring-boot-starter-data-rest - 使用 Spring Data REST 公布简单的 REST 服务
Spring Boot 的核心配置文件
(1):Application.yml 一般用来定义单个应用级别的,如果搭配 spring-cloud-config 使用
(2).Bootstrap.yml(先加载) 系统级别的一些参数配置,这些参数一般是不变的
Zuul与Gateway区别
(1):zuul则是netflix公司的项目集成在spring-cloud中使用而已, Gateway是spring-cloud的 一个子项目;
(2):zuul不提供异步支持流控等均由hystrix支持, gateway提供了异步支持,提供了抽象负载均衡,提供了抽象流控;理论上gateway则更适合于提高系统吞吐量(但不一定能有更好的性能),最终性能还需要通过严密的压测来决定
(3):两者底层实现都是servlet,但是gateway多嵌套了一层webflux框架
(4):zuul可用至其他微服务框架中,内部没有实现限流、负载均衡;gateway只能用在springcloud中;
Zuul原理分析
(1):请求给zuulservlet处理(HttpServlet子类) zuulservlet中有一个zuulRunner对象,该对象中初始化了RequestContext(存储请求的数据),RequestContext被所有的zuulfilter共享;
(2):zuulRunner中有 FilterProcessor(zuulfilter的管理器),其从filterloader 中获取zuulfilter;
(3):有了这些filter之后, zuulservelet执行的Pre-> route-> post 类型的过滤器,如果在执行这些过滤器有错误的时候则会执行error类型的过滤器,执行完后把结果返回给客户端.
Gateway原理分析
(1):请求到达DispatcherHandler, DispatchHandler在IOC容器初始化时会在容器中实例化HandlerMapping接口
(2):用handlerMapping根据请求URL匹配到对应的Route,然后有对应的filter做对应的请求转发最终response返回去
Zookeeper 工作原理(待查)
Zookeeper 的核心是原子广播,这个机制保证了各个 server 之间的同步。实现这个机制的协议叫做 Zab 协议。Zab 协议有两种模式,它们分别是恢复模式和广播模式。
zoo与eur区别
- zookeeper保证cp(一致性)
- eureka保证ap(可用性)
- zoo在选举期间注册服务瘫痪,期间不可用
- eur各个节点平等关系,只要有一台就可保证服务可用,而查询到的数据可能不是最新的,可以很好应对网络故障导致部分节点失联情况
- zoo有leader和follower角色,eur各个节点平等
- zoo采用半数存活原则(避免脑裂),eur采用自我保护机制来解决分区问题
- eur本质是个工程,zoo只是一个进程 ZooKeeper基于CP,不保证高可用,如果zookeeper正在选主,或者Zookeeper集群中半数以上机器不可用,那么将无法获得数据。Eureka基于AP,能保证高可用,即使所有机器都挂了,也能拿到本地缓存的数据。作为注册中心,其实配置是不经常变动的,只有发版(发布新的版本)和机器出故障时会变。对于不经常变动的配置来说,CP是不合适的,而AP在遇到问题时可以用牺牲一致性来保证可用性,既返回旧数据,缓存数据。所以理论上Eureka是更适合做注册中心。而现实环境中大部分项目可能会使用ZooKeeper,那是因为集群不够大,并且基本不会遇到用做注册中心的机器一半以上都挂了的情况。所以实际上也没什么大问题。
Hystrix原理
通过维护一个自己的线程池,当线程池达到阈值的时候,就启动服务降级,返回fallback默认值
为什么需要hystrix熔断
防止雪崩,及时释放资源,防止系统发生更多的额级联故障,需要对故障和延迟进行隔离,防止单个依赖关系的失败影响整个应用程序;
微服务优缺点
- 每个服务高内聚,松耦合,面向接口编程;
- 服务间通信成本,数据一致性,多服务运维难度增加,http传输效率不如rpc
eureka自我保护机制
- eur不移除长时间没收到心跳而应该过期的服务
- 仍然接受新服务注册和查询请求,但是不会同步到其它节点(高可用)
- 当网络稳定后,当前实例新注册信息会同步到其它节点(最终一致性)
MQ对比
ActiveMQ:Apache出品,最早使用的消息队列产品,时间比较长了,最近版本更新比较缓慢。RabbitMQ:erlang语言开发,支持很多的协议,非常重量级,更适合于企业级的开发。性能较好,但是不利于做二次开发和维护。RocketMQ:阿里开源的消息中间件,纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点,分布式事务。ZeroMQ:号称最快的消息队列系统,尤其针对大吞吐量的需求场景,采用 C 语言实现。消息队列的选型需要根据具体应用需求而定,ZeroMQ 小而美,RabbitMQ 大而稳,Kakfa 和 RocketMQ 快而强劲