負載均衡概述
負載均衡是微服務架構中的核心組件,用于將請求合理分配到多個服務實例上,提高系統的可用性和性能。
負載均衡的分類
負載均衡大致可以分為兩類
1. 服務端負載均衡
- 實現位置:獨立部署的負載均衡服務器(位于客戶端和服務端之間)
- 工作原理:客戶端請求先到達負載均衡器,由負載均衡器選擇具體的服務實例
- 代表產品:Nginx、HAProxy、F5、阿里云SLB
- 優點:集中管理、配置簡單
- 缺點:增加網絡延遲、單點故障風險
2. 客戶端負載均衡
- 實現位置:集成在客戶端應用程序內部
- 工作原理:客戶端維護服務提供者列表,根據算法選擇服務實例
- 代表產品:Ribbon、Spring Cloud LoadBalancer
- 優點:無單點故障、減少網絡跳轉
- 缺點:客戶端復雜度增加
Spring Cloud中的負載均衡實現
1. Feign + Ribbon(Spring Cloud 2020之前)
// 依賴配置
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>// 主啟動類
@SpringBootApplication
@EnableFeignClients
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}
}// Feign客戶端定義
@FeignClient(name = "payment-service")
public interface PaymentService {@GetMapping("/payment/get/{id}")String getPaymentById(@PathVariable("id") Long id);
}
工作原理:
- Feign接收到對服務名(“payment-service”)的調用請求
- Ribbon的LoadBalancerFeignClient通過攔截器機制自動攔截HTTP請求,識別服務名
- Ribbon從服務注冊中心獲取該服務(“payment-service”)的可用實例列表
- 使用默認的輪詢算法或配置的其他算法選擇目標實例
- 將HTTP請求路由到選中的服務實例并返回結果
2. Feign + Spring Cloud LoadBalancer(Spring Cloud 2020之后)
// 依賴配置
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>// 主啟動類
@SpringBootApplication
@EnableFeignClients
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}
}// Feign客戶端定義
@FeignClient(name = "payment-service")
public interface PaymentService {@GetMapping("/payment/get/{id}")String getPaymentById(@PathVariable("id") Long id);
}
工作原理:
- Feign接收到對服務名(“payment-service”)的調用請求
- Spring Cloud LoadBalancer的LoadBalancerInterceptor通過攔截器機制自動攔截HTTP請求,提取服務名
- Spring Cloud LoadBalancer從服務注冊中心獲取該服務(“payment-service”)的可用實例列表
- 使用輪詢算法或配置的其他算法選擇目標實例
- 將HTTP請求路由到選中的服務實例并返回結果
3. Feign + 自定義負載均衡策略
// 依賴配置
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>// 主啟動類
@SpringBootApplication
@EnableFeignClients
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}
}// 自定義負載均衡配置
@Configuration
public class CustomLoadBalancerConfig {@Beanpublic ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory clientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(clientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}// Feign客戶端定義
@FeignClient(name = "payment-service", configuration = CustomLoadBalancerConfig.class)
public interface PaymentService {@GetMapping("/payment/get/{id}")String getPaymentById(@PathVariable("id") Long id);
}
工作原理:
- Feign接收到對服務名(“payment-service”)的調用請求
- Spring Cloud LoadBalancer的LoadBalancerInterceptor通過攔截器機制自動攔截HTTP請求,并提取服務名
- 自定義LoadBalancer從服務注冊中心獲取該服務(“payment-service”)的可用實例列表
- 使用自定義負載均衡策略選擇目標實例
- 將HTTP請求路由到選中的服務實例并返回結果