栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring Cloud Zuul路由网关服务过滤实现代码

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring Cloud Zuul路由网关服务过滤实现代码

Zuul 简介

Zuul 的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如 /api/admin 转发到到 Admin 服务,/api/member 转发到到 Member 服务。Zuul 默认和 Ribbon 结合实现了负载均衡的功能。

引入依赖

在 pom.xml 中主要添加 spring-cloud-starter-netflix-eureka-server 和 spring-cloud-starter-netflix-zuul 依赖


  org.springframework.cloud
  spring-cloud-starter-netflix-eureka-server


  org.springframework.cloud
  spring-cloud-starter-netflix-zuul

相关配置

在 application.yml 中主要添加 Zuul 路由配置

zuul:
 routes:
  api-a:
   path: /api/ribbon
@Component
public class WebAdminFeignFallbackProvider implements FallbackProvider {

  @Override
  public String getRoute() {
    // ServiceId,如果需要所有调用都支持回退,则 return "*" 或 return null
    return "hello-spring-cloud-web-admin-feign";
  }

  
  @Override
  public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
    return new ClientHttpResponse() {
      
      @Override
      public HttpStatus getStatusCode() throws IOException {
 return HttpStatus.OK;
      }

      @Override
      public int getRawStatusCode() throws IOException {
 return HttpStatus.OK.value();
      }

      @Override
      public String getStatusText() throws IOException {
 return HttpStatus.OK.getReasonPhrase();
      }

      @Override
      public void close() {

      }

      @Override
      public InputStream getBody() throws IOException {
 ObjectMapper objectMapper = new ObjectMapper();
 Map map = new HashMap<>();
 map.put("status", 200);
 map.put("message", "无法连接");
 return new ByteArrayInputStream(objectMapper.writevalueAsString(map).getBytes("UTF-8"));
      }

      @Override
      public HttpHeaders getHeaders() {
 HttpHeaders headers = new HttpHeaders();
 // 和 getBody 中的内容编码一致
 headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
 return headers;
      }
    };
  }
}

测试路由访问

依次运行 EurekaApplication > ServiceAdminApplication > WebAdminRibbonApplication > WebAdminFeignApplication > ZuulApplication 各服务

访问:http://localhost:8769/api/ribbon/hi?message=zuul

浏览器显示

port : 8763,message : zuul

访问:http://localhost:8769/api/feign/hi?message=zuul

浏览器显示

port : 8763,message : zuul

至此说明 Zuul 的路由功能配置成功。

使用 Zuul 的服务过滤功能

Zuul 不仅仅只是路由,还有很多强大的功能。比如用在安全验证方面。

创建服务过滤器


@Component
public class LoginFilter extends ZuulFilter {

  private static final Logger logger = LoggerFactory.getLogger(LoginFilter.class);

  
  @Override
  public String filterType() {
    return "pre";
  }

  
  @Override
  public int filterOrder() {
    return 0;
  }

  
  @Override
  public boolean shouldFilter() {
    return true;
  }

  
  @Override
  public Object run() throws ZuulException {
    RequestContext context = RequestContext.getCurrentContext();
    HttpServletRequest request = context.getRequest();
    String token = request.getParameter("token");
    if (token == null) {
      logger.warn("Token is empty");
      context.setSendZuulResponse(false);
      context.setResponseStatusCode(401);
      try {
 context.getResponse().getWriter().write("Token is empty");
      } catch (IOException e) {
      }
    } else {
      logger.info("OK");
    }
    return null;
  }
}

测试过滤器

访问:http://localhost:8769/api/feign/hi?message=zuul

网页显示

Token is empty

访问:http://localhost:8769/api/feign/hi?message=zuul&token=1

网页显示

port : 8763,message : zuul

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/134484.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号