文章目录
Hystrix 服务熔断
雪崩效应
问题来源举例:当用户下单时,需要调用 order 订单和cart购物车 authLogin登录校验,三个微服务,某个时刻order订单号异常无法生成,这个请求线程无法内处理,当后续用户在进入的时候请求被大量积压,本地线程有限,导致整个服务奔溃
线程隔离&服务降级
解决方法1 :
为每个服务创建线程池,请求进入之后先分配线程,再用私有线程访问对应服务;当线程池满或者超时将降级服务
对应场景:无法满足下单服务时,提供购物车,提示:“太热情了,先添加购物车,等会再来下单吧”
Circuit Breaker熔断
解决方法2:order群服务的情况下,单个发生异常立即熔断,不再使用,用户仍然可以调用其他order服务,对用户而言没有任何变化,整个购物流程保持健康
Feign 远程调用
问题来源
下单需要调用登录服务校验用户登录状态,添加购物车需要调用登录服务校验用户登录状态,登录要调用登录服务
重复的代码需要写3次
解耦与简化
- 引入依赖
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
- 在启动类开启服务
@EnableFeignClients
- UserLogin.userisLogin()抽取到interface UserLoginApi,在order中创建UserClient extends UserApi,在服务中调用UserClinet.userisLogin()方法即可
Hystrix的支持
- 配置文件
feign:
hystrix:
enabled: true # 开启Feign的熔断功能
- 熔断方法
在 调用的Client中添加该服务熔断之后的方法,如下
@FeignClient(value = "service-provider", fallback = UserClientFallback.class)
Eureka 注册中心
路由分发
- 依赖
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
- 添加配置
Eureka本类的配置
eureka:
client:
registry-fetch-interval-seconds: 10 # 获取服务列表的周期:10s
service-url:
defaultZone: http://127.0.0.1:10086/eureka #注册中心地址
register-with-eureka: false # 把自己注册到eureka服务列表
fetch-registry: false # 拉取eureka服务信息
server:
enable-self-preservation: false # 关闭自我保护,生产环境需要开启
eviction-interval-timer-in-ms: 5000 # 每隔5秒钟,进行一次服务列表的清理,看看谁dead
注册微服务配置
eureka:
client:
registry-fetch-interval-seconds: 5 #拉取服务时间,告诉注册中心活着
service-url:
defaultZone: http://127.0.0.1:10086/eureka
- 微服务启动类开启服务发现
@EnableDiscoveryClient
- 网关类中添加配置
zuul:
routes:
serviceName: /serviceNameorRouterPrefix/** # 该服务的所有请求映射路径,之后按照此路径访问
Zuul 网关拦截与负载均衡
开启网关
- 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
- 在启动类添加
@EnableZuulProxy
- 配置
server:
port: 11010 #服务端口
spring:
application:
name: api-gateway #指定服务名
ZuulFilter过滤器
- ZuulFilter的实现过滤的4个方法
public abstract ZuulFilter implements IZuulFilter{
//类型pre,post
abstract public String filterType();
//过滤器顺序,数字越小执行顺序越靠前
abstract public int filterOrder();
//被执行的自定义过滤选择,哪些应该被过滤增强哪些应该放行
boolean shouldFilter();// 来自IZuulFilter
//过滤时具体的增强方法
Object run() throws ZuulException;// IZuulFilter
}
-
过滤执行顺序
请求-pre过滤器-route分发路由服务-service服务提供者-do执行请求-response返回结果-post过滤器-用户 -
使用场景
请求鉴权:pre类型
异常处理:error类型和post,若发生则先error再post
服务调用时长统计:post-pre
熔断配置
Zull整合了Ribbon负载均衡和Hystix熔断机制
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 3000 # 设置hystrix的超时时间为3000ms,3秒