Zookeeper、eureka、springcloud

126 阅读5分钟

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 快而强劲