SpringCloud Zuul

路由功能

1.转发

// 网关服务的启动类添加注解
@EnableZuulProxy
  • 结果
// 原来接口访问路径
http://localhost:8501/hello
// 使用路由请求9001是路由服务的启动端口,product是另一个服务的服务名
http://localhost:9001/product/hello

2.自定义路由

# 网关服务的配置文件添加
# product为另一个服务的服务名
# /pdt/** 请求到product的路径
zuul.routes.product=/pdt/**
  • 官方解释

  • 还可以这么写,同上效果一样

- pdt自定义的路由映射规则名,根据场景自己随意命名
zuul.routes.pdt.service-id=product
zuul.routes.pdt.path=/pdt/**
  • url写法
# 结果是 通过官网http://localhost:9001/p/hi/可直接访问
zuul.routes.pdt.path=/p/hi/**
zuul.routes.pdt.url=http://localhost:8501/hello

3.禁止某路由被访问

# 此处放的是通配符式的,数组形式匹配多个
zuul.ignored-patterns=/**/product/hello,/p/hi/**

敏感头

  • 默认为"Cookie", "Set-Cookie", "Authorization"
# 设置为空
zuul.routes.pdt.sensitive-headers=

过滤器

内置过滤器

自定义前置路由之令牌桶

package com.cloud.apigateway.filter;

import com.cloud.apigateway.exception.RateLimitException;
import com.google.common.util.concurrent.RateLimiter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.ZuulFilterResult;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component;

import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.SERVLET_DETECTION_FILTER_ORDER;

@Component
public class RateLimitFilter extends ZuulFilter {

    // 一秒100个令牌
    private static final RateLimiter RATE_LIMITER = RateLimiter.create(100);

    // 是否执行过滤
    @Override
    public boolean shouldFilter() {
        return true;
    }

    // 具体逻辑
    @Override
    public Object run() throws ZuulException {
        if (!RATE_LIMITER.tryAcquire()) {
            //  自定义的异常
            throw new RateLimitException("已达上限,开始限流");
        }
        return null;
    }

    public RateLimitFilter() {
        super();
    }

    // 过滤类型
    @Override
    public String filterType() {
        return PRE_TYPE;
    }


    // 常量复用于org.springframework.cloud.netflix.zuul.filters.support.FilterConstants
    // 执行顺序,在PreDecorationFilter之前执行
    @Override
    public int filterOrder() {
        return SERVLET_DETECTION_FILTER_ORDER - 1;
    }

    @Override
    public boolean isStaticFilter() {
        return super.isStaticFilter();
    }

    @Override
    public String disablePropertyName() {
        return super.disablePropertyName();
    }

    @Override
    public boolean isFilterDisabled() {
        return super.isFilterDisabled();
    }

    @Override
    public ZuulFilterResult runFilter() {
        return super.runFilter();
    }

    @Override
    public int compareTo(ZuulFilter filter) {
        return super.compareTo(filter);
    }
}

跨域

普通单个方法跨域

  • 方法上添加注解,
// 允许cookie跨域,其他略
 @CrossOrigin(allowCredentials = "true")

网关中配置

官网配置方法

换一种写法

package com.cloud.apigateway.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

import java.util.Arrays;

@Configuration
public class CrossConfig {

    @Bean
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        final CorsConfiguration config = new CorsConfiguration();

        config.setAllowCredentials(true); // cookie跨域
        config.setAllowedOrigins(Arrays.asList("*")); //http:127.0.0.1:9090/,域名
        config.setAllowedHeaders(Arrays.asList("*")); // 允许头
        config.setAllowedMethods(Arrays.asList("*"));// get,post..
        config.setMaxAge(300l); //缓存时间限制,在限定时间内,相同跨域请求不做处理

        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

posted @ 2020-04-17 17:55  VVII  阅读(220)  评论(0)    收藏  举报