zuul使用
为什么使用zuul?
对外提供的服务,在无网关的情况下,API接口直接暴露给服务调用方,当调用方增多,不同业务调用方各不相同,势必需要添加定制化访问权限、校验等逻辑。当添加API网关后,再第三方调用端和服务提供方之间就创建了一面墙,这面墙直接与调用方通信进行权限控制,后将请求均衡分发给后台服务端。Zuul就是提供负载均衡-反向代理-权限认证的这么一个API gateway。
实现zuul
- 首先创建Maven的SpringBoot工程
- 在pom.xml中添加zuul的jar包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
- 在启动类上添加注解
@EnableZuulProxy
- 创建拦截器类继承
ZuulFilter
,方法功能请查看注解
public class TokenFilter extends ZuulFilter {
private final Logger logger = LoggerFactory.getLogger(TokenFilter.class);
//过滤器类型
@Override
public String filterType() {
return "pre"; // 可以在请求被路由之前调用
}
//过滤器执行顺序
@Override
public int filterOrder() {
return 0; // filter执行顺序,通过数字指定 ,优先级为0,数字越大,优先级越低
}
//判断该过滤器是否需要执行
@Override
public boolean shouldFilter() {
return true;// 是否执行该过滤器,此处为true,说明需要过滤
}
//过滤器的具体逻辑
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
HttpSession session = request.getSession();
User loginUser = (User) session.getAttribute(UserConstants.LOGIN_USER);
logger.info("--->>> TokenFilter {},{}", request.getMethod(), request.getRequestURL().toString());
if (loginUser != null) {
ctx.setSendZuulResponse(true); //对请求进行路由
ctx.setResponseStatusCode(200);
ctx.set("isSuccess", true);
return null;
} else {
ctx.setSendZuulResponse(false); //不对其进行路由
ctx.setResponseStatusCode(400);
ctx.setResponseBody("token is empty");
ctx.set("isSuccess", false);
return null;
}
}
}
- 在主类中添加拦截器的注解方式启动启动
@Bean
public TokenFilter tokenFilter() {
return new TokenFilter();
}
- 配置文件中的配置
spring:
application:
name: gateway-service-zuul #zuul服务名
server:
port: 8888 #端口
zuul:
host:
connect-timeout-millis: 100000
socket-timeout-millis: 600000
routes:
zidingyi:
path: /producer/**
service-id: spring-cloud-producer #/producer/hello ---->转到spring-cloud-producer服务的/hell接口
服务网关,是服务的唯一进出口。所以服务权限的操控以及负载均衡都是较为重要的,所以API gateway在SpringCloud中是不可或缺的一部分。
青春短暂,我_在路上