SpringCloud-03 LoadBalancer服务调用与负载均衡
LoadBalancer(负载均衡器)是一种网络设备或软件,用于将网络流量分配到多个服务器,以实现负载均衡和高可用性。它可以帮助确保网络服务器能够有效地处理大量的请求,并避免某些服务器过载而导致性能下降或服务不可用。
Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求,即负载均衡是由服务端实现的。
loadbalancer本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。
LoadBalancer 在工作时分成两步:
第一步,先选择ConsulServer从服务端查询并拉取服务列表,知道了它有多个服务(上图3个服务),这3个实现是完全一样的,
默认轮询调用谁都可以正常执行。
第二步,按照指定的负载均衡策略从server取到的服务注册列表中由客户端自己选择一个地址,所以LoadBalancer是一个客户端的负载均衡器。
//在800端口拷贝与8001端口一样的服务
Consul数据持久化配置
//在consul同级目录下新建consul_startt.bat文件,内容如下
@echo.服务启动......
@echo off
@sc create Consul binpath= "D:\devSoft\consul_1.17.0_windows_386\consul.exe agent -server -ui -bind=127.0.0.1 -client=0.0.0.0 -bootstrap-expect 1 -data-dir D:\devSoft\consul_1.17.0_windows_386\mydata "
@net start Consul
@sc config Consul start= AUTO
@echo.Consul start is OK......success
@pause
**注意:**consul里data配置的缩进不要用tab键,要用空格
修改80端口(调用端口)
//在80端口服务pom文件中添加依赖
<!--loadbalancer-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>//修改controller@GetMapping("/consumer/pay/get/info")public String getByConsul() {return restTemplate.getForObject(paymentSrv_URL+"/pay/get/info", String.class);}
会自动交替调用8001端口和8002端口
通过DiscoveryClient动态获取服务列表
@Resourceprivate DiscoveryClient discoveryClient;@GetMapping("/consumer/discovery")public String discovery(){List<String> services = discoveryClient.getServices();for (String element : services) {System.out.println(element);}System.out.println("===================================");List<ServiceInstance> instances = discoveryClient.getInstances("cloud-payment-service");for (ServiceInstance element : instances) {System.out.println(element.getServiceId()+"\t"+element.getHost()+"\t"+element.getPort()+"\t"+element.getUri());}return instances.get(0).getServiceId()+":"+instances.get(0).getPort();}
负载均衡有两种算法:轮询算法 和 随机算法 一般用轮询