Browse Source

0421 cloud micrometer

Qing 1 year ago
parent
commit
d7c6ed3e55

+ 19 - 9
springcloud-demo/.idea/workspace.xml

@@ -4,14 +4,11 @@
     <option name="autoReloadType" value="SELECTIVE" />
   </component>
   <component name="ChangeListManager">
-    <list default="true" id="4074a161-1a6c-49f9-bbc5-f70fc0666d46" name="Changes" comment="0414 cloud openfeign">
+    <list default="true" id="4074a161-1a6c-49f9-bbc5-f70fc0666d46" name="Changes" comment="0421 cloud openfeign header">
       <change afterPath="$PROJECT_DIR$/../.idea/VIPJAVA.iml" afterDir="false" />
       <change afterPath="$PROJECT_DIR$/../gn_oa_vip27/.idea/google-java-format.xml" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/eureka-client-caller-demo/src/main/java/com/sf/eurekaclientdemo1/dto/RandomParam.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/eureka-client-supplier-demo/src/main/java/com/sf/eurekaclientdemo2/controller/CalcController.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/eureka-client-supplier-demo/src/main/java/com/sf/eurekaclientdemo2/controller/HeaderController.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/eureka-client-supplier-demo/src/main/java/com/sf/eurekaclientdemo2/controller/PostController.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/eureka-client-supplier-demo/src/main/java/com/sf/eurekaclientdemo2/dto/RandomParam.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/eureka-client-supplier-demo/src/main/java/com/sf/eurekaclientdemo2/controller/CircuitController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/eureka-client-supplier-demo/src/main/java/com/sf/eurekaclientdemo2/controller/MicrometerController.java" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/../02_JavaWeb/day06_mybatis/src/main/java/com/lc/mapper/UserMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/../02_JavaWeb/day06_mybatis/src/main/java/com/lc/mapper/UserMapper.java" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/../02_JavaWeb/day06_mybatis/src/main/resources/com/lc/mapper/UserMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/../02_JavaWeb/day06_mybatis/src/main/resources/com/lc/mapper/UserMapper.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/../02_JavaWeb/day07_mybatis/src/main/resources/com/lc/mapper/UserMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/../02_JavaWeb/day07_mybatis/src/main/resources/com/lc/mapper/UserMapper.xml" afterDir="false" />
@@ -25,7 +22,10 @@
       <change beforePath="$PROJECT_DIR$/eureka-client-caller-demo/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/eureka-client-caller-demo/pom.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/eureka-client-caller-demo/src/main/java/com/sf/eurekaclientdemo1/controller/FeignController.java" beforeDir="false" afterPath="$PROJECT_DIR$/eureka-client-caller-demo/src/main/java/com/sf/eurekaclientdemo1/controller/FeignController.java" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/eureka-client-caller-demo/src/main/java/com/sf/eurekaclientdemo1/feign/MyFeignClient.java" beforeDir="false" afterPath="$PROJECT_DIR$/eureka-client-caller-demo/src/main/java/com/sf/eurekaclientdemo1/feign/MyFeignClient.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/eureka-client-caller-demo/src/main/resources/application.yml" beforeDir="false" afterPath="$PROJECT_DIR$/eureka-client-caller-demo/src/main/resources/application.yml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/eureka-client-supplier-demo/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/eureka-client-supplier-demo/pom.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/eureka-client-supplier-demo/src/main/java/com/sf/eurekaclientdemo2/controller/HeaderController.java" beforeDir="false" afterPath="$PROJECT_DIR$/eureka-client-supplier-demo/src/main/java/com/sf/eurekaclientdemo2/controller/HeaderController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/eureka-client-supplier-demo/src/main/resources/application.yml" beforeDir="false" afterPath="$PROJECT_DIR$/eureka-client-supplier-demo/src/main/resources/application.yml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/pom.xml" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
@@ -242,7 +242,7 @@
       <workItem from="1712747538100" duration="4625000" />
       <workItem from="1713064649248" duration="15928000" />
       <workItem from="1713347248141" duration="10258000" />
-      <workItem from="1713617762986" duration="13689000" />
+      <workItem from="1713617762986" duration="18470000" />
     </task>
     <task id="LOCAL-00001" summary="0410 cloud eureka">
       <option name="closed" value="true" />
