配置

  1. zuul:
  2. routes:
  3. client-a:
  4. path: /client/**
  5. serviceId: client-a

filter

image.png
image.png

  1. public class AccessUserNameFilter extends ZuulFilter {
  2. @Override
  3. public Object run() {
  4. RequestContext ctx = RequestContext.getCurrentContext();
  5. HttpServletRequest request = ctx.getRequest();
  6. System.out.println(String.format("%s AccessUserNameFilter request to %s", request.getMethod(), request.getRequestURL().toString()));
  7. String username = request.getParameter("username");// 获取请求的参数
  8. if(null != username && username.equals("chhliu")) {// 如果请求的参数不为空,且值为chhliu时,则通过
  9. ctx.setSendZuulResponse(true);// 对该请求进行路由
  10. ctx.setResponseStatusCode(200);
  11. ctx.set("isSuccess", true);// 设值,让下一个Filter看到上一个Filter的状态
  12. return null;
  13. }else{
  14. ctx.setSendZuulResponse(false);// 过滤该请求,不对其进行路由
  15. ctx.setResponseStatusCode(401);// 返回错误码
  16. ctx.setResponseBody("{\"result\":\"username is not correct!\"}");// 返回错误内容
  17. ctx.set("isSuccess", false);
  18. return null;
  19. }
  20. }
  21. @Override
  22. public boolean shouldFilter() {
  23. return true;// 是否执行该过滤器,此处为true,说明需要过滤
  24. }
  25. @Override
  26. public int filterOrder() {
  27. return 0;// 优先级为0,数字越大,优先级越低
  28. }
  29. @Override
  30. public String filterType() {
  31. return "pre";// 前置过滤器
  32. }
  33. }
  • ctx.setSendZuulResponse(true);// 对该请求进行路由

    zuul整合Hystrix

    1. @Component
    2. public class ProductFallback implements ZuulFallbackProvider {
    3. /**
    4. * 指定需要托底处理的服务名
    5. */
    6. @Override
    7. public String getRoute() {
    8. return "e-book-product-provider";
    9. }
    10. /**
    11. * 服务无法使用时,返回的托底信息
    12. */
    13. @Override
    14. public ClientHttpResponse fallbackResponse() {
    15. return new ClientHttpResponse() {
    16. /**
    17. * ClientHttpResponse 的 fallback 的状态码 返回HttpStatus
    18. */
    19. @Override
    20. public HttpStatus getStatusCode() throws IOException {
    21. return HttpStatus.OK;
    22. }
    23. /**
    24. * ClientHttpResponse 的 fallback 的状态码 返回 int
    25. */
    26. @Override
    27. public int getRawStatusCode() throws IOException {
    28. return getStatusCode().value();
    29. }
    30. /**
    31. * ClientHttpResponse 的 fallback 的状态码 返回 String
    32. */
    33. @Override
    34. public String getStatusText() throws IOException {
    35. return getStatusCode().getReasonPhrase();
    36. }
    37. /**
    38. * 设置响应体
    39. */
    40. @Override
    41. public InputStream getBody() throws IOException {
    42. String msg = "当前服务不可用,请稍后再试";
    43. return new ByteArrayInputStream(msg.getBytes());
    44. }
    45. /**
    46. * 设置响应的头信息
    47. */
    48. @Override
    49. public HttpHeaders getHeaders() {
    50. HttpHeaders httpHeaders= new HttpHeaders();
    51. MediaType mediaType = new MediaType("application","json", Charset.forName("utf-8"));
    52. httpHeaders.setContentType(mediaType);
    53. return httpHeaders;
    54. }
    55. @Override
    56. public void close() {
    57. }
    58. };
    59. }
    60. }

    sensitiveHeaders和ignoredHeaders区别

    By default, Zuul considers Cookie,Set-Cookie,Authorization to be sensitive?
    spring boot - What’s the difference between zuul.ignoredHeaders and zuul.sensitiveHeaders - Stack Overflow

  • sensitiveHeaders会过滤客户端附带的headers

  • zuul.ignoredHeaders会过滤服务之间通信附带的headers
  • sensitiveHeaders的内容会最终合并到ignored-headers内。

Zuul 配置项中 sensitiveHeaders 和 ignoredHeaders 的不同_ahutdbx的博客-CSDN博客
怎么区分客户端的?

限流

spring-cloud-zuul-ratelimit
image.png

自定义limitKey:RateLimitKeyGenerator

image.png

自定义限流错误:DefaultRateLimiterErrorHandler