优化基于CID 的用户统计

This commit is contained in:
2025-11-13 11:28:25 +08:00
parent 56771a0de0
commit 3dae5f40b8
13 changed files with 84 additions and 29 deletions

View File

@@ -18,6 +18,18 @@
<spring-boot.version>3.3.5</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>4.1.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
<version>4.1.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>

View File

@@ -0,0 +1,86 @@
package com.sdm.common.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.DefaultResponse;
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.ReactorServiceInstanceLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
@Slf4j
@Component
public class CustomLoadBalancerClient implements ReactorServiceInstanceLoadBalancer {
@Value("${serverType:1}")
private int serverType;
@Value("${serverIp:}")
private String serverIp;
private final AtomicInteger atomicInteger = new AtomicInteger(0);
// 服务列表
private final ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;
public CustomLoadBalancerClient(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider) {
this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider;
}
@Override
public Mono<Response<ServiceInstance>> choose(Request request) {
ServiceInstanceListSupplier supplier = serviceInstanceListSupplierProvider.getIfAvailable();
assert supplier != null;
return supplier.get().next().map(serviceInstances -> getInstanceResponse(serviceInstances, request));
}
/**
* 负载均衡获取服务
*
* @param instances instances
* @return Response<ServiceInstance>
*/
private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances, Request request) {
if (instances.isEmpty()) {
log.error("服务器列表为空");
return new EmptyResponse();
}
ServiceInstance serviceInstance = null;
// 0单机处理1负载均衡轮询
if (serverType == 0) {
for (ServiceInstance instance : instances) {
if (instance.getHost().equals(serverIp)) {
serviceInstance = instance;
break;
}
}
if (serviceInstance != null) {
log.info("转发到指定服务器:" + serviceInstance.getHost());
} else {
log.warn("未找到指定IP的服务器使用列表中的第一个服务器");
serviceInstance = instances.get(0);
}
} else {
// 获取当前的调用编号(每来一次请求则累加1)
int sequence = atomicInteger.getAndIncrement();
// 达到1000清零
if (sequence == 1000) {
atomicInteger.set(0);
}
// 调用编号与服务器个数取余
int index = sequence % instances.size();
log.info("负载均衡到服务器:" + instances.get(index).getHost());
serviceInstance = instances.get(index);
}
return new DefaultResponse(serviceInstance);
}
}

View File

@@ -0,0 +1,9 @@
package com.sdm.common.config;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients;
import org.springframework.context.annotation.Configuration;
@Configuration
@LoadBalancerClients(defaultConfiguration = CustomLoadBalancerClient.class)
public class LoadBalancerConfig {
}

View File

@@ -33,6 +33,6 @@ public interface ISysUserFeignClient {
/**
* 根据用户组id查询用户组及组成员列表详情
*/
@PostMapping("/queryGroupDetail")
@PostMapping("/user/queryGroupDetail")
SdmResponse<SysUserGroupDetailResp> queryGroupDetail(@RequestBody @Validated QueryGroupDetailReq req);
}