微服务组件:路由网关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); }