@@ -292,7 +292,15 @@
       <option name="project" value="LOCAL" />
       <updated>1713673447631</updated>
     </task>
-    <option name="localTasksCounter" value="7" />
+    <task id="LOCAL-00007" summary="0421 cloud openfeign header">
+      <option name="closed" value="true" />
+      <created>1713681592546</created>
+      <option name="number" value="00007" />
+      <option name="presentableId" value="LOCAL-00007" />
+      <option name="project" value="LOCAL" />
+      <updated>1713681592546</updated>
+    </task>
+    <option name="localTasksCounter" value="8" />
     <servers />
   </component>
   <component name="TypeScriptGeneratedFilesManager">
@@ -391,7 +399,9 @@
     <MESSAGE value="0414 cloud eureka" />
     <MESSAGE value="0414 cloud loadbalancer+feign" />
     <MESSAGE value="0414 cloud openfeign" />
-    <option name="LAST_COMMIT_MESSAGE" value="0414 cloud openfeign" />
+    <MESSAGE value="0414 cloud openfeign header" />
+    <MESSAGE value="0421 cloud openfeign header" />
+    <option name="LAST_COMMIT_MESSAGE" value="0421 cloud openfeign header" />
   </component>
   <component name="XSLT-Support.FileAssociations.UIState">
     <expand />

+ 36 - 0
springcloud-demo/eureka-client-caller-demo/pom.xml

@@ -38,6 +38,42 @@
             <version>1.18.32</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
+        </dependency>
+        <!-- 由于断路保护等需要AOP实现,所以必须导入AOP包 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+
+        <!--micrometer-tracing指标追踪  1-->
+        <dependency>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-tracing</artifactId>
+        </dependency>
+        <!--micrometer-tracing-bridge-brave适配zipkin的桥接包 2-->
+        <dependency>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-tracing-bridge-brave</artifactId>
+        </dependency>
+        <!--micrometer-observation 3-->
+        <dependency>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-observation</artifactId>
+        </dependency>
+        <!--feign-micrometer 4-->
+        <dependency>
+            <groupId>io.github.openfeign</groupId>
+            <artifactId>feign-micrometer</artifactId>
+        </dependency>
+        <!--zipkin-reporter-brave 5-->
+        <dependency>
+            <groupId>io.zipkin.reporter2</groupId>
+            <artifactId>zipkin-reporter-brave</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>

+ 21 - 0
springcloud-demo/eureka-client-caller-demo/src/main/java/com/sf/eurekaclientdemo1/controller/FeignController.java

@@ -3,6 +3,7 @@ package com.sf.eurekaclientdemo1.controller;
 import com.sf.eurekaclientdemo1.dto.RandomParam;
 import com.sf.eurekaclientdemo1.dto.User;
 import com.sf.eurekaclientdemo1.feign.MyFeignClient;
+import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -90,4 +91,24 @@ public class FeignController {
     }
 
 
+    //  http://localhost:18091/circuit/1
+    //  http://localhost:18091/circuit/-1
+    @GetMapping("/circuit/{id}")
+    @CircuitBreaker(name = "eureka-client-supplier-demo", fallbackMethod = "myFallBackMethod")
+    public String circuit(@PathVariable("id") Integer id) {
+        System.out.println("caller circuit id: " + id);
+        return myFeignClient.circuit(id);
+    }
+
+    public String myFallBackMethod(Integer id, Throwable throwable) {
+        return "circuit服务端正忙,请稍后重试";
+    }
+
+
+    //  http://localhost:18091/micrometer/123
+    @GetMapping("/micrometer/{id}")
+    public String micrometer(@PathVariable("id") Integer id) {
+        System.out.println("caller micrometer id: " + id);
+        return myFeignClient.micrometer(id);
+    }
 }

+ 8 - 0
springcloud-demo/eureka-client-caller-demo/src/main/java/com/sf/eurekaclientdemo1/feign/MyFeignClient.java

@@ -67,4 +67,12 @@ public interface MyFeignClient {
     @GetMapping("/token")
     String token(@RequestHeader("token") String token);
 
+    // 断路器相关
+    @GetMapping("/circuit/{id}")
+    String circuit(@PathVariable("id") Integer id);
+
+    // 链路追踪相关
+    @GetMapping("/micrometer/{id}")
+    String micrometer(@PathVariable("id") Integer id);
+
 }

