使用版本:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.2</version> <relativePath /> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> <spring-cloud-release.version>2020.0.1</spring-cloud-release.version> <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version> </properties>
1、bootstrap.yml默認不生效
官方文檔有提到(原文傳送門):
To use the legacy bootstrap way of connecting to Config Server,bootstrap must be enabled via a property or the
spring-cloud-starter-bootstrapstarter.The property isspring.cloud.bootstrap.enabled=true. It must be set as a System Property or environment variable.
翻譯:想用bootstrap,需要將spring.cloud.bootstrap.enabled設為true(注意這個必須設為系統變量或者環境變量)或 引入一個依賴:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency>
該依賴會引入一個名為 org.springframework.cloud.bootstrap.marker.Marker 的類 ,進而導致以下判斷為假:


進而執行后邊的bootstrap文件內容加載邏輯。
2、Spring Cloud Gateway + Nacos 無法發現服務
Gateway已經注冊到了nacos,就算訪問自己都訪問不到,報503 Service Unavailable
原來是一位內Spring Cloud的負載均衡需要單獨引入
解決方法,引入以下依賴:
<!--不加這個沒法路由,被坑慘--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
3、如何修改LoadBalancer
想自己寫個負載均衡策略,一開始簡單看了一下源碼(RoundRobinLoadBalancer、LoadBalancerClientConfiguration),復制修改了一下,行不通,name獲取到的始終是null
@Configuration
public class MetaRouteRoundRobinLoadBalancerConfiguration { @Bean public ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) { String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); return new MetaRouteRoundRobinLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name); } }
后來研究了一下,發現在訪問的時候name獲取的才不是空,而這個時候 LoadBalancerClientConfiguration中的LoadBalancer才被創建。
看了一下整體的加載過程 、 別人的提問,再加上官網要求我們不要使用@Configuration ,而是使用@LoadBalancerClient
但是@LoadBalancerClient並不夠用,需要一個服務一個服務的設置其路由策略,而我想要的是全局默認策略
最后在源碼的同一個包下找到了LoadBalancerClients,在里面的注釋上找到關鍵線索

自定義路由解決方案
步驟1、去掉上邊的@Configuration
public class MetaRouteRoundRobinLoadBalancerConfiguration { @Bean public ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) { String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); return new MetaRouteRoundRobinLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name); } }
步驟2:在入口類上加上注解:
@LoadBalancerClients(defaultConfiguration = {MetaRouteRoundRobinLoadBalancerConfiguration.class})
注意,這里的 MetaRouteRoundRobinLoadBalancer 是我自己定義的,你也可以仿着其它實現自己定義:

(待補充)
