上一篇《微服务实战spring cloud tencent系列(十五)实战Spring Cloud Tencent 服务熔断降级之自定义fallback降级策略》文章我们介绍了使用feign client进行调用的时候实现服务熔断降级,在这里我们再演示下spring cloud gateway端实现服务的熔断降级。下面直接开始演示:
首先创建一个gateway-service,并且配置实现通过网关访问user-service
这里的话,我们添加一个user-service的服务,然后配置下转发user-service,实现可以通过网关访问到user-service,具体的代码暂时就不粘贴了,因为熟悉微服务的话,编写一个网关应该没啥问题,如果不懂的话,可以直接看本文末的源码。
这里的话,假设我们已经写好了gateway-servervice,并且配置好了user-service的访问,那么我们直接访问以下的地址:
http://127.0.0.1:8080/users/test
然后可以看到能访问到user-serivie了。
这里我们在网关层添加服务熔断的时候,很简单,只需要在gateway-service的application.yml文件和bootstrap.yml文件上配置对应的信息即可。
在application.yml文件中,我们需要配置的信息是:
spring: cloud: gateway: default-filters: routes: - id: user-service uri: lb://user-service predicates: - Path=/users/** filters: - StripPrefix=1 - RemoveResponseHeader=uid - name: CircuitBreaker args: # statusCodes,可选参数,配置熔断的匹配返回码,缺省时会自动识别 "5**" 为错误,可以为"4**,5**"的形式,也可以为具体的返回码 statusCodes: 404,5** # fallbackUri,可选参数,配置熔断降级的转发路由方法,缺省时会在熔断触发后拉取 plaris server 配置的降级作为 response fallbackUri: forward:/polaris-fallback
关于熔断降级的核心配置主要是下图圈起来的部分:
然后我们还需要在bootstrap.yml文件中配置以下的信息:
spring: application: name: gateway-service cloud: polaris: address: grpc://192.168.31.218:8091 namespace: shop config: address: grpc://192.168.31.218:8093 # 选填,只有在配置中心和注册中心是两个不同的地址时才需要配置 auto-refresh: true # 选填,当配置发布后,动态刷新 Spring 上下文,默认值为 true ratelimit: rejectHttpCode: 200 #自定义拒绝请求响应的 Http 状态码 rejectRequestTips: "{\"errorCode\":501,\"errorMg\":\"当前服务请求繁忙,请稍候重试\",\"data\":null}" #自定义拒绝请求响应的文本内容 gateway: discovery: locator: enabled: true 'predicates[0]': name: Path args: patterns: '''/'' + serviceId + ''/**''' 'filters[0]': name: RewritePath args: regexp: '''/'' + serviceId + ''/(?<remaining>.*)''' replacement: '''/$\{remaining}''' 'filters[1]': # 配置熔断 Filter name: CircuitBreaker args: # statusCodes,可选参数,配置熔断的匹配返回码,缺省时会自动识别 "5**" 为错误,可以为"4**,5**"的形式,也可以为具体的返回码 statusCodes: '''404,5**''' # fallbackUri,可选参数,配置熔断降级的转发路由方法,缺省时会在熔断触发后拉取 plaris server 配置的降级作为 response fallbackUri: '''forward:/polaris-fallback'''
当然关于服务熔断降级的核心配置还是如下图圈起来的部分:
在这两个配置文件中,我们都带有一个fallbackUri,这就是一个服务熔断降级的自定义方法,所以这里我们可以编写一个controller,来实现服务降级熔断,代码示例如下:
package org.gateway.service.controller; import org.gateway.service.model.BaseResponse; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import com.alibaba.fastjson.JSON; import reactor.core.publisher.Mono; @RestController public class FallBackController { @GetMapping("/polaris-fallback") public Mono<String> getFallback() { BaseResponse response = new BaseResponse(); response.setSuccess(false); response.setCode(501); response.setMessage("当前服务不可访问,已在网关层进行降级"); return Mono.just(JSON.toJSONString(response)); } }
以上我们就实现了在网关层进行服务降级的配置,然后我们只启动gateway-service,不启动user-service,我们测试访问下:http://127.0.0.1:8080/users/test。
可以看到直接进行了服务熔断降级。
备注:
1、个人在尝试了spring cloud tencent gateway的服务降级之后,感觉比aspring cloud alibaba好用多了。
2、在这里我们在项目里面配置了fallbackUri,然后编写的熔断方法,其实这里也可以直接在北极星(Polaris Mesh)上配置对应的返回,但是我们知道北极星上配置熔断降级自定义响应内容的话,只有服务触发了熔断规则之后才会使用这里的自定义内容,如果没有达到熔断规则的条件,那么会直接报错,所以这里的gateway的话,我们还是建议直接在项目里面编写这个fallbackuri。
最后按照惯例,附上本案例的源码,登录后即可下载。
还没有评论,来说两句吧...