2021-07-14-自己搭的SpringCloud项目中的服务熔断

服务熔断
1.ribbon+resttempalte+hystrix

在所需方法上添加注解@HystrixCommand(fallbackMethod=“consumerServiceRibbonFallback”)
参数为你的处理方法consumerServiceRibbonFallback();

@RestController
public class ServiceController {

    @Autowired
    RestTemplate restTemplate;

    @Autowired
    public DiscoveryClient discoveryClient;

    @Value("${server.port}")
    String port;

    // 调用:localhost:6007/consumerServiceRibbon?token=1
    @RequestMapping("/consumerServiceRibbon")
    @HystrixCommand(fallbackMethod="consumerServiceRibbonFallback")
    public String consumerServiceRibbon(){
        List<String> services = discoveryClient.getServices();
        System.out.println("services:");
        for (String service : services) {
            System.out.println(service);
        }
        String result = this.restTemplate.postForObject("http://springbootService/service/rest?token=1", null, String.class);
        return result;
    }

    public String consumerServiceRibbonFallback(){
        return "consumerServiceRibbon异常,端口:" + port + ",Name=" ;
    }
}

2.openfeign+hystrix
写一个接口添加@FeignClient(value = “springbootService”, fallback=ServiceFallback.class),第二个参数为处理的类

@Component
@FeignClient(value = "springbootService", fallback=ServiceFallback.class) //这里的value对应调用服务的spring.applicatoin.name
public interface ServiceFeignClient {
    @RequestMapping(value = "/service/hello")
    RestfulResult hello();
}

ServiceFallback.java

@Component
public class ServiceFallback implements ServiceFeignClient{

    @Override
    public RestfulResult hello() {
        RestfulResult result = new RestfulResult();
        result.setData("服务调用失败");
        return result;
    }
}

3.zuul+hystrix
直接实现FallbackProvider接口,重写方法即可

在启动类的同级先创建包,再把这个文件放进包里

@Component
public class ServiceFallbackProvider implements FallbackProvider {
    @Override
    // 指定熔断器功能应用于哪些路由的服务
    public String getRoute() {
        // 这里只针对"springbootService"服务进行熔断
        // 如果需要针对所有服务熔断,则return "*"
        return "*";
    }

    @Override
    public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
        System.out.println("route:"+route);

        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("Sorry, the service is unavailable now.".getBytes());
            }

            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.APPLICATION_JSON);
                return headers;
            }
        };
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值