简介
Zuul是所有从设备和web站点到Netflix流媒体应用程序后端的请求的前门。作为一个边缘服务应用程序,Zuul的构建是为了支持动态路由、监视、弹性和安全性。它还可以根据需要将请求路由到多个Amazon自动伸缩组。
Zuul使用了一系列不同类型的过滤器,使我们能够快速灵活地将功能应用到edge服务中。这些过滤器帮助我们执行以下功能:
工作原理
在高级视图中,Zuul 2.0是一个Netty服务器,它运行预过滤器(入站过滤器),然后使用Netty客户机代理请求,然后在运行后过滤器(出站过滤器)后返回响应。
过滤器是Zuul业务逻辑的核心所在。它们能够执行非常大范围的操作,并且可以在请求-响应生命周期的不同部分运行,如上图所示。
- Inbound Filters在路由到源之前执行,可以用于身份验证、路由和装饰请求。
- Endpoint Filters 可用于返回静态响应,否则内置的ProxyEndpoint过滤器将把请求路由到源。
- Outbound Filters 在从源获取响应后执行,可用于度量、装饰用户响应或添加自定义头。
还有两种类型的过滤器:同步和异步。因为我们是在一个事件循环上运行的,所以千万不要阻塞过滤器。如果要阻塞,可以在一个异步过滤器中阻塞,在一个单独的threadpool上阻塞——否则可以使用同步过滤器。
实用过滤器
使用技巧
依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency>
MyFilter 过滤器
@Component public class MyFilter extends ZuulFilter { private static Logger log = LoggerFactory.getLogger(MyFilter.class); /** * pre:路由之前 * routing:路由之时 * post: 路由之后 * error:发送错误调用 * @return */ @Override public String filterType() { return pre; } /** * 过滤的顺序 * @return */ @Override public int filterOrder() { return 0; } /** * 这里可以写逻辑判断,是否要过滤,本文true,永远过滤 * @return */ @Override public boolean shouldFilter() { return true; } /** * 过滤器的具体逻辑。 * 可用很复杂,包括查sql,nosql去判断该请求到底有没有权限访问。 * @return * @throws ZuulException */ @Override public Object run() throws ZuulException { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); log.info(String.format(%s >>> %s, request.getmethod(), request.getRequestURL().toString())); Object accesstoken = request.getParameter(token); if(accesstoken == null) { log.warn(token is empty); ctx.setSendZuulResponse(false); ctx.setResponseStatusCode(401); try { ctx.getResponse().getWriter().write(token is empty); }catch (Exception e){} return null; } log.info(ok); return null; } }
application.yml配置路由转发
eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ server: port: 8769 spring: application: name: cloud-service-zuul zuul: routes: api-a: path: /api-a/** serviceId: cloud-service-ribbon api-b: path: /api-b/** serviceId: cloud-service-feign
启用zuul
@SpringBootApplication @EnableZuulProxy @EnableEurekaClient @EnablediscoveryClient public class CloudServiceZuulApplication { public static void main(String[] args) { SpringApplication.run(CloudServiceZuulApplication.class, args); } }
路由熔断
/** * 路由熔断 */ @Component public class ProducerFallback implements FallbackProvider { private final Logger logger = LoggerFactory.getLogger(FallbackProvider.class); //指定要处理的 service。 @Override public String getRoute() { return spring-cloud-producer; } @Override public ClientHttpResponse fallbackResponse(String route, Throwable cause) { if (cause != null && cause.getCause() != null) { String reason = cause.getCause().getMessage(); logger.info(Excption {},reason); } return fallbackResponse(); } public ClientHttpResponse fallbackResponse() { return new ClientHttpResponse() { @Override public HttpStatus getStatusCode() throws IOException { return HttpStatus.OK; } @Override public int getRawStatusCode() throws IOException { return 200; } @Override public String getStatusText() throws IOException { return OK; } @Override public void close() { } @Override public InputStream getBody() throws IOException { return new ByteArrayInputStream(The service is unavailable..getBytes()); } @Override public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); return headers; } }; } }
总结
Zuul网关有自动转发机制,但其实Zuul还有更多的应用场景,比如:鉴权、流量转发、请求统计等等,这些功能都可以使用Zuul来实现。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。