Zuul
1.应用场景
它相当于是一个网关,可以使用一定的路由配置来判断某一个URL由哪个服务来处理。并从Eureka获取注册的服务来转发请求。
API网关所有的客户端请求通过这个网关访问后台的服务。
2.核心功能
Zuul包含了对请求的路由和过滤两个主要功能,是各种服务的统一入口,同时会提供监控、授权、安全、调度等功能。
路由:负责将外部请求转发到具体的微服务实例上,是实现外部访问同一入口的基础,他与Nginx的区别就在于它提供了认证鉴权、动态路由、监控、弹性、安全和负载均衡等边缘服务,在项目初期使用Zuul会大大节约项目开发资源。并且它可以和Nginx配合使用,使用Nginx作为负载均衡提供高并发请求处理,而Zuul只负责网关使用。
过滤器:负责对请求的处理过程进行校验和服务聚合等功能。
3.Zuul和Eureka整合
将Zuul注册为Eureka下的应用,同时从Eureka中活的其他微服务的消息,使后续访问微服务都是通过Zuul进行跳转。Zuul服务最终还是会注册到Eureka中,提供代理、路由、过滤三大功能。
4.负载均衡
Zuul支持Ribbon和Hystrix,也能够实现客户端的负载均衡。Zuul作为最外层接口路由,Ribbon作为service路由。
Hystrix
它是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统中絮都依赖都会产生如:调用超时、异常等情况,Hystrix能够保证在一个依赖出现问题的情况下,不会导致整体服务失败而造成级联故障,以此来提高分布式系统的弹性,主要就是为了解决雪崩效应。
1.服务雪崩
多个微服务之间相互调用时,如果在调用链路上的某个微服务的响应超时或不可用,那么最外层微服务会占用越来越多的系统资源,进而引起系统崩溃,这就是所谓的雪崩效应。
(扇出调用链)
(1)线程池隔离(Thread-pool Rejection)
容器与远程服务调用线程隔离,进行异步调用,如果依赖多个服务,则多个服务间相互隔离。
缺点:产生额外的线程开销、如果线程池过大会降低服务器响应速度。
优点: 可以模拟异步调用,方便开发。
适用场景:调用第三方服务、依赖服务不多。
(2)信号隔离(semaphre Rejection)
信号隔离也可以用于接口限流。防止阻塞扩散,与线程隔离最大的区别在于执行依赖代码的线程依然是请求线程通过信号申请,如果客户端是可信的并且可以快速返回,则可以使用信号隔离降低开销。
缺点:不支持异步调用
优点:轻量级、无额外开销
适用场景:内部可信服务、高依赖网关
2.服务熔断
熔断机制是对应雪崩效应的一种微服务链路保护机制。当扇出调用链路的某个微服务不可用或超时时,进行服务降级,进而熔断该节点微服务的调用,快速返回错误信息。当检测到该节点微服务调用响应正常后恢复调用链路。在SpringCloud矿建中,熔断机制通过Hystrix实现。Hystrix会监控微服务间的调用状态,当失败的嗲用到一定阈值就会启动熔断机制(默认为20次/10S触发熔断 5S后尝试恢复) ,可以通过注解的方式直接使用该熔断机制:@HystrixCommand
3.服务降级
整体资源即将不足时,将某些服务关闭,等待资源足够时在进行开启。
4.Hystrix监控和断路器
我们只需要在接口上添加对应的注解就可以实现对这个接口的监控和断路器功能。HyStrix Dashboard监控面板提供了对应的监控页面,可以监控各个服务上的调用消耗等信息。
5.HystrixTurbine监控聚合
使用Turbine可以帮助我们把所有,使用Hystrix监控,需要打开每一个服务实例的监控信息来查看的操作聚合到一起统一查看。
6.Zuul的安全机制
签名机制,为防止接口数据被篡改和重复调用,增加接口参数校验机制,sig签名算法为MD5(appKey+appSecret+timestamp),appKey是分配给每个客户端的ID,appSecret是分配给客户端的秘钥,timestamp为unix时间戳,请求的URL有效时间为15分钟。
Token机制,用户登录后会返回一个access_token,客户端在访问需要登录后才能访问的资源时,需要在Authorization头部使用Bearer模式新增token如: head("Authorization","Bearer token")。
7.Hystrix涉及原则
(1)资源隔离机制:限制调用分布式服务的资源使用,某一个调用的服务出现问题时不会影响其他服务调用。
(2)限流机制:主要是提前对各个类型的请求设置最高的QPS阈值,高于阈值部分直接返回结果,不在调用资源。
(3)熔断机制:当失败率达到阈值自动触发降级,熔断器触发的快速失败会进行快速恢复。
(4)降级机制:超时、资源不足和运行异常等情况进行降级处理,降级后可配合降级接口返回兜底数据信息。
(5)缓存:提供了请求缓存、请求合并实现。通过近实时的统计/监控/报警功能,来提高故障发现速度。通过属性和配置热修改功能,来提高故障处理和恢复的速度。
8.快速使用
(1)pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId> spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
(2)在启动类上添加注解 : @EnableCircuitBreaker
(3)fallback逻辑
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.wendao.provider.consumer.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "fallback")
@RequestMapping("/findUser")
public User findUser(){
User user = restTemplate.getForObject("http://testSpringCloud/user/1", User.class);
return user;
}
//fallback逻辑
private User fallback(){
// 模拟返回
return new User("fallback",12);
}
}
(4)关闭服务提供者查看响应结果
可通过超时策略或直接服务提供者来进行测试,超时配置可通过注解进行设置超时时间,当服务调用失败时会调用fallback方法逻辑,这种形式成为服务降级。
@HystrixCommand(fallbackMethod = "fallback",commandProperties = {
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="5000")
})
(5)服务熔断
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "fallback",commandProperties = {
@HystrixProperty(name = "circuitBreaker.enabled",value="true"),
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value="10"),
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value="10000"),
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value="50"),
})
@RequestMapping("/findUser")
public User findUser(){
//如果熔断器开启是不会进入这个方法的,直接调用fallback逻辑
System.out.println("come in");
User user = restTemplate.getForObject("http://testSpringCloud/user/1", User.class);
return user;
}
//fallback逻辑
private User fallback(){
return new User("fallback",12);
}
}
当达触发服务降级时还会调用findUser方法,当达到触发服务熔断条件时,此时将直接执行fallback方法逻辑不会在执行findUer。