本文共 3563 字,大约阅读时间需要 11 分钟。
zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用。
请参考官方文档:
Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如/api/user转发到到user服务,/api/shop转发到到shop服务。zuul默认和Ribbon结合实现了负载均衡的功能。
4.0.0 com.cntaiping.tpa zuul 0.0.1-SNAPSHOT jar zuul Demo project for Spring Boot com.cntaiping.tpa cloud 1.0-SNAPSHOT org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-netflix-zuul
eureka.client.serviceUrl.defaultZone=http://localhost:8800/eureka/server.port=8400spring.application.name=service-zuul#表示只要访问以/api-a/开头的多层目录都可以路由到 id为compute-service的服务上zuul.routes.consumer-feign=/api-a/**zuul.routes.consumer-hystrix=/api-b/**
服务消费者也可以作为服务提供者。
以/api-a/ 开头的请求都转发给consumer-feign服务;以/api-b/开头的请求都转发给consumer-hystrix服务;package com.cntaiping.tpa.zuul;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.SpringCloudApplication;import org.springframework.cloud.netflix.zuul.EnableZuulProxy;/** * @SpringCloudApplication注解 * 整合了@SpringBootApplication、@EnableEurekaClient、@EnableCircuitBreaker * 主要目的还是简化配置 */@EnableZuulProxy@SpringCloudApplicationpublic class ZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class, args); }}
从执行结果可以说明zuul起到了路由的作用
可以通过zuul提供的过滤器,进行一些请求过滤,比如安全验证。
停止模块,增加过滤器类如下。package com.cntaiping.tpa.zuul.filter;import com.netflix.zuul.ZuulFilter;import com.netflix.zuul.context.RequestContext;import com.netflix.zuul.exception.ZuulException;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;@Componentpublic class TokenFilter extends ZuulFilter { private static Logger log = LoggerFactory.getLogger(TokenFilter.class); /** 返回一个字符串代表过滤器的类型, pre:路由之前 routing:路由之时 post: 路由之后 error:发送错误调用 */ @Override public String filterType() { return "pre"; } /** 过滤的顺序 */ @Override public int filterOrder() { return 0; } /** 这里可以写逻辑判断,是否要过滤,本文true,永远过滤。 */ @Override public boolean shouldFilter() { return true; } /** 过滤器的具体逻辑。 */ @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; }}
重新运行模块
转载地址:http://wwtab.baihongyu.com/