优化基于CID 的用户统计
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
}
|
||||
@@ -33,6 +33,6 @@ public interface ISysUserFeignClient {
|
||||
/**
|
||||
* 根据用户组id查询用户组及组成员列表详情
|
||||
*/
|
||||
@PostMapping("/queryGroupDetail")
|
||||
@PostMapping("/user/queryGroupDetail")
|
||||
SdmResponse<SysUserGroupDetailResp> queryGroupDetail(@RequestBody @Validated QueryGroupDetailReq req);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user