文章目录
一、Spring Cloud 和dubbo区别?
(1)服务调用方式:dubbo是RPC springcloud Rest Api
(2)注册中心:dubbo 是zookeeper springcloud是eureka,也可以是zookeeper
(3)服务网关,dubbo本身没有实现,只能通过其他第三方技术整合,springcloud有Zuul路由网关,作为路由服务器,进行消费者的请求分发,springcloud支持断路器,与git完美集成配置文件支持版本控制,事物总线实现配置文件的更新与服务自动装配等等一系列的微服务架构要素。
二、Eureka
1. 什么是Eureka
Eureka: 服务注册中心。通过Eureka可以监控各个服务的运行状态,系统中的其他服务使用Eureka的客户端将其连接到Eureka Service中,并且保持心跳,。它具有如下几个角色:
- Eureka Server: 提供服务注册与发现
- Service Provider: 服务提供方。将自身注册到Eureka,供消费者使用
- Service Consumer: 服务消费方。从Eureka中获取服务器提供方列表,从而消费服务
2. Eureka怎么实现高可用
通过集群,注册多台Eureka,然后把SpringCloud服务互相注册,客户端从Eureka获取信息时,按照Eureka的顺序来访问。
3. 什么是Eureka的自我保护模式
默认情况下,如果Eureka Service在一定时间内没有接收到某个微服务的心跳,Eureka Service会进入自我保护模式,在该模式下Eureka Service会保护服务注册表中的信息,不在删除注册表中的数据,当网络故障恢复后,Eureka Servic 节点会自动退出自我保护模式。
4. Eureka和ZooKeeper都可以提供服务注册与发现的功能,请说说两个的区别
-
ZooKeeper中的节点服务挂了就要选举,在选举期间注册服务瘫痪,虽然服务最终会恢复,但是选举期间不可用的,选举就是改微服务做了集群,必须有一台主其他的都是从。
-
Eureka各个节点是平等关系,服务器挂了没关系,只要有一台Eureka就可以保证服务可用,数据都是最新的。如果查询到的数据并不是最新的,就是因为Eureka的自我保护模式导致的。
-
Eureka本质上是一个工程,而ZooKeeper只是一个进程
-
Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像ZooKeeper 一样使得整个注册系统瘫痪
-
ZooKeeper保证的是CP,Eureka保证的是AP
CAP:
C:一致性>Consistency;
取舍:(强一致性、单调一致性、会话一致性、最终一致性、弱一致性)
A:可用性>Availability;
P:分区容错性>Partition tolerance;
三、Zuul
1. 什么是网关?
网关相当于一个网络服务架构的入口,所有网络请求必须通过网关转发到具体的服务。
2. 网关的作用是什么
统一管理微服务请求,权限控制、负载均衡、路由转发、监控、安全控制黑名单和白名单等
3. 什么是Spring Cloud Zuul(服务网关)
Zuul是对SpringCloud提供的成熟对的路由方案,他会根据请求的路径不同,网关会定位到指定的微服务,并代理请求到不同的微服务接口,他对外隐蔽了微服务的真正接口地址。
三个重要概念:动态路由表,路由定位,反向代理:
动态路由表:Zuul支持Eureka路由,手动配置路由,这俩种都支持自动更新
路由定位:根据请求路径,Zuul有自己的一套定位服务规则以及路由表达式匹配
反向代理:客户端请求到路由网关,网关受理之后,在对目标发送请求,拿到响应之后在 给客户端
它可以和Eureka,Ribbon,Hystrix等组件配合使用,Zuul内部使用Ribbon实现本地负载均衡和转发。
Zuul的应用场景:
对外暴露,权限校验,服务聚合,日志审计等
4. Ribbon是什么?
Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法
Ribbon客户端组件提供一系列完善的配置项,如连接超时,重试等。简单的说,就是在配置文件中列出后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。(有点类似Nginx)
Hystrix
什么是断路器
当一个服务调用另一个服务由于网络原因或自身原因出现问题,调用者就会等待被调用者的响应 当更多的服务请求到这些资源导致更多的请求等待,发生连锁效应(雪崩效应)
断路器有三种状态
打开状态:一段时间内 达到一定的次数无法调用 并且多次监测没有恢复的迹象 断路器完全打开 那么下次请求就不会请求到该服务
半开状态:短时间内 有恢复迹象 断路器会将部分请求发给该服务,正常调用时 断路器关闭
关闭状态:当服务一直处于正常状态 能正常调用
四、 Hystrix
1. 什么是断路器
当一个服务调用另一个服务由于网络原因或自身原因出现问题,调用者就会等待被调用者的响应 当更多的服务请求到这些资源导致更多的请求等待,发生连锁效应(雪崩效应)
断路器有三种状态
打开状态:一段时间内 达到一定的次数无法调用 并且多次监测没有恢复的迹象 断路器完全打开 那么下次请求就不会请求到该服务
半开状态:短时间内 有恢复迹象 断路器会将部分请求发给该服务,正常调用时 断路器关闭
关闭状态:当服务一直处于正常状态 能正常调用
2. 什么是Hystrix
在分布式系统,我们一定会依赖各种服务,那么这些个服务一定会出现失败的情况,就会导致雪崩,Hystrix就是这样的一个工具,防雪崩利器,它具有服务降级,服务熔断,服务隔离,监控等一些防止雪崩的技术。
Hystrix有四种防雪崩方式:
- 服务降级:接口调用失败就调用本地的方法返回一个空
- 服务熔断:接口调用失败就会进入调用接口提前定义好的一个熔断的方法,返回错误信息
- 服务隔离:隔离服务之间相互影响
- 服务监控:在服务发生调用时,会将每秒请求数、成功请求数等运行指标记录下来。
五、Feign
问题引入:
在上面的介绍中,我们基本解决了前端APP调用后端服务集群的问题。但又必须考虑一个问题,分布式微服务项目,即各个服务相互独立,但是各个服务又存在相互调用的关系。如何解决服务于服务之间的通信呢?
解决办法:
在微服务架构中,服务于服务的通讯都是基于Http Restful的。SpringCloud有两种调用方式:
使用 Ribbon + RestTemplate。Ribbon是一个负载均衡客户端,可以很好的控制Http和Tcp的一些行为。而RestTemplate是Spring本身提供的用于远程调用Rest接口的HTTP客户端。
使用 Feign。Feign是一个声明式的HTTP客户端,仅需要一个@FeignClient注解就能实现远程调用。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。
六、Config
如果系统服务模块非常多时,每次修改服务配置都要修改服务src/main/resources下的application.yml可能会很麻烦,spring-cloud-config就解决了这个问题,Config Server端实现将配置文件内容以接口的形式暴露,Client端通过该接口得到配置文件内容,并以此初始化自己的应用。