From 34981c30a78e8bbd7791131059a9210f9928b62c Mon Sep 17 00:00:00 2001
From: 刘光辉 <347230014@qq.com>
Date: 星期四, 17 九月 2026 09:24:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into master

---
 jnpf-gateway/src/main/java/jnpf/handler/MyLoadBalancer.java |   82 +++++++++++++++++++++++++++++++++++++++++
 1 files changed, 82 insertions(+), 0 deletions(-)

diff --git a/jnpf-gateway/src/main/java/jnpf/handler/MyLoadBalancer.java b/jnpf-gateway/src/main/java/jnpf/handler/MyLoadBalancer.java
new file mode 100644
index 0000000..fa76b91
--- /dev/null
+++ b/jnpf-gateway/src/main/java/jnpf/handler/MyLoadBalancer.java
@@ -0,0 +1,82 @@
+package jnpf.handler;
+
+import cn.dev33.satoken.context.SaHolder;
+import cn.dev33.satoken.context.model.SaRequest;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.cloud.client.ServiceInstance;
+import org.springframework.cloud.client.loadbalancer.EmptyResponse;
+import org.springframework.cloud.client.loadbalancer.Request;
+import org.springframework.cloud.client.loadbalancer.Response;
+import org.springframework.cloud.loadbalancer.core.NoopServiceInstanceListSupplier;
+import org.springframework.cloud.loadbalancer.core.RoundRobinLoadBalancer;
+import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
+import reactor.core.publisher.Mono;
+
+import java.util.List;
+
+/**
+ * 璐熻浇鍧囪 澶勭悊鍣�
+ *
+ * @author JNPF寮�鍙戝钩鍙扮粍
+ * @version V3.5.0
+ * @copyright 寮曡繄淇℃伅鎶�鏈湁闄愬叕鍙革紙https://www.jnpfsoft.com锛�
+ * @date 2024-01-10
+ */
+@Slf4j
+public class MyLoadBalancer extends RoundRobinLoadBalancer {
+
+    private final String serviceId2;
+    private ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;
+    private List<ILoadBalancerHandler> loadBalancers;
+
+
+    public MyLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider, String serviceId, List<ILoadBalancerHandler> loadBalancers) {
+        super(serviceInstanceListSupplierProvider, serviceId);
+        this.serviceId2 = serviceId;
+        this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider;
+        this.loadBalancers = loadBalancers;
+    }
+
+    public MyLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider, String serviceId, int seedPosition, List<ILoadBalancerHandler> loadBalancers) {
+        super(serviceInstanceListSupplierProvider, serviceId, seedPosition);
+        this.serviceId2 = serviceId;
+        this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider;
+        this.loadBalancers = loadBalancers;
+    }
+
+    @Override
+    public Mono<Response<ServiceInstance>> choose(Request request) {
+        String uri = SaHolder.getRequest().getRequestPath();
+        boolean hasSupport = loadBalancers.stream().anyMatch(l->l.isSupport(serviceId2, uri));
+        if(hasSupport) {
+            SaRequest request1 = SaHolder.getRequest();
+            ServiceInstanceListSupplier supplier = serviceInstanceListSupplierProvider
+                    .getIfAvailable(NoopServiceInstanceListSupplier::new);
+            return supplier.get(request).next()
+                    .map(serviceInstances -> processInstanceResponse(supplier, serviceInstances, request1));
+        }
+        return super.choose(request);
+    }
+
+    private Response<ServiceInstance> processInstanceResponse(ServiceInstanceListSupplier supplier,
+                                                              List<ServiceInstance> serviceInstances, SaRequest request) {
+        if (serviceInstances.isEmpty()) {
+            if (log.isWarnEnabled()) {
+                log.warn("No servers available for service: " + serviceId2);
+            }
+            return new EmptyResponse();
+        }
+        Response<ServiceInstance> response = null;
+        for (ILoadBalancerHandler loadBalancer : loadBalancers) {
+            response = loadBalancer.choose(serviceId2, serviceInstances, request);
+            if(response == null){
+                break;
+            }
+        }
+        return response == null ? new EmptyResponse() : response;
+    }
+
+
+
+}

--
Gitblit v1.8.0