欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > SpringCloud 2023 LoadBalancer介绍、使用、获取服务列表原理、负载均衡算法

SpringCloud 2023 LoadBalancer介绍、使用、获取服务列表原理、负载均衡算法

2024/10/25 15:25:33 来源:https://blog.csdn.net/yy8623977/article/details/140892683  浏览:    关键词:SpringCloud 2023 LoadBalancer介绍、使用、获取服务列表原理、负载均衡算法

目录

  • 1. 介绍
  • 2. 使用
  • 3 获取服务列表原理
  • 4. 负载均衡算法

1. 介绍

功能:

  1. 提供客户端的负载均衡算法,将请求均摊到多个服务器上。
  2. 属于客户端负载均衡(Nginx属于服务端负载均衡),会将服务列表缓存到JVM本地,然后客户端自己选择请求服务器
  3. 支持Spring Web Flux的WebClient

2. 使用

基本使用可以参考Nacos之SpringCloud集成Nacos注册中心

3 获取服务列表原理

底层是通过DiscoveryClient动态获取所有上线的服务列表。伪代码如下:


@RestController
public class OrderController {@Autowiredprivate DiscoveryClient discoveryClient;@GetMapping("/nacos/getNacosAllServiceInfo")public String getNacosAllServiceInfo() {List<String> serviceNames = discoveryClient.getServices();Map<String, Object> serviceMap = new HashMap<>();for (String serviceName : serviceNames) {List<ServiceInstance> serviceInstances = discoveryClient.getInstances(serviceName);List<Map<String,String>> serviceInstanceInfos = new ArrayList<>();for(ServiceInstance serviceInstance: serviceInstances) {Map<String, String> serviceInstanceMap = new HashMap<>();serviceInstanceMap.put("serviceId", serviceInstance.getServiceId());serviceInstanceMap.put("instanceId", serviceInstance.getInstanceId());serviceInstanceMap.put("host", serviceInstance.getHost());serviceInstanceMap.put("port", String.valueOf(serviceInstance.getPort()));serviceInstanceMap.put("uri", serviceInstance.getUri().toString());serviceInstanceInfos.add(serviceInstanceMap);}serviceMap.put(serviceName, serviceInstanceInfos);}return serviceMap.toString();}}

访问http://localhost:8002/nacos/getNacosAllServiceInfo,返回的数据如下:

{orderment=[{instanceId=192.168.163.1#8002#DEFAULT#DEFAULT_GROUP@@orderment, port=8002, host=192.168.163.1, serviceId=orderment, uri=http://192.168.163.1:8002}], payment=[{instanceId=192.168.163.1#8001#DEFAULT#DEFAULT_GROUP@@payment, port=8001, host=192.168.163.1, serviceId=payment, uri=http://192.168.163.1:8001}]}

4. 负载均衡算法

  • 默认的轮询算法RoundRobinLoadBalancer: rest接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标,每次服务重启动后rest接口计数从1开始
  • 同时提供了随机算法RandomLoadBalancer的实现。切换代码如下。说明:
    • 实现了LoadBalancerConfig,会使默认的RoundRobinLoadBalancer失效
    • 要向哪个服务发送请求,就要在@LoadBalancerClient@LoadBalancerClients中定义
//@LoadBalancerClient(value = "payment1", configuration = LoadBalancerConfig.class)
@LoadBalancerClients({@LoadBalancerClient(value = "payment1", configuration = LoadBalancerConfig.class),@LoadBalancerClient(value = "payment2", configuration = LoadBalancerConfig.class),
})
public class LoadBalancerConfig {@BeanReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),name);}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com