springcloud-zuul网关的使用
1、使用idea创建springcloud项目的时候选择eureka-client和zuul这两种组件
2、确保pom.xml的maven依赖文件中含有springcloud-zuul的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
3、在springboot的主启动类上面添加对zuul网关组件的支持@EnableZuulProxy
4、在application.yml配置文件中添加对zuul网关组件的支持
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8181/eureka
spring:
application:
name: api-gateway
server:
port: 9000
# 自定义路由映射
zuul:
routes:
eureka-client-orders-feign: /client-orders/**
ignored-services: eureka-client-orders
# 统一入口为上面要约配置,其他入口忽略
ignored-patterns: /*-service/**
# 处理http请求头为空的问题
sensitive-headers:
5、创建过滤器,继承ZuulFilter,
(1) 实现自定义的访问(ACL访问控制列表)
(2) 还有令牌桶的限流
package com.springcloudtest.filter;
import com.google.common.util.concurrent.RateLimiter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.http.HttpStatus;
import javax.servlet.http.HttpServletRequest;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;
public class OrderRateLimitFilter extends ZuulFilter {
//每秒产生1000个令牌
private static final RateLimiter RATE_LIMITER = RateLimiter.create(1000);
@Override
public String filterType() {
return PRE_TYPE;
}
@Override
public int filterOrder() {
return -4;
}
@Override
public boolean shouldFilter() {
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest request = requestContext.getRequest();
System.out.println(request.getRequestURI());
System.out.println(request.getRequestURL());
//ACL访问控制列表
if ("/eureka-client-orders-feign/orderIdQuery/createOrder".equalsIgnoreCase(request.getRequestURI())) {
//返回true表示过滤器开始启用
return true;
}
return false;
}
@Override
public Object run() throws ZuulException {
RequestContext requestContext = RequestContext.getCurrentContext();
//限流处理
if(!RATE_LIMITER.tryAcquire()){
requestContext.setSendZuulResponse(false);
requestContext.setResponseStatusCode(HttpStatus.TOO_MANY_REQUESTS.value());
};
return null;
}
}
启动springboot即可生效