在学习或使用Zuul的时候我们可以进行服务的熔断处理,比如通过zuul去访问呢A服务,这是A服务并没有开启服务或者因其他的异常导致不发提供服务时,这是我们调用肯定会有异常,这时就必须进行服务的熔断处理!如果还不太了解Gateway的一些常用配置的可以看上一篇张SpringCloudGateway配置介绍

一.创建项目

文末有源代码地址哦

  <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
 
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

二.配置文件

server:
  port: 7000
spring:
  application:
    name: javayh-gateway
  main:
    allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册
  profiles:
    active: gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        cluster-name: javayh-nacos
      config:
        group: javayh
        server-addr: 127.0.0.1:8848
        prefix: javayh-gateway
        file-extension: yml
    gateway:
      discovery:
        locator:
          enabled: true
          # 服务名小写
          lower-case-service-id: true
      routes:
        - id: api-javayh-demo
          # lb代表从注册中心获取服务,且已负载均衡方式转发
          uri: lb://javayh-demo
          predicates:
            - Path=/demo/**
          # 加上StripPrefix=1,否则转发到后端服务时会带上demo前缀
          filters:
            - StripPrefix=1
            # 服务降级  触发调用 HystrixFallbackHandler GatewayFallbackConfig
            - name: Hystrix
              args:
                name: default
                fallbackUri: 'forward:/defaultfallback'

三.定义 HystrixFallback

@Configuration
public class GatewayFallbackConfig {

    @Autowired
    private HystrixFallbackHandler hystrixFallbackHandler;

    @Bean
    public RouterFunction routerFunction() {
        return RouterFunctions.route(
                RequestPredicates.GET("/defaultfallback")
                        .and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), hystrixFallbackHandler);
    }

}


@Slf4j
@Component
public class HystrixFallbackHandler implements HandlerFunction<ServerResponse> {

    @Override
    public Mono<ServerResponse> handle(ServerRequest serverRequest) {
    	
        serverRequest.attribute(ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR)
            .ifPresent(originalUrls -> log.error("网关执行请求:{}失败,hystrix服务降级处理", originalUrls));
        return ServerResponse
            .status(HttpStatus.INTERNAL_SERVER_ERROR)
            .contentType(MediaType.APPLICATION_JSON_UTF8)
            .body(BodyInserters.fromObject(ResultData.fail("HystrixFallbackHandler")));
    }
}

四.验证

此时启动我的注册中心(本文使用的时nacos),启动gateway服务,访问A服务的请求路径 如: http://localhost:7000/demo/javayh/demo/gateway
这是没有A服务我们即可验证配置是否生效
根据访问的效果,服务熔断已经实现!msg内是我们的提示信息!
在这里插入图片描述
项目源代码,已上传到Github上 ,欢迎star; https://github.com/Dylan-haiji/javayh-platform/tree/master/javayh-route/javayh-api-gateway
本文的分享暂时就到这里,希望对您有所帮助
关注 Java有货领取更多资料

联系小编。微信:372787553,带您进群互相学习
左侧小编微信,右侧获取免费资料
在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