網(wǎng)絡推廣銷售怎么做seo文章生成器
LoadBalancer
- 概念
- 常見的負載均衡策略
- 使用隨機選擇的負載均衡策略
- 創(chuàng)建隨機選擇負載均衡器
- 配置
- Nacos 權重負載均衡器
- 創(chuàng)建 Nacos 負載均衡器
- 配置
- 自定義負載均衡器(根據(jù)IP哈希策略選擇)
- 創(chuàng)建自定義負載均衡器
- 封裝自定義負載均衡器
- 配置
- 緩存
概念
LoadBalancer(負載均衡器)是一種網(wǎng)絡設備或軟件機制, 用于分發(fā)傳入的網(wǎng)絡流量負載(請求)到多個后端目標服務器上, 從而實現(xiàn)系統(tǒng)資源的均衡利用和提高系統(tǒng)的可用性和性能
負載均衡分為服務器端負載均衡和客戶端負載均衡
- 服務器端負載均衡是指放在服務器端的負載均衡器(反向代理), 如: Nginx, HAProxy, F5等
- 客戶端負載均衡器是指嵌套在客戶端的負載均衡器(正向代理), 如: Ribbon, Spring Cloud LoadBalancer等
服務器端負載均衡器所有請求都會發(fā)送到服務器端, 就會造成服務器端壓力大的情況
常見的負載均衡策略
- 輪詢(默認): 按照順序將請求發(fā)送到服務器
- 隨機選擇: 隨機選擇一個服務器處理請求
- 最少連接: 選擇連接數(shù)最少的一個服務器
- IP 哈希: 使用客戶端IP地址計算哈希值然后發(fā)送到與之對應的服務器
- 加權輪詢: 按照權重值的比例發(fā)送請求
- 加權隨機選擇: 按照權重值隨機選擇后端服務器
- 最短響應時間: 將請求發(fā)送到響應時間最短的服務器
Spring Cloud LoadBalancer 默認只支持輪詢和隨機選擇, 但是可以自定義負載均衡策略
使用隨機選擇的負載均衡策略
創(chuàng)建隨機選擇負載均衡器
public class MyRandomLoadBalancer {@Beanpublic ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}
配置
注意: 配置局部負載均衡器有可能不起作用, 可以配置全局負載均衡器
Nacos 權重負載均衡器
Nacos 中支持兩種負載均衡器, 一種是權重負載均衡器, 另一種是第三方的CMDB(地域就近訪問)標簽負載均衡器, 我們可以將Spring Cloud LoadBalancer 直接配置為 Nacos 的負載均衡器
創(chuàng)建 Nacos 負載均衡器
@LoadBalancerClients(defaultConfiguration = MyNacosLoadBalancer.class)
public class MyNacosLoadBalancer {@Resourceprivate NacosDiscoveryProperties nacosDiscoveryProperties;@Beanpublic ReactorLoadBalancer<ServiceInstance> nacosLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new NacosLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),name, nacosDiscoveryProperties);}
}
配置
自定義負載均衡器(根據(jù)IP哈希策略選擇)
創(chuàng)建自定義負載均衡器
public class CustomLoadBalancer implements ReactorServiceInstanceLoadBalancer {private static final Log log = LogFactory.getLog(RandomLoadBalancer.class);private final String serviceId;private ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;public CustomLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider, String serviceId) {this.serviceId = serviceId;this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider;}public Mono<Response<ServiceInstance>> choose(Request request) {ServiceInstanceListSupplier supplier = (ServiceInstanceListSupplier)this.serviceInstanceListSupplierProvider.getIfAvailable(NoopServiceInstanceListSupplier::new);return supplier.get(request).next().map((serviceInstances) -> {return this.processInstanceResponse(supplier, serviceInstances);});}private Response<ServiceInstance> processInstanceResponse(ServiceInstanceListSupplier supplier, List<ServiceInstance> serviceInstances) {Response<ServiceInstance> serviceInstanceResponse = this.getInstanceResponse(serviceInstances);if (supplier instanceof SelectedInstanceCallback && serviceInstanceResponse.hasServer()) {((SelectedInstanceCallback)supplier).selectedServiceInstance((ServiceInstance)serviceInstanceResponse.getServer());}return serviceInstanceResponse;}private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances) {if (instances.isEmpty()) {if (log.isWarnEnabled()) {log.warn("No servers available for service: " + this.serviceId);}return new EmptyResponse();} else {ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();String ipAddress = request.getRemoteAddr();System.out.println("ip地址:" + ipAddress);int hash = instances.hashCode();int index = hash % instances.size();ServiceInstance instance = (ServiceInstance) instances.get(index);return new DefaultResponse(instance);}}
}
由于自定義負載均衡器和內置的負載均衡器只是在服務器選擇的時候有所不同, 所以我們可以直接復制 RandomLoadBalancer 然后 在 getInstanceResponse()方法中進行改動即可
封裝自定義負載均衡器
配置
緩存
Spring Cloud LoadBalancer 在獲取實例時有兩種選擇:
- 及時獲取: 每次都從注冊中心獲取到最新的實例, 效果好但是開銷大
- 緩存服務列表: 每次得到服務列表后, 緩存一段時間,
spring Cloud LoadBalancer 默認緩存過期時間為 35s, 保存?zhèn)€數(shù)為 256個
我們也可以通過配置來改變這兩個值
spring:cloud:loadbalancer:cache:ttl: 10capacity: 1000
# enabled: false 關閉緩存
生產(chǎn)環(huán)境下不要關閉緩存否則會降低性能