SpringCloud微服务快速入门

Hystrix 服务熔断

雪崩效应

问题来源举例:当用户下单时,需要调用 order 订单和cart购物车 authLogin登录校验,三个微服务,某个时刻order订单号异常无法生成,这个请求线程无法内处理,当后续用户在进入的时候请求被大量积压,本地线程有限,导致整个服务奔溃

线程隔离&服务降级

解决方法1

为每个服务创建线程池,请求进入之后先分配线程,再用私有线程访问对应服务;当线程池满或者超时将降级服务

对应场景:无法满足下单服务时,提供购物车,提示:“太热情了,先添加购物车,等会再来下单吧”

Circuit Breaker熔断

解决方法2:order群服务的情况下,单个发生异常立即熔断,不再使用,用户仍然可以调用其他order服务,对用户而言没有任何变化,整个购物流程保持健康

Feign 远程调用

问题来源

下单需要调用登录服务校验用户登录状态,添加购物车需要调用登录服务校验用户登录状态,登录要调用登录服务
重复的代码需要写3次

解耦与简化
  1. 引入依赖
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
  1. 在启动类开启服务
@EnableFeignClients 
  1. UserLogin.userisLogin()抽取到interface UserLoginApi,在order中创建UserClient extends UserApi,在服务中调用UserClinet.userisLogin()方法即可
Hystrix的支持
  1. 配置文件
feign:
  hystrix:
    enabled: true # 开启Feign的熔断功能
  1. 熔断方法

在 调用的Client中添加该服务熔断之后的方法,如下

@FeignClient(value = "service-provider", fallback = UserClientFallback.class)

Eureka 注册中心

路由分发
  1. 依赖

    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

  1. 添加配置
    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
  1. 微服务启动类开启服务发现
@EnableDiscoveryClient
  1. 网关类中添加配置
zuul:
  routes:
  serviceName: /serviceNameorRouterPrefix/** # 该服务的所有请求映射路径,之后按照此路径访问

Zuul 网关拦截与负载均衡

开启网关
  1. 添加依赖
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
  1. 在启动类添加
@EnableZuulProxy 
  1. 配置
server:
  port: 11010 #服务端口
spring:
  application:
    name: api-gateway #指定服务名
ZuulFilter过滤器
  1. 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
}
  1. 过滤执行顺序
    冯金平ZULLFILTER
    请求-pre过滤器-route分发路由服务-service服务提供者-do执行请求-response返回结果-post过滤器-用户

  2. 使用场景

请求鉴权:pre类型
异常处理:error类型和post,若发生则先error再post
服务调用时长统计:post-pre

熔断配置

Zull整合了Ribbon负载均衡和Hystix熔断机制

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 3000 # 设置hystrix的超时时间为3000ms,3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值