优化基于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

@@ -1,7 +1,7 @@
package com.sdm.gateway2;
import com.sdm.gateway2.route.CustomLoadBalancerClient;
import com.sdm.common.config.CustomLoadBalancerClient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

View File

@@ -1,85 +0,0 @@
package com.sdm.gateway2.route;
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}")
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();
}
// log.info("request url:{}" + url);
// return new DefaultResponse(instances.get(0));
ServiceInstance serviceInstance = null;
// 0单机处理1负载均衡轮询
if (serverType == 0) {
// DefaultRequestContext requestContext = (DefaultRequestContext) request.getContext();
// RequestData clientRequest = (RequestData) requestContext.getClientRequest();
// String url = clientRequest.getUrl().toString();
for (ServiceInstance instance : instances) {
if (instance.getHost().equals(serverIp)) {
serviceInstance = instance;
break;
}
}
//serviceInstance = instances.get(0);
log.info("转发到服务器:" + serviceInstance.getHost());
} 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

@@ -104,7 +104,7 @@ logging:
org.springframework.cloud.gateway: INFO
reactor.netty: INFO
# 0单机处理1负载均衡轮询
# 0单机处理可以指向本地,1负载均衡轮询
serverType: 0
#serverIp: 192.168.65.161
serverIp: 192.168.65.73