• 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 是我自己定义的,你也可以仿着其它实现自己定义:

    (待补充)




    --------------------------------------------------------
    本文发表于:https://www.cnblogs.com/flying607/
  • 相关阅读:
    建议初创团队起初也要构建分布式应用
    PHP对大文件的处理思路
    php高级研发或架构师必了解---面试题系列
    数据库schema设计与优化
    大型web系统数据缓存设计
    PHP正则表达式
    PHP 生成图片缩略图函数
    PHP与Memcached服务器交互的分布式实现源码分析
    SOA面向服务架构——SOA的概念
    php中socket的使用
  • 原文地址:https://www.cnblogs.com/flying607/p/14657543.html
Copyright © 2020-2023  润新知