1.概述

我们在使用微服务时,比如我们后端部署了很多台微服务实例,比如订单 10台,库存1O台,其中每两台服务有一个客户,就是一个客户只可以使用其中的两台微服务实例,因此我们需要在网关进行路由选择,选择我们可以访问的微服务实例。

2.实现原理

  1. 在前端传入分组标识,比如使用域名,或其他的分组,数据到请求头
  2. 使用自定义扩展的负载均衡选择器,根据前端传入的请求进行选择。
  3. 选择一个具体的微服务实例进行访问。

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 分组的实例数据,这里我们可以在启动的时候指定这个分组数据。
image

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 {
posted on 2025-09-23 14:32  自由港  阅读(7)  评论(0)    收藏  举报