bizKey 路由
This commit is contained in:
@@ -2,10 +2,13 @@ package com.flagnote.gateway;
|
|||||||
|
|
||||||
import org.springframework.boot.SpringApplication;
|
import org.springframework.boot.SpringApplication;
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
|
||||||
|
|
||||||
|
import com.flagnote.gateway.config.BkrLoadBalancerConfiguration;
|
||||||
|
|
||||||
@SpringBootApplication
|
@SpringBootApplication
|
||||||
|
@LoadBalancerClient(name = "noteCommonService", configuration = BkrLoadBalancerConfiguration.class)
|
||||||
public class GatewayApplication {
|
public class GatewayApplication {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
SpringApplication.run(GatewayApplication.class, args);
|
SpringApplication.run(GatewayApplication.class, args);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,91 @@
|
|||||||
|
package com.flagnote.gateway.config;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.springframework.beans.factory.ObjectProvider;
|
||||||
|
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.RequestData;
|
||||||
|
import org.springframework.cloud.client.loadbalancer.RequestDataContext;
|
||||||
|
import org.springframework.cloud.client.loadbalancer.Response;
|
||||||
|
import org.springframework.cloud.loadbalancer.core.NoopServiceInstanceListSupplier;
|
||||||
|
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
|
||||||
|
import org.springframework.cloud.loadbalancer.core.ReactorServiceInstanceLoadBalancer;
|
||||||
|
import org.springframework.cloud.loadbalancer.core.SelectedInstanceCallback;
|
||||||
|
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
|
||||||
|
|
||||||
|
import com.flagnote.gateway.utils.BizKeyUtils;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import reactor.core.publisher.Mono;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public class BizKeyLoadBalancerClient implements ReactorServiceInstanceLoadBalancer {
|
||||||
|
|
||||||
|
private final String serviceId;
|
||||||
|
|
||||||
|
private ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;
|
||||||
|
|
||||||
|
public BizKeyLoadBalancerClient(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider,
|
||||||
|
String serviceId) {
|
||||||
|
this.serviceId = serviceId;
|
||||||
|
this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
|
@Override
|
||||||
|
public Mono<Response<ServiceInstance>> choose(Request request) {
|
||||||
|
ServiceInstanceListSupplier supplier = serviceInstanceListSupplierProvider
|
||||||
|
.getIfAvailable(NoopServiceInstanceListSupplier::new);
|
||||||
|
return supplier.get(request).next()
|
||||||
|
.map(serviceInstances -> processInstanceResponse(request, supplier, serviceInstances));
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
|
private Response<ServiceInstance> processInstanceResponse(Request request, ServiceInstanceListSupplier supplier,
|
||||||
|
List<ServiceInstance> serviceInstances) {
|
||||||
|
Response<ServiceInstance> serviceInstanceResponse = getInstanceResponse(request, serviceInstances);
|
||||||
|
if (supplier instanceof SelectedInstanceCallback && serviceInstanceResponse.hasServer()) {
|
||||||
|
((SelectedInstanceCallback) supplier).selectedServiceInstance(serviceInstanceResponse.getServer());
|
||||||
|
}
|
||||||
|
return serviceInstanceResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
|
private Response<ServiceInstance> getInstanceResponse(Request request, List<ServiceInstance> instances) {
|
||||||
|
if (instances.isEmpty()) {
|
||||||
|
if (log.isWarnEnabled()) {
|
||||||
|
log.warn("No servers available for service: " + serviceId);
|
||||||
|
}
|
||||||
|
return new EmptyResponse();
|
||||||
|
}
|
||||||
|
|
||||||
|
RequestDataContext rdContext = (RequestDataContext)request.getContext();
|
||||||
|
RequestData rdata = rdContext.getClientRequest();
|
||||||
|
String path = rdata.getUrl().getPath();
|
||||||
|
|
||||||
|
String pattern = "^/note/([abcdefhikmnopqstuvwxyz23456789]{16})(\\.txt|/noteMeta|/delete)?$";
|
||||||
|
Pattern pt = Pattern.compile(pattern);
|
||||||
|
Matcher m = pt.matcher(path);
|
||||||
|
|
||||||
|
//默认随机
|
||||||
|
int index = ThreadLocalRandom.current().nextInt(instances.size());
|
||||||
|
|
||||||
|
//如果有key,则为key分配指定服务。
|
||||||
|
if(m.find()) {
|
||||||
|
String mixKey = BizKeyUtils.mixKey(m.group(1));
|
||||||
|
index = Math.abs(mixKey.hashCode())%instances.size();
|
||||||
|
}
|
||||||
|
ServiceInstance instance = instances.get(index);
|
||||||
|
log.info("path:{},service:{}",path,instance.getUri().toString());
|
||||||
|
return new DefaultResponse(instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package com.flagnote.gateway.config;
|
||||||
|
|
||||||
|
import org.springframework.cloud.client.ServiceInstance;
|
||||||
|
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
|
||||||
|
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
|
||||||
|
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.core.env.Environment;
|
||||||
|
|
||||||
|
//@Configuration 必须注释掉
|
||||||
|
public class BkrLoadBalancerConfiguration {
|
||||||
|
@Bean
|
||||||
|
public ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {
|
||||||
|
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
|
||||||
|
return new BizKeyLoadBalancerClient(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -32,14 +32,19 @@ spring:
|
|||||||
client:
|
client:
|
||||||
simple:
|
simple:
|
||||||
instances:
|
instances:
|
||||||
noteService: # 一定要带端口
|
noteCommonService: # 一定要带端口
|
||||||
- uri: http://127.0.0.1:20000
|
- uri: http://127.0.0.1:20000
|
||||||
# - uri: http://94.103.5.10:20001
|
- uri: http://127.0.0.1:20001
|
||||||
|
keyMetaService: # 一定要带端口
|
||||||
|
- uri: http://127.0.0.1:20000
|
||||||
|
- uri: http://127.0.0.1:20001
|
||||||
|
|
||||||
loadbalancer:
|
loadbalancer:
|
||||||
configurations: health-check
|
configurations: health-check
|
||||||
health-check:
|
health-check:
|
||||||
path:
|
path:
|
||||||
noteService: /f2w8u47ie56edc93/actuator/health
|
noteCommonService: /f2w8u47ie56edc93/actuator/health
|
||||||
|
keyMetaService: /f2w8u47ie56edc93/actuator/health
|
||||||
initial-delay: 0
|
initial-delay: 0
|
||||||
interval: 5s
|
interval: 5s
|
||||||
inetutils:
|
inetutils:
|
||||||
@@ -53,7 +58,7 @@ spring:
|
|||||||
# allowedMethods: "*"
|
# allowedMethods: "*"
|
||||||
routes:
|
routes:
|
||||||
- id: keyMeta
|
- id: keyMeta
|
||||||
uri: lb://noteService
|
uri: lb://keyMetaService
|
||||||
order: -1
|
order: -1
|
||||||
predicates:
|
predicates:
|
||||||
- Path=/note/keyMeta
|
- Path=/note/keyMeta
|
||||||
@@ -91,7 +96,7 @@ spring:
|
|||||||
|
|
||||||
|
|
||||||
- id: noteMeta
|
- id: noteMeta
|
||||||
uri: lb://noteService
|
uri: lb://noteCommonService
|
||||||
order: -1
|
order: -1
|
||||||
predicates:
|
predicates:
|
||||||
- Path=/note/{key:[abcdefhikmnopqstuvwxyz23456789]{16}}/noteMeta
|
- Path=/note/{key:[abcdefhikmnopqstuvwxyz23456789]{16}}/noteMeta
|
||||||
@@ -99,7 +104,7 @@ spring:
|
|||||||
filters:
|
filters:
|
||||||
- ValidateNoteKey
|
- ValidateNoteKey
|
||||||
- id: getNote
|
- id: getNote
|
||||||
uri: lb://noteService
|
uri: lb://noteCommonService
|
||||||
order: -1
|
order: -1
|
||||||
predicates:
|
predicates:
|
||||||
- Path=/note/{key:[abcdefhikmnopqstuvwxyz23456789]{16}}
|
- Path=/note/{key:[abcdefhikmnopqstuvwxyz23456789]{16}}
|
||||||
@@ -107,7 +112,7 @@ spring:
|
|||||||
filters:
|
filters:
|
||||||
- ValidateNoteKey
|
- ValidateNoteKey
|
||||||
- id: saveNote
|
- id: saveNote
|
||||||
uri: lb://noteService
|
uri: lb://noteCommonService
|
||||||
order: -1
|
order: -1
|
||||||
predicates:
|
predicates:
|
||||||
- Path=/note/{key:[abcdefhikmnopqstuvwxyz23456789]{16}}
|
- Path=/note/{key:[abcdefhikmnopqstuvwxyz23456789]{16}}
|
||||||
@@ -115,7 +120,7 @@ spring:
|
|||||||
filters:
|
filters:
|
||||||
- ValidateNoteKey
|
- ValidateNoteKey
|
||||||
- id: deleteNote
|
- id: deleteNote
|
||||||
uri: lb://noteService
|
uri: lb://noteCommonService
|
||||||
order: -1
|
order: -1
|
||||||
predicates:
|
predicates:
|
||||||
- Path=/note/{key:[abcdefhikmnopqstuvwxyz23456789]{16}}/delete
|
- Path=/note/{key:[abcdefhikmnopqstuvwxyz23456789]{16}}/delete
|
||||||
@@ -123,7 +128,7 @@ spring:
|
|||||||
filters:
|
filters:
|
||||||
- ValidateNoteKey
|
- ValidateNoteKey
|
||||||
- id: secretKey
|
- id: secretKey
|
||||||
uri: lb://noteService
|
uri: lb://noteCommonService
|
||||||
order: -1
|
order: -1
|
||||||
predicates:
|
predicates:
|
||||||
- Path=/note/{key:[abcdefhikmnopqstuvwxyz23456789]{16}}/secretKey
|
- Path=/note/{key:[abcdefhikmnopqstuvwxyz23456789]{16}}/secretKey
|
||||||
@@ -131,7 +136,7 @@ spring:
|
|||||||
filters:
|
filters:
|
||||||
- ValidateNoteKey
|
- ValidateNoteKey
|
||||||
- id: getNoteTxt
|
- id: getNoteTxt
|
||||||
uri: lb://noteService
|
uri: lb://noteCommonService
|
||||||
order: -1
|
order: -1
|
||||||
predicates:
|
predicates:
|
||||||
- Path=/note/{key:[abcdefhikmnopqstuvwxyz23456789]{16}}.txt
|
- Path=/note/{key:[abcdefhikmnopqstuvwxyz23456789]{16}}.txt
|
||||||
@@ -160,6 +165,6 @@ management:
|
|||||||
|
|
||||||
logging:
|
logging:
|
||||||
level:
|
level:
|
||||||
org.springframework.cloud.gateway: trace
|
org.springframework.cloud.gateway: info
|
||||||
org.springframework.cloud.loadbalancer: trace
|
org.springframework.cloud.loadbalancer: info
|
||||||
org.springframework.web.reactive: trace
|
org.springframework.web.reactive: info
|
||||||
Reference in New Issue
Block a user