1、简单描述一下对微服务架构的理解
微服务架构简单来说是将单体的应用程序根据业务能力划分为多个应用程序,并使用轻量级的机制通信、自动化的部署机制进行服务的集中化管理。
其中SpringCloud基于SpringBoot将市场上优秀的框架组合起来,形成了一系列框架的有序集合。
2、SpringCloud的基本组件介绍
- Eureka:服务注册与发现
- 实现方式:
- 服务在发布时,指定对应的服务名(服务名包括了IP地址和端口),将服务注册到注册中心(在main方法中添加**@EnableDiscoveryClient**注解);
- 服务注册与发现的原理:
- 每30s发送心跳检测每个服务,若服务在3次内无返回,则将在90s内从服务器注册中心移除;
- 注册和更新信息会被复制到所有Eureka节点;
- 客户端会缓存一些服务信息,30s同步一次,即使Eureka全部挂掉,客户端也可以定位到服务地址。
- Zuul、Gateway:服务网关
- Ribbon:客户端负载均衡
- Feign:声明性的Web服务客户端
- Hystrix:断路器
- Config:分布式统一配置中心
- 组件工作流程
- 所有服务均在Eureka注册,包括Config、Zuul(Gateway)、业务服务Service等;
- 流量进入Gateway,根据路由从Eureka中发现并获取服务;
- 由Ribbon进行负载均衡后,分发到Service具体的pod中;
- 微服务之间通过Feign进行服务调用;其中可通过请求Config实现动态加载;
- Hystrix负责处理服务的超时、熔断和降级。
3、微服务之间如何独立通讯?
- 同步通信:dubbo通过RPC远程过程调用;springcloud通过REST接口进行json调用等;
- 异步通信:消息队列,如:rabbitMq、ActiveMq、Kafka等。
4、springcloud与dubbo的区别
SpringCloud
- 采用http的REST方式通信,占用带宽多一些;
- 对第三方组件可天然集成;
Dubbo
- 采用RPC通信,二进制传输,占用带宽少;
- 开发难度大;
5、Eureka与Zookeeper的区别
两个框架均提供了服务注册与发现的功能。
CAP理论:一个分布式系统不可能同时满足C(一致性)A(可用性)P(分区容错性)。其中,分区容错性是必须要保证的,所以只能从一致性和可用性中权衡。
- Eureka:
- 是AP原则,即可用性和分区容错性;
- 各个节点是平等的,一个节点挂掉,Eureka客户端向此节点注册或发现时失败,会自动切换到其他节点,保证注册中心服务可用。
- Zookeeper:
- 是CP原则,即强一致性和分区容错性;
- 当master故障时,zk会在剩余节点中进行选举,选举期间服务不可用,可能会持续30s,所以可用性较差。
6、Hystrix如何实现容错?
Hystrix是一个延迟和容错库
7、Ribbon与Feign
Ribbon
- 使用方式:使用maven依赖
spring-starter-ribbon
,使用**@RibbonClient(value=服务名称)**后,通过RestTemplate调用远程服务的方法;- 启动类注解:在Application.class中使用@LoadBalanced注解RestTemplate(),其中用到了@RibbonClient的注解;
Feign
- 使用方法:使用maven依赖
spring-starter-feign
,提供对外接口;调用方在接口使用**@FeignClient(指定服务名)**可进行调用;- 启动类位置:在Application.class上使用@EnableFeignClients注解;
8、Gateway的作用?
作为SpringCloud的网关,是整个微服务API请求的入口,负责拦截所有请求,并分发到服务上去。
- Gateway的组成
- 路由:网关的基本模块,由ID、目标URI、断言和过滤器组成;
- 断言:访问改路由的规则,可以匹配来自http请求中的headers和body;
- 过滤器:用于过滤一些请求。
- 流程
- 客户端发送请求,会到达网关的DispatcherHandler处理,匹配到RoutePredicateHandlerMapping;
- 根据RoutePredicateHandlerMapping匹配到具体的路由策略,找到对应的URI;
- FilteringWebHandler获取路由的GatewayFilter数组,创建GatewayFilterChain处理pre;
- 执行业务代码逻辑;
- FilteringWebHandler处理post的过滤器请求。