浏览代码

0802 sentinel服务熔断和降级

Qing 9 月之前
父节点
当前提交
b40c4dd22c

+ 2 - 1
springcloud-demo/service-consumer-demo/src/main/java/com/sf/config/feign/FeignConfig.java

@@ -18,7 +18,8 @@ public class FeignConfig {
     // 另一种配置日志级别的方式
     @Bean
     public Logger.Level feignLoggerLevel() {
-        return Logger.Level.FULL;
+//        return Logger.Level.FULL;
+        return Logger.Level.NONE;
     }
 
     // 设置请求的超时时间

+ 4 - 1
springcloud-demo/service-consumer-demo/src/main/java/com/sf/controller/ProviderController.java

@@ -2,7 +2,9 @@ package com.sf.controller;
 
 import com.sf.dto.UserDto;
 import com.sf.remote.MyProviderClient;
+import jakarta.annotation.Resource;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.HashMap;
@@ -13,7 +15,8 @@ import java.util.Map;
 public class ProviderController {
 
     // 把MyProviderClient作为对象 从spring容器中注入进来
-    @Autowired
+    @Resource
+//    @Autowired
     private MyProviderClient myProviderClient;
 
     // http://localhost:8080/openfeign/echo/123456

+ 4 - 1
springcloud-demo/service-consumer-demo/src/main/java/com/sf/remote/MyProviderClient.java

@@ -13,7 +13,10 @@ import java.util.Map;
 //        configuration = NacosLoadBalancerConfig.class)
 // 不走通用的配置  单独指定配置
 //@FeignClient(value = "service-provider-demo",configuration = FeignConfig.class)
-@FeignClient("service-provider-demo")
+// 服务降级 回退类的写法
+//@FeignClient(value = "service-provider-demo",fallback = ProviderFallback.class)
+// 服务降级 回退工厂的写法
+@FeignClient(value = "service-provider-demo",fallbackFactory = ProviderFallbackFactory.class)
 public interface MyProviderClient {
 
     // 通过一系列的注解配置 可以映射为当前方法对应的远程调用地址为

+ 68 - 0
springcloud-demo/service-consumer-demo/src/main/java/com/sf/remote/ProviderFallback.java

@@ -0,0 +1,68 @@
+package com.sf.remote;
+
+import com.sf.dto.UserDto;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+// 服务降级的方法
+// 当下游服务不可用时  使用当前回退类中的实现
+@Component
+public class ProviderFallback implements MyProviderClient{
+
+    @Override
+    public String echo(String string) {
+        System.out.println("ProviderFallback echo");
+        return "fail";
+    }
+
+    @Override
+    public String random(int range) {
+        return "fail";
+    }
+
+    @Override
+    public String testParam(String param) {
+        return "";
+    }
+
+    @Override
+    public String testMultiParam(UserDto userDto) {
+        return "";
+    }
+
+    @Override
+    public String testMultiParam(String name, Integer age) {
+        return "";
+    }
+
+    @Override
+    public String testMultiParam(Map<String, Object> map) {
+        return "";
+    }
+
+    @Override
+    public String postUser(UserDto user) {
+        return "";
+    }
+
+    @Override
+    public String token() {
+        return "";
+    }
+
+    @Override
+    public String token(String token) {
+        return "";
+    }
+
+    @Override
+    public String tokenByInterceptor() {
+        return "";
+    }
+
+    @Override
+    public String timeout() {
+        return "";
+    }
+}

+ 79 - 0
springcloud-demo/service-consumer-demo/src/main/java/com/sf/remote/ProviderFallbackFactory.java

@@ -0,0 +1,79 @@
+package com.sf.remote;
+
+import com.sf.dto.UserDto;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+// 声明一个回退工厂类
+// 工厂类的泛型 是要调用的接口/接口实现类
+// 和直接使用Fallback回退类的区别是 可以处理异常
+@Component
+public class ProviderFallbackFactory implements FallbackFactory<MyProviderClient> {
+
+    // 重写create方法 会返回泛型类型
+    @Override
+    public MyProviderClient create(Throwable cause) {
+        System.out.println("调用provider出错:" + cause.getMessage());
+        // 使用匿名内部类 来返回接口的实现
+        return new MyProviderClient() {
+
+            @Override
+            public String echo(String string) {
+//                cause.printStackTrace();
+                return "ProviderFallbackFactory echo fail";
+            }
+
+            @Override
+            public String random(int range) {
+                return "ProviderFallbackFactory random fail";
+            }
+
+            @Override
+            public String testParam(String param) {
+                return "";
+            }
+
+            @Override
+            public String testMultiParam(UserDto userDto) {
+                return "";
+            }
+
+            @Override
+            public String testMultiParam(String name, Integer age) {
+                return "";
+            }
+
+            @Override
+            public String testMultiParam(Map<String, Object> map) {
+                return "";
+            }
+
+            @Override
+            public String postUser(UserDto user) {
+                return "";
+            }
+
+            @Override
+            public String token() {
+                return "";
+            }
+
+            @Override
+            public String token(String token) {
+                return "";
+            }
+
+            @Override
+            public String tokenByInterceptor() {
+                return "";
+            }
+
+            @Override
+            public String timeout() {
+                return "";
+            }
+        };
+    }
+}

+ 3 - 0
springcloud-demo/service-provider-demo/src/main/java/com/sf/controller/HelloController.java

@@ -24,9 +24,12 @@ public class HelloController {
 
 
     // http://localhost:8070/random/100
+    @SneakyThrows
     @GetMapping("/random/{range}")
     public String random(@PathVariable("range") int range) {
         System.out.println("random:" + range);
+        // 手动设置响应时间
+        TimeUnit.MILLISECONDS.sleep(range);
         int randomResult = (int) (Math.random() * range);
         System.out.println("randomResult:" + randomResult);
         return randomResult + "";