Spring Cloud搭建手册(6)——Spring Cloud Zuul

本文详细介绍如何在Spring Cloud项目中配置Zuul作为API网关,包括添加依赖、配置路由、实现请求过滤及token校验。同时,针对Zuul转发失败的常见问题提供解决方案,如调整Hystrix和Ribbon的超时时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、首先在POM文件添加依赖:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>

2、在Spring boot入口类添加注解:

@EnableZuulProxy

3、在application.properties配置文件中配置服务路由,以上面的feign-service为例,其中find为路由名,之后通过访问http://gate-service:9001/find/**,由find路由将请求转发到feign-service服务上:

zuul.routes.hello.path=/find/**
zuul.routes.hello.serviceId=feign-service

4、增加对请求的前置过滤,例如对所有到各微服务的请求都要进行token校验:

public class AccessFilter extends ZuulFilter {

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();

        Object accessToken = request.getParameter("accessToken");
        if (accessToken == null) {
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            return null;
        }
        return null;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public int filterOrder() {
        return 0;
    }

    @Override
    public String filterType() {
        return "pre";
    }
}

5、为了使过滤器生效,还需要创建对应的Bean,我们创建了一个FilterBean来配置所有的过滤器Bean:

@Configuration
public class FilterBean {

    @Bean
    public AccessFilter accessFilter() {
        return new AccessFilter();
    }
}

5、可能遇到的问题:

① Zuul转发失败,报错XX timed-out and no fallback available

102239_kH0t_1445585.png

102244_BMP4_1445585.png

原因:Zuul集成了Hystrix组件,Hystrix缺省超时判断为1秒钟,由于网络问题,有些请求超过1秒钟之后才接收到。但是由于没给Zuul开发fallback代码,所以请求失败报了这个错。

解决办法:在application.properties配置修改Hystrix的超时时间或关掉Hystrix超时。

hystrix.command.default.execution.timeout.enabled=true
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=80000
或
hystrix.command.default.execution.timeout.enabled=false

② Zuul转发失败,报错Read timed out

102316_Ie5V_1445585.png

原因:Zuul集成了Ribbon组件,当请求量过大时,后面的请求积压时间会超过Ribbon的超时时间,从而导致失败。

解决办法:在application.properties配置修改Ribbon的超时时间。

ribbon.ConnectTimeout=60000
ribbon.ReadTimeout=60000
ribbon.OkToRetryOnAllOperations=true
ribbon.MaxAutoRetriesNextServer=1
ribbon.MaxAutoRetries=0

 

转载于:https://my.oschina.net/u/1445585/blog/1621938

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值