1.概述
我们在使用微服务时,比如我们后端部署了很多台微服务实例,比如订单 10台,库存1O台,其中每两台服务有一个客户,就是一个客户只可以使用其中的两台微服务实例,因此我们需要在网关进行路由选择,选择我们可以访问的微服务实例。
2.实现原理
- 在前端传入分组标识,比如使用域名,或其他的分组,数据到请求头
- 使用自定义扩展的负载均衡选择器,根据前端传入的请求进行选择。
- 选择一个具体的微服务实例进行访问。
3.实现代码
3.1 给每台微服务实例增加元数据
spring:
application:
name: order-service
profiles:
active: dev
cloud:
loadbalancer:
enabled: true
nacos:
username: nacos
password: nacos
discovery:
server-addr: localhost:8848
namespace: local
metadata:
group: ${group:A}
这里增加一个 group 分组的实例数据,这里我们可以在启动的时候指定这个分组数据。

3.2 微服务负载均衡配置
public class GatewayLoadBalancerConfiguration {
//@Bean
//public IServiceChooser groupServiceChooser() {
// return new GroupServiceChooser();
//}
@Bean
@ConditionalOnMissingBean
public IServiceChooser defaultServiceChooser() {
return new AllServiceChooser();
}
@Bean
public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(
Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory,IServiceChooser serviceChooser) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new GatewayLoadBalancer(
loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),
name, serviceChooser);
}
}
GatewayLoadBalancer 这个时一个负载均衡的处理器,他负责微服务实例的选择。
3.3 微服务实例选择接口
上面的负载均衡处理器,需要调用实例的选择接口进行微服务实例的选择。
public interface IServiceChooser {
/**
* 选择服务实例.
*
* @param instances 服务实例列表
* @param requestData 请求数据
* @param serviceId 服务ID
* @return 服务实例列表
*/
List<ServiceInstance> getServiceInstances(List<ServiceInstance> instances,
RequestData requestData, String serviceId);
}
在默认情况下,我们使用全部的微服务实例,当我们需要启用分组选择器时,可以启用组选择,当然用户可以开发自己的选择器。
3.4 启用负载均衡器
我们在网关应用增加负载均衡器,这样当我们通过网关访问后端的时候,我们就启用了我们自定义的负载均衡器。
@LoadBalancerClients( defaultConfiguration = GatewayLoadBalancerConfiguration.class)
public class PaasGatewayServer {
浙公网安备 33010602011771号