• java
  • go
  • 数据库
  • linux
  • 中间件
  • 书
  • 源码
  • 夕拾

  • java
  • go
  • 数据库
  • linux
  • 中间件
  • 书
  • 源码
  • 夕拾

loadbalancer

目录

  • 目录
  • loadbalancer
    • BlockingLoadBalancerClient
    • RoundRobinLoadBalancer
  • 从eureka拉取信息
    • BlockingSupportConfiguration

loadbalancer

u1s1,感觉代码质量不咋样….主要内容,负载均衡策略,从eureka中拉取信息等
然后,如果想弃用ribbon,需要增加spring.cloud.loadbalancer.ribbon.enabled=false.
大体流程,BlockingLoadBalancerClient(新版本用了webflux,然后mono获取的时候block了.貌似这个原因所以叫blockingLoadBalancer??).在内部通过loadBalancerClientFactory去选择不同的服务的负载均衡配置.实际只有RoudRobin轮询的实现…..

BlockingLoadBalancerClient

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Override
public ServiceInstance choose(String serviceId) {
ReactiveLoadBalancer<ServiceInstance> loadBalancer = loadBalancerClientFactory
.getInstance(serviceId);
if (loadBalancer == null) {
return null;
}
Response<ServiceInstance> loadBalancerResponse = Mono.from(loadBalancer.choose())
.block();
if (loadBalancerResponse == null) {
return null;
}
return loadBalancerResponse.getServer();
}

RoundRobinLoadBalancer

eeeeee.这个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class RoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalancer {
// 创建的时候随机
private final AtomicInteger position;

@SuppressWarnings("rawtypes")
@Override
// see original
// https://github.com/Netflix/ocelli/blob/master/ocelli-core/
// src/main/java/netflix/ocelli/loadbalancer/RoundRobinLoadBalancer.java
public Mono<Response<ServiceInstance>> choose(Request request) {
// TODO: move supplier to Request?
// Temporary conditional logic till deprecated members are removed.
if (serviceInstanceListSupplierProvider != null) {
ServiceInstanceListSupplier supplier = serviceInstanceListSupplierProvider
.getIfAvailable(NoopServiceInstanceListSupplier::new);
return supplier.get().next().map(this::getInstanceResponse);
}
ServiceInstanceSupplier supplier = this.serviceInstanceSupplier
.getIfAvailable(NoopServiceInstanceSupplier::new);
return supplier.get().collectList().map(this::getInstanceResponse);
}

// 哎,每次请求会将position+1,然后取余去获取instance.
private Response<ServiceInstance> getInstanceResponse(
List<ServiceInstance> instances) {
if (instances.isEmpty()) {
log.warn("No servers available for service: " + this.serviceId);
return new EmptyResponse();
}
// TODO: enforce order?
int pos = Math.abs(this.position.incrementAndGet());

ServiceInstance instance = instances.get(pos % instances.size());

return new DefaultResponse(instance);
}
}

从eureka拉取信息

通过discoveryClient去从eureka拉取信息….

BlockingSupportConfiguration

1
2
3
4
5
6
7
8
9
10
@Bean
@ConditionalOnBean(DiscoveryClient.class)
@ConditionalOnMissingBean
@ConditionalOnProperty(value = "spring.cloud.loadbalancer.configurations",
havingValue = "default", matchIfMissing = true)
public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(
ConfigurableApplicationContext context) {
return ServiceInstanceListSupplier.builder().withBlockingDiscoveryClient()
.withCaching().build(context);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public ServiceInstanceListSupplierBuilder withBlockingDiscoveryClient() {
if (baseCreator != null && LOG.isWarnEnabled()) {
LOG.warn(
"Overriding a previously set baseCreator with a blocking DiscoveryClient baseCreator.");
}
this.baseCreator = context -> {
DiscoveryClient discoveryClient = context.getBean(DiscoveryClient.class);

return new DiscoveryClientServiceInstanceListSupplier(discoveryClient,
context.getEnvironment());
};
return this;
}

集合框架
open-feign
  1. 1. 目录
  2. 2. loadbalancer
    1. 2.1. BlockingLoadBalancerClient
    2. 2.2. RoundRobinLoadBalancer
  3. 3. 从eureka拉取信息
    1. 3.1. BlockingSupportConfiguration
© 2023 haoxp
Hexo theme