• 网关,智能路由、访问过滤
  • 默认会用ribbon负载均衡
  • application.yml
    • zuul:
              prefix: /v1
              routes:
                  hiapi:
                      path: /hiapi/**
                      serviceId: erp-consumer-metadb
                      # url: http://localhost:8762  # 这样写不会做负载均衡
                      # serviceId: hiapi-v1
       
      ## 手动url负载均衡
          # ribbon: 
          #   eureka:
          #     enabled: false
          # hiapi-v1:
          #   ribbon:
          #     listOfServers: http://localhost:8762,http://localhost:8763
  • 案例
    • 过滤
      • import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;
                @Component
                public class MyFilter extends ZuulFilter {
         
                    private static Logger log = LoggerFactory.getLogger(MyFilter.class);
         
                    @Override
                    public String filterType() {
                        return PRE_TYPE;
                    }
         
                    @Override
                    public int filterOrder() {
                        return 0;
                    }
         
                    @Override
                    public boolean shouldFilter() {
                        return true;
                    }
         
                    @Override
                    public Object run() {
                        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;
                    }
                }
    • 熔断
      • @Component
                public class MyFallbackProvider implements ZuulFallbackProvider {
                    @Override
                    public String getRoute() {
                        return "*";
                    }
         
                    @Override
                    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("error, I'm the fallback".getBytes());
                            }
         
                            @Override
                            public HttpHeaders getHeaders() {
                                HttpHeaders headers = new HttpHeaders();
                                headers.setContentType(MediaType.APPLICATION_JSON);
                                return headers;
                            }
                        };
                    }
                }