+ 30 - 0
springcloud-demo/eureka-client-caller-demo/src/main/resources/application.yml

@@ -14,3 +14,33 @@ spring:
                 capacity: 1024
                 enabled: false
                 ttl: 10s
+
+# Resilience4j CircuitBreaker 按照次数:COUNT_BASED 的例子
+#  6次访问中当执行方法的失败率达到50%时CircuitBreaker将进入开启OPEN状态(保险丝跳闸断电)拒绝所有请求。
+#  等待5秒后,CircuitBreaker 将自动从开启OPEN状态过渡到半开HALF_OPEN状态,允许一些请求通过以测试服务是否恢复正常。
+#  如还是异常CircuitBreaker 将重新进入开启OPEN状态;如正常将进入关闭CLOSE闭合状态恢复正常处理请求。
+resilience4j:
+    circuitbreaker:
+        configs:
+            default:
+                failureRateThreshold: 50 #设置50%的调用失败时打开断路器,超过失败请求百分⽐CircuitBreaker变为OPEN状态。
+                slidingWindowType: COUNT_BASED # 滑动窗口的类型
+                slidingWindowSize: 6 #滑动窗⼝的⼤⼩配置COUNT_BASED表示6个请求,配置TIME_BASED表示6秒
+                minimumNumberOfCalls: 6 #断路器计算失败率或慢调用率之前所需的最小样本(每个滑动窗口周期)。如果minimumNumberOfCalls为10,则必须最少记录10个样本,然后才能计算失败率。如果只记录了9次调用,即使所有9次调用都失败,断路器也不会开启。
+                automaticTransitionFromOpenToHalfOpenEnabled: true # 是否启用自动从开启状态过渡到半开状态,默认值为true。如果启用,CircuitBreaker将自动从开启状态过渡到半开状态,并允许一些请求通过以测试服务是否恢复正常
+                waitDurationInOpenState: 5s #从OPEN到HALF_OPEN状态需要等待的时间
+                permittedNumberOfCallsInHalfOpenState: 2 #半开状态允许的最大请求数,默认值为10。在半开状态下,CircuitBreaker将允许最多permittedNumberOfCallsInHalfOpenState个请求通过,如果其中有任何一个请求失败,CircuitBreaker将重新进入开启状态。
+                recordExceptions:
+                    - java.lang.Exception
+        instances:
+            # eureka-client-supplier-demo
+            eureka-client-supplier-demo:
+                baseConfig: default
+
+management:
+    zipkin:
+        tracing:
+            endpoint: http://localhost:9411/api/v2/spans
+    tracing:
+        sampling:
+            probability: 1.0 #采样率默认为0.1(0.1就是10次只能有一次被记录下来),值越大收集越及时。

+ 32 - 0
springcloud-demo/eureka-client-supplier-demo/pom.xml

@@ -33,6 +33,38 @@
             <version>1.18.32</version>
         </dependency>
 
+        <!--micrometer-tracing指标追踪  1-->
+        <dependency>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-tracing</artifactId>
+        </dependency>
+        <!--micrometer-tracing-bridge-brave适配zipkin的桥接包 2-->
+        <dependency>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-tracing-bridge-brave</artifactId>
+        </dependency>
+        <!--micrometer-observation 3-->
+        <dependency>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-observation</artifactId>
+        </dependency>
+        <!--feign-micrometer 4-->
+        <dependency>
+            <groupId>io.github.openfeign</groupId>
+            <artifactId>feign-micrometer</artifactId>
+        </dependency>
+        <!--zipkin-reporter-brave 5-->
+        <dependency>
+            <groupId>io.zipkin.reporter2</groupId>
+            <artifactId>zipkin-reporter-brave</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.27</version>
+        </dependency>
+
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>

+ 35 - 0
springcloud-demo/eureka-client-supplier-demo/src/main/java/com/sf/eurekaclientdemo2/controller/CircuitController.java

