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=
过滤器
内置过滤器
- 详见官方文档:@EnableZuulProxy vs. @EnableZuulServer
https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/2.2.1.RELEASE/reference/html/#router-and-filter-zuul
自定义前置路由之令牌桶
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);
}
}
❀❀ (ง •_•)ง little little 🦆🦆 ❀❀❀❀ ♕♕♕♕♕


浙公网安备 33010602011771号