spring cloud 2020.0.1踩坑記錄-bootstrap不生效等


使用版本:

     <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-bootstrap starter.The property is spring.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 是我自己定義的,你也可以仿着其它實現自己定義:

 

 

(待補充)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM