springcloud3 hystrix实现服务降级的案例配置2

一 服务降级的说明

1.1 服务降级说明

"服务器忙,请稍后在试"不让客户达等待,立即返回一个友好的提示。

1.2 服务降级的触发情况

1.程序运行异常;

2.超时;

3.服务熔断触发服务降级;4

.线程池/信号量打满也会导致服务降级

1.3 通用注解

springcloud3 hystrix实现服务降级的案例配置2_第1张图片

1.4  hystrix的作用

在springcloud的框架里,熔断机制是通过hystrix实现,hystrix会监控服务之间的调用。当失败调用达到一定的阈值,默认是5s内失败20次,就会启用hystrix的熔断机制,使用命令@HystrixCommand。

二 案例:对每一个方法实行降级处理

2.1 消费端

2.1.1 pom文件

   
    
      org.springframework.cloud
      spring-cloud-starter-netflix-hystrix
    

2.1.2 设置降级规则

代码

 @GetMapping(value = "/consumer/payment/nacos/{id}")
    @HystrixCommand(fallbackMethod = "dealFallBackInfo",commandProperties = {
            @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1500")
    })
    public String paymentInfo(@PathVariable("id") Long id)
    {
       System.out.println("获取服务器配置信息serverUrl:"+serverURL);
       System.out.println("9008的controller获取id:"+id);
       String str=orderConsumerService.getPaymentByIdLjf22222(id);
       return "ok:"+serverURL+""+str;
    }
    @GetMapping(value = "/consumer/getinfo/{id}")
    public Object getUserInfo(@PathVariable("id") Long id)
    {
        User u=new User(id.intValue(),"beijing"+id);
       return  orderConsumerService.postQueryParams(u);
    }
    public String dealFallBackInfo(@PathVariable("id") Long id)
    {
        return "我是消费者9008,服务出错了,进行服务降级"+id;
    }

springcloud3 hystrix实现服务降级的案例配置2_第2张图片

 2.1.3 开启hystrix熔断

添加:@EnableHystrix 注解

springcloud3 hystrix实现服务降级的案例配置2_第3张图片

 2.2 服务端

2.2.1 pom文件

   
    
      org.springframework.cloud
      spring-cloud-starter-netflix-hystrix
    

2.2.2 设置降级规则

1.代码

    @GetMapping(value = "/ljf/getinfo/{id}")
    @HystrixCommand(fallbackMethod = "dealFallBackInfo",commandProperties = {
            @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="3000")
    })
    public String getPayment(@PathVariable("id") Integer id)
    {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        int k=10/0;
        System.out.println("================服务9009 获取到的参数id:"+id);
        return "服务9009 获取到的参数id:"+id;
    }

    @PostMapping("/path")
   public  String postQueryParams(@RequestBody User user) throws JsonProcessingException {

       String str=  new JsonMapper().writeValueAsString(user);
       System.out.println("post提交....");
       return str;
    }
    public String dealFallBackInfo(@PathVariable("id") Long id)
    {
        return "我是消费者9009,服务出错了,进行服务降级"+id;
    }

2.截图

springcloud3 hystrix实现服务降级的案例配置2_第4张图片

 2.2.3 开启hystrix熔断

springcloud3 hystrix实现服务降级的案例配置2_第5张图片

  2.3 启动服务测试

1.启动nacos,启动sleuth

2.启动consumer9008   provider9009

springcloud3 hystrix实现服务降级的案例配置2_第6张图片

 3.测试

springcloud3 hystrix实现服务降级的案例配置2_第7张图片

三 案例:设置全局降级处理办法

3.1 消费端设置

1.代码

package com.ljf.mscloud.controller;

import com.ljf.mscloud.model.User;
import com.ljf.mscloud.service.OrderConsumerService;
import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

/**
 * @ClassName: OrderConsumerController
 * @Description: TODO
 * @Author: admin
 * @Date: 2023/08/14 18:09:14 
 * @Version: V1.0
 **/
@RestController
@Slf4j
@RefreshScope //支持Nacos的动态刷新功能。
//


@DefaultProperties(defaultFallback = "globalFallBackInfo")
public class OrderConsumerController {
    @Value("${service-url.nacos-user-service}")
   private String serverURL;
    @Autowired
    private OrderConsumerService orderConsumerService;


    @GetMapping(value = "/consumer/payment/nacos/{id}")
    @HystrixCommand(fallbackMethod = "dealFallBackInfo",commandProperties = {
            @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1500")
    })
    public String paymentInfo(@PathVariable("id") Long id)
    {
       System.out.println("获取服务器配置信息serverUrl:"+serverURL);
       System.out.println("9008的controller获取id:"+id);
       String str=orderConsumerService.getPaymentByIdLjf22222(id);
       return "ok:"+serverURL+""+str;
    }
    @GetMapping(value = "/consumer/getinfo/{id}")
    public Object getUserInfo(@PathVariable("id") Long id)
    {
        User u=new User(id.intValue(),"beijing"+id);
       return  orderConsumerService.postQueryParams(u);
    }
    public String dealFallBackInfo(@PathVariable("id") Long id)
    {
        return "我是消费者9008,服务出错了,进行服务降级"+id;
    }

    public String globalFallBackInfo()
    {

        return "Global异常处理信息,请稍后再试,客户端9008";
    }
}

2.截图

springcloud3 hystrix实现服务降级的案例配置2_第8张图片

springcloud3 hystrix实现服务降级的案例配置2_第9张图片

 原因在没有在制定方法加:@HystrixCommand  那么加上此注解后:

springcloud3 hystrix实现服务降级的案例配置2_第10张图片

 再次访问:http://localhost:9008/consumer/getinfo/666

springcloud3 hystrix实现服务降级的案例配置2_第11张图片

四 案例:给Feginclient注解的接口上添加降级规则

4.1 controller

package com.ljf.mscloud.controller;

import com.ljf.mscloud.model.User;
import com.ljf.mscloud.service.OrderConsumerService;
import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

/**
 * @ClassName: OrderConsumerController
 * @Description: TODO
 * @Author: admin
 * @Date: 2023/08/14 18:09:14 
 * @Version: V1.0
 **/
@RestController
@Slf4j
@RefreshScope //支持Nacos的动态刷新功能。
//
//@DefaultProperties(defaultFallback = "globalFallBackInfo")
public class OrderConsumerController {
    @Value("${service-url.nacos-user-service}")
   private String serverURL;
    @Autowired
    private OrderConsumerService orderConsumerService;


    @GetMapping(value = "/consumer/payment/nacos/{id}")
 //   @HystrixCommand(fallbackMethod = "dealFallBackInfo",commandProperties = {
    //        @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1500")
   // })
    public String paymentInfo(@PathVariable("id") Long id)
    {
       System.out.println("获取服务器配置信息serverUrl:"+serverURL);
       System.out.println("9008的controller获取id:"+id);
       String str=orderConsumerService.getPaymentByIdLjf22222(id);
       return "ok:"+serverURL+""+str;
    }
    @GetMapping(value = "/consumer/getinfo/{id}")
   // @HystrixCommand
    public Object getUserInfo(@PathVariable("id") Long id)
    {
        User u=new User(id.intValue(),"beijing"+id);
      //  int age = 10/0;
       return  orderConsumerService.postQueryParams(u);
    }
    public String dealFallBackInfo(@PathVariable("id") Long id)
    {

        return "我是消费者9008,服务出错了,进行服务降级"+id;
    }

    public String globalFallBackInfo()
    {

        return "Global异常处理信息,请稍后再试,客户端9008";
    }
}

4.2 service

package com.ljf.mscloud.service;


import com.ljf.mscloud.model.User;
import feign.Headers;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

@Component
@FeignClient(value = "mscloud-fegin-nacos-hystrix-provider9009",fallback = PaymentFallbackService.class)
public interface OrderConsumerService {
    @GetMapping(value = "/ljf/getinfo/{yyid}") //相当于:
    public String getPaymentByIdLjf22222(@PathVariable("yyid") Long ssid);
   // @Headers({"Content-Type: application/json"})
   // @PostMapping("/path")
    @PostMapping(value = "/path",consumes ="application/json")
    String postQueryParams(@RequestBody User user);
}

4.3 fallback实现类

@Component
public class PaymentFallbackService  implements OrderConsumerService{
    @Override
    public String getPaymentByIdLjf22222(Long ssid) {
        return "getPaymentByIdLjf22222方法出现问题开始降级";
    }

    @Override
    public String postQueryParams(User user) {
        return "postQueryParams方法出现问题开始降级";
    }
}

 4.4 配置文件

springcloud3 hystrix实现服务降级的案例配置2_第12张图片

 4.5 测试

1.故意只启动 consuemr9008,不启动provider9009 模拟宕机的情况

2.测试

springcloud3 hystrix实现服务降级的案例配置2_第13张图片

你可能感兴趣的:(springcloud3,spring,cloud)