创建zuul工程时选择Cloud Routing-Zuul
在启动类上添加@EnableZuulProxy注解
@SpringBootApplication
@EnableZuulProxy
public class ApiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayApplication.class, args);
}
}
访问其他应用的页面
zuul服务的端口为8020,使用localhost:8020/应用名称/路径,进行访问
应用名称为其他应用注册在eureka的名称,路径为在该应用下的路径
如,我order服务下的一个url地址为http://localhost:8081/buyer/order/profiles,我通过zuul来访问的话,使用http://localhost:8020/order/buyer/order/profiles来访问
扩充或更改代理路由
使用zuul访问时,默认是ip:port/applicationName/来方法,如果不想使用应用名称,想自定义的话,可以在yml文件中进行配置
zuul:
routes:
order: /myOrder/**
配置之后,可以同时使用order和myOrder进行访问
禁止通过路由访问
如果应用的url不想通过路由访问,可以在zuul服务的yml配置中进行如下设置
zuul:
ignored-patterns:
- /order/buyer/order/profiles
配置后该url无法访问到,但是通过myOrder仍可以访问
也可以通过使用通配符的方式
zuul:
ignored-patterns:
- /**/buyer/order/profiles
这样,通过order和myOrder都将不能访问。
cookie和敏感头
在同一个系统中的服务之间共享标题是可行的,但是您可能不希望敏感标头泄漏到外部服务器的下游。您可以在路由配置中指定被忽略头文件列表。
zuul中默认是将"Cookie", "Set-Cookie", "Authorization"设置为敏感头,不对外部提供的,如果需要调整敏感头,需要在yml文件中进行如下设置
zuul:
routes:
order:
path: /morder/**
serviceId: order
sensitiveHeaders:
sensitiveHeaders后面没有参数,即不设置敏感头
下面进行测试
在order应用的controller中,添加一个设置cookie的方法
@RequestMapping("cookie")
public String cookie(HttpServletResponse Response) {
Cookie c = new Cookie("name", "aaralyn");
Response.addCookie(c);
return "";
}
先通过应用名称order进行访问:http://localhost:8020/order/buyer/order/cookie,来添加cookie,再访问另一个url 来查看request中是否有cookie
从上图的结果中可以看到,由于/order这个路径的敏感头中仍然包括cookie,所以response中没有设置cookie,request中也查不到设置的cookie
下面使用将敏感头置为空的/morder来进行访问
创建cookie:http://localhost:8020/morder/buyer/order/cookie
访问其他url:http://localhost:8020/morder/buyer/order/profiles
自定义过滤器
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpStatus;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_DECORATION_FILTER_ORDER;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;
/**
* @Auther: aaralyn
* @Date: 2018/8/9 13:42
* @Description:
*/
@Component
public class TokenFilter extends ZuulFilter {
/**
* 设置过滤器的类型
*
* @return
*/
@Override
public String filterType() {
return PRE_TYPE;
}
/**
* 设置过滤器的顺序,数字越小越靠前
*
* @return
*/
@Override
public int filterOrder() {
return PRE_DECORATION_FILTER_ORDER - 1;
}
/**
* 是否使用此过滤器
*
* @return
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* 写过滤器的逻辑
* 模拟所有的url必须带有token参数,如果没有的话,不通过
*
* @return
* @throws ZuulException
*/
@Override
public Object run() throws ZuulException {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
String token = request.getParameter("token");
if (StringUtils.isEmpty(token)) {
context.setSendZuulResponse(false);
context.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
}
return null;
}
}