springcloud之zuul网关路由

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangxing52077/article/details/82147190

1.场景还原

     在微服务架构中,zuul作为springcloud重要的网关路由组件,为前端统一的ip请求提供了极大的便捷;笔者在实际项目中,通过微服务模块名路由到指定的节点模块

2.实现方案

①pom依赖

<!--网关-->
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>

②application.yml配置

zuul:
  routes:
    dispatch:
      path: /dispatch/**
      serviceId: micro-service-dispatch
    freeride:
      path: /freeride/**
      serviceId: micro-service-freeride
    user:
      path: /user/**
      serviceId: micro-service-user
    payment:
      path: /payment/**
      serviceId: micro-service-payment
    comment:
      path: /comment/**
      serviceId: micro-service-comment
    tradingArea:
      path: /tradingArea/**
      serviceId: micro-service-tradingarea
    protocol:
      path: /protocol/**
      serviceId: micro-service-doc-protocol


#zuul超时
  max:
    host:
      connections: 6000
  host:
    socket-timeout-millis: 60000
    connect-timeout-millis: 60000

如上配置对工程模块进行了相应的路由,还对zuul超时时间做了相应的配置

③启动类配置

@SpringBootApplication
@EnableZuulProxy
public class MircoServiceGatewayApplication {

   public static void main(String[] args) {
      SpringApplication.run(MircoServiceGatewayApplication.class, args);
   }

   @Bean
   public YiViZuulFilter yiViZuulFilter() {
      return new YiViZuulFilter();
   }
}

④zuul拦截过滤设置

@Slf4j
public class YiViZuulFilter extends ZuulFilter {
 

  @Override
  public boolean shouldFilter() {
    return true; //是否拦截
  }

  @Override
  public Object run() {
    //过滤处理逻辑
    HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
    String host = request.getRemoteHost();
    int port = request.getRemotePort();
    log.info("请求的host:{}", host+",请求的端口:{}"+port);
    return null;
  }

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

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

}

⑤zuul路由失败回退设置

@Component
public class YiViFallbackProvider implements ZuulFallbackProvider {

  @Override
  public String getRoute() {
    return null;
  }

  @Override
  public ClientHttpResponse fallbackResponse() {
    return new ClientHttpResponse() {
      @Override
      public HttpStatus getStatusCode() throws IOException {
        return HttpStatus.REQUEST_TIMEOUT;
      }

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

      @Override
      public String getStatusText() throws IOException {
        return HttpStatus.REQUEST_TIMEOUT.name();
      }

      @Override
      public void close() {
      }

      @Override
      public InputStream getBody() throws IOException {
        String result = new GsonBuilder().create().toJson(ImmutableMap.of("code", 408, "msg", "服务请求超时,请重试!"));
        return new ByteArrayInputStream(result.getBytes());
      }

      @Override
      public HttpHeaders getHeaders() {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        return headers;
      }
    };
  }
}

好了,我是张星,欢迎加入博主技术交流群,群号:526601468

猜你喜欢

转载自blog.csdn.net/zhangxing52077/article/details/82147190