微服务组件:路由网关zuul
1. zuul介绍
zuul是在微服务中提供动态路由、监控、弹性和安全等边缘服务的框架。实现了开放服务的控制权限机制,而不去破坏微服务无状态的特点。

zuul主要功能:
① zuul URL映射
② zuul serviceId映射;
③ zuul过滤器;
github代码地址:
https://github.com/sanqianyuejiamk/zuul-consul-demo
2. zuul使用
2-1 启动服务提供端
java -jar springboot-mvc-consul-s1-1.0-SNAPSHOT.jar java -jar springboot-mvc-consul-s2-1.0-SNAPSHOT.jar

2-2 serviceId映射
zuul查询consul服务注册信息,将所有/user/**的访问都映射到microservice-provider-user服务提供端
spring:
application:
name: microservice-api-gateway
server:
port: 8050
zuul:
# ignored-services: microservice-provider-user # 需要忽视的服务(配置后将不会被路由)
routes:
movie: # 可以随便写,在zuul上面唯一即可;当这里的值 = service-id时,service-id可以不写。
path: /user/** # 想要映射到的路径
service-id: microservice-provider-user
访问:
http://127.0.0.1:8050/user/app/v1/hystrix/t_fallback

2-3 过滤器
利用zuul过滤器,可以实现对外服务的安全机制,通过安全措施保护客户端只能访问它应该访问到的资源;
@Slf4j
public class AccessFilter extends ZuulFilter {
/**
* 返回一个字符串代表过滤器的类型,在zuul中定义了四种不同的生命周期过滤器类型
* 1)pre:在请求被路由之前调用;
* 2)routing:在路由请求时候被调用;
* 3)post:在routing和error过滤器之后被调用;
* 4)error:处理请求时发生错误时被调用;
*
* @return
*/
@Override
public String filterType() {
return ZuulFilterTypeEnums.PRE.getName();
}
/**
* 通过int值来定义过滤器的执行顺序
*
* @return
*/
@Override
public int filterOrder() {
return 50000;
}
/**
* 返回一个boolean类型来判断该过滤器是否要执行
*
* @return
*/
@Override
public boolean shouldFilter() {
return RequestContext.getCurrentContext().getRequest().getRequestURI().matches("/user/.*");
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
log.info(String.format("%s request to %s", request.getMethod(), request.getRequestURL().toString()));
Object accessToken = request.getParameter("accessToken");
if (accessToken == null) {
log.warn("access token is empty");
ctx.setSendZuulResponse(false);//令zuul过滤该请求,不对其进行路由
ctx.setResponseStatusCode(401);//返回的错误码
return null;
}
log.info("access token ok");
return null;
}
}
@Configuration
public class AppConfig {
@Bean
public AccessFilter accessFilter() {
return new AccessFilter();
}
}
@Test
public void test_zuul_token_filter_01() {
log.info("test_zuul_token_filter_01..");
Response response = RestAssured.get("http://127.0.0.1:8050/user/app/v1/hystrix/t_fallback?orgCode=123456&accessToken=123456");
assertEquals(200, response.getStatusCode());
String result = response.getBody().asString();
assertEquals("success", result);
}
浙公网安备 33010602011771号