背景:
当我们使用微服务时,若想在本地联调就需要启动多个服务,为了避免本地启动过多服务,现将注册中心等基础服务共用。当我们在服务A开发时,都是注册到同一个nacos,这样本地和开发环境的服务A就会同时存在,当调用服务时就会使用负载均衡选择服务,导致我们无法正常调试接口。这时我们可以选择使用灰度版本来进行服务的选择。
具体实现步骤如下:
1、我们在本地配置文件中添加版本头
这样我们服务注册到nacos中点击 服务列表 会发现服务中都会带VERSION
spring: cloud: nacos: discovery: metadata: VERSION: zhangsan
2、添加灰度服务接口
public interface GrayLoadBalancer { /** * 根据serviceId 筛选可用服务 * @param serviceId 服务ID * @param request 当前请求 * @return ServiceInstance */ ServiceInstance choose(String serviceId, ServerHttpRequest request); }
3、灰度过滤器
import lombok.extern.slf4j.Slf4j; import org.apache.http.util.Asserts; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.DefaultResponse; import org.springframework.cloud.client.loadbalancer.LoadBalancerUriTools; import org.springframework.cloud.client.loadbalancer.Response; import org.springframework.cloud.gateway.config.LoadBalancerProperties; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.ReactiveLoadBalancerClientFilter; import org.springframework.cloud.gateway.support.DelegatingServiceInstance; import org.springframework.cloud.gateway.support.NotFoundException; import org.springframework.cloud.gateway.support.ServerWebExchangeUtils; import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; import java.net.URI; @Slf4j @Component public class GrayReactiveLoadBalancerClientFilter extends ReactiveLoadBalancerClientFilter { private final static String SCHEME = "lb";