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