@@ -0,0 +1,35 @@
+package com.sf.eurekaclientdemo2.controller;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 验证断路器
+ */
+@RestController
+public class CircuitController {
+
+    // http://localhost:18092/circuit/1
+    // http://localhost:18092/circuit/-1
+    // 提供了一个可以控制成功或失败的接口
+    //  同时可以控制接口的处理时间
+    @GetMapping("/circuit/{id}")
+    public String circuit(@PathVariable("id") Integer id) {
+        System.out.println("handler circuit id : " + id);
+        if (id == -1) {
+            throw new RuntimeException("circuit id is -1");
+        }
+
+        if (id > 0) {
+            try {
+                TimeUnit.SECONDS.sleep(id);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        }
+        return "Circuit Success id" + id;
+    }
+}

+ 3 - 0
springcloud-demo/eureka-client-supplier-demo/src/main/java/com/sf/eurekaclientdemo2/controller/HeaderController.java

@@ -4,6 +4,9 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestHeader;
 import org.springframework.web.bind.annotation.RestController;
 
+/**
+ * 验证header
+ */
 @RestController
 public class HeaderController {
 

+ 19 - 0
springcloud-demo/eureka-client-supplier-demo/src/main/java/com/sf/eurekaclientdemo2/controller/MicrometerController.java

@@ -0,0 +1,19 @@
+package com.sf.eurekaclientdemo2.controller;
+
+import cn.hutool.core.util.IdUtil;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class MicrometerController {
+
+    // http://localhost:18092/micrometer/-1
+    // 提供链路追踪使用的接口
+    @GetMapping("/micrometer/{id}")
+    public String micrometer(@PathVariable("id") Integer id) {
+        // 生成唯一id  UUID
+        System.out.println("handler micrometer id: " + id);
+        return "Micrometer Success inId : " + id + "outId : " + IdUtil.simpleUUID();
+    }
+}

+ 8 - 0
springcloud-demo/eureka-client-supplier-demo/src/main/resources/application.yml

@@ -11,3 +11,11 @@ spring:
 #    cloud:
 #        loadbalancer:
 #            configurations: 10
+
+management:
+    zipkin:
+        tracing:
+            endpoint: http://localhost:9411/api/v2/spans
+    tracing:
+        sampling:
+            probability: 1.0 #采样率默认为0.1(0.1就是10次只能有一次被记录下来),值越大收集越及时。

+ 47 - 0
springcloud-demo/pom.xml

@@ -17,8 +17,55 @@
   </modules>
   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <micrometer-tracing.version>1.2.0</micrometer-tracing.version>
+    <micrometer-observation.version>1.12.0</micrometer-observation.version>
+    <feign-micrometer.version>12.5</feign-micrometer.version>
+    <zipkin-reporter-brave.version>2.17.0</zipkin-reporter-brave.version>
   </properties>
 
   <dependencies>
   </dependencies>
+  <!-- 依赖的版本管理 -->
+  <dependencyManagement>
+    <dependencies>
+      <!--micrometer-tracing-bom导入链路追踪版本中心  1-->
+      <dependency>
+        <groupId>io.micrometer</groupId>
+        <artifactId>micrometer-tracing-bom</artifactId>
+        <version>${micrometer-tracing.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+      <!--micrometer-tracing指标追踪  2-->
+      <dependency>
+        <groupId>io.micrometer</groupId>
+        <artifactId>micrometer-tracing</artifactId>
+        <version>${micrometer-tracing.version}</version>
+      </dependency>
+      <!--micrometer-tracing-bridge-brave适配zipkin的桥接包 3-->
+      <dependency>
+        <groupId>io.micrometer</groupId>
+        <artifactId>micrometer-tracing-bridge-brave</artifactId>
+        <version>${micrometer-tracing.version}</version>
+      </dependency>
+      <!--micrometer-observation 4-->
+      <dependency>
+        <groupId>io.micrometer</groupId>
+        <artifactId>micrometer-observation</artifactId>
+        <version>${micrometer-observation.version}</version>
+      </dependency>
+      <!--feign-micrometer 5-->
+      <dependency>
+        <groupId>io.github.openfeign</groupId>
+        <artifactId>feign-micrometer</artifactId>
+        <version>${feign-micrometer.version}</version>
+      </dependency>
+      <!--zipkin-reporter-brave 6-->
+      <dependency>
+        <groupId>io.zipkin.reporter2</groupId>
+        <artifactId>zipkin-reporter-brave</artifactId>
+        <version>${zipkin-reporter-brave.version}</version>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
 </project>