分享

spring-cloud(六)路由器和过滤器[Zuul]

 关平藏书 2018-01-12

路由在微服务体系结构的一个组成部分。

例如,/可以映射到您的Web应用程序,/api/users映射到用户服务,并将/api/shop映射到商店服务。

Zuul是Netflix的基于JVM的路由器和服务器端负载均衡器。

1.png

本案例示例代码在 spring-cloud(三)声明性REST客户端[Feign] 及 spring-cloud(五)客户端负载平衡器[Ribbon] 基础上进行改造。

1.创建一个maven工程,tm-service-zuul

2.在pom文件中引入zuul的依赖支持

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-zuul</artifactId>
  4. </dependency>

3.在application.yml文件中增加zuul的路由规则

  1. eureka:
  2. client:
  3. serviceUrl:
  4. defaultZone: http://localhost:8761/eureka/
  5. server:
  6. port: 8767
  7. spring:
  8. application:
  9. name: service-zuul
  10. zuul:
  11. routes:
  12. api-ribbon:
  13. path: /api-r/**
  14. serviceId: service-ribbon
  15. api-feign:
  16. path: /api-f/**
  17. serviceId: service-feign

4.在主启动类上增加注解 @EnableZuulProxy

  1. @EnableZuulProxy
  2. @SpringBootApplication
  3. @EnableDiscoveryClient
  4. public class ServiceZuulApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(ServiceZuulApplication.class, args);
  7. }
  8. }

5.分别启动 tm-eureka-server,tm-service,tm-service-feign,tm-service-ribbon,tm-service-zuul

6.浏览器访问
http://192.168.2.14:8767/api-f/hello

2.png

http://192.168.2.14:8767/api-r/hello

3.png

出现如上图所示响应,说明路由规则生效了。

7.再增加filter类,创建TmFilter

  1. package cn.majingjing.tm.filter;
  2. import javax.servlet.http.HttpServletRequest;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.stereotype.Component;
  6. import com.netflix.zuul.ZuulFilter;
  7. import com.netflix.zuul.context.RequestContext;
  8. @Component
  9. public class TmFilter extends ZuulFilter {
  10. private static Logger log = LoggerFactory.getLogger(TmFilter.class);
  11. @Override
  12. public Object run() {
  13. RequestContext ctx = RequestContext.getCurrentContext();
  14. HttpServletRequest request = ctx.getRequest();
  15. log.info("{} , {}", request.getMethod(), request.getRequestURL().toString());
  16. Object token = request.getParameter("token");
  17. if (token == null || !"zuul".equals(token)) {
  18. ctx.setSendZuulResponse(false);
  19. ctx.setResponseStatusCode(401);
  20. try {
  21. ctx.getResponse().getWriter().write("token is invalid");
  22. } catch (Exception e) {
  23. }
  24. return null;
  25. }
  26. return null;
  27. }
  28. @Override
  29. public boolean shouldFilter() {
  30. return true;
  31. }
  32. @Override
  33. public int filterOrder() {
  34. return 0;
  35. }
  36. @Override
  37. public String filterType() {
  38. return "pre";
  39. }
  40. }

8.再次启动服务,并重复步骤6,发现请求被禁止。token无效

4.png

5.png

6.png

7.png

可以基于zuul的过滤器也生效了。

以上就是zuul的简单使用示例。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多