中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Nacos+Spring Cloud Gateway動態路由如何配置實現

發布時間:2021-08-10 11:59:50 來源:億速云 閱讀:344 作者:小新 欄目:開發技術

小編給大家分享一下Nacos+Spring Cloud Gateway動態路由如何配置實現,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

    前言

      Nacos最近項目一直在使用,其簡單靈活,支持更細粒度的命令空間,分組等為麻煩復雜的環境切換提供了方便;同時也很好支持動態路由的配置,只需要簡單的幾步即可。在國產的注冊中心、配置中心中比較突出,容易上手,本文通過gateway、nacos-consumer、nacos-provider三個簡單模塊來展示:Nacos下動態路由配置。

     博文中源碼已上傳至github(https://github.com/Jian0110/learning-cloudalibaba),歡迎小伙伴們star

    一、Nacos環境準備

    1、啟動Nacos配置中心并創建路由配置

    具體的Nacos怎么配置就不介紹了,可以參考阿里巴巴的官方介紹,這里通過windows直接本地啟動開啟單機模式,登錄Nacos Console,創建dev的namespace,在dev下的默認分組下創建gateway-router的dataId

    Nacos+Spring Cloud Gateway動態路由如何配置實現

    gateway-router的主要初始化配置如下:關于gateway的組成(id,order、predicates斷言,uri)這里就不詳細說明的了,可以自行百度下

    Nacos+Spring Cloud Gateway動態路由如何配置實現

    [{
        "id": "consumer-router",
        "order": 0,
        "predicates": [{
            "args": {
                "pattern": "/consume/**"
            },
            "name": "Path"
        }],
        "uri": "lb://nacos-consumer"
    },{
        "id": "provider-router",
        "order": 2,
        "predicates": [{
            "args": {
                "pattern": "/provide/**"
            },
            "name": "Path"
        }],
        "uri": "lb://nacos-provider"
    }]

    2、連接Nacos配置中心

    通常在項目中配置“配置中心”往往都是在bootstrap.propertis(yaml)中配置,這樣才能保證項目中路由配置從Nacos Config中讀取。

    # nacos配置中心配置建議在bootstrap.properties中配置
    spring.cloud.nacos.config.server-addr=127.0.0.1:8848
    #spring.cloud.nacos.config.file-extension=properties
    # 配置中心的命名空間:dev 的命名空間(環境)
    spring.cloud.nacos.config.namespace=08ecd1e5-c042-410a-84d5-b0a8fbeed8ea

    Application啟動類中增加注解@EnableDiscoveryClient,才能保證連接到Nacos Config

    @SpringBootApplication
    @EnableDiscoveryClient
    public class GatewayApplication
    {
        public static void main( String[] args )
        {
            SpringApplication.run(GatewayApplication.class, args);
        }
    }

    二、項目構建

    1、項目結構

    創建簡單的springboot多模塊結構,推薦使用idea創建

    1)Nacos父模塊:

    <groupId>com.springcloud</groupId>
    <artifactId>nacos</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>nacos</name>
    <description>Nacos Demo</description>

    首先pom文件引入Spring Cloud Alibaba Nacos組件:注冊中心nacos-discovery與配置中心nacos-config

     <!--nacos 客戶端 注冊中心-->
     <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
      <version>${alibaba-nacos.version}</version>
     </dependency>
      <!--nacos 客戶端 配置中心-->
     <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
      <version>${alibaba-nacos.version}</version>
     </dependency>

    其次再引入Spring Cloud相關組件依賴

    <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-dependencies</artifactId>
                    <version>${spring-boot.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
    </dependencyManagement>

    其它組件依賴引入(修正:如果引入了nacos-api相關的JSON依賴,那么fastjson就不需要再引入了,否則可能沖突):

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>${fastjson.version}</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    注意,這里有個坑,spring cloud gateway使用的web框架為webflux,和springMVC不兼容。所以不要引入(修正:只有gateway服務不用引入springMVC,其他需要引入)

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    2)三個子模塊:gateway、nacos-consumer、nacos-provider

    <modules>
      <module>nacos-provider</module>
      <module>nacos-consumer</module>
      <module>gateway</module>
    </modules>

    結構截圖如下所示:

    Nacos+Spring Cloud Gateway動態路由如何配置實現

    3)三個服務的端口分別為:

      nacos-consume:6001

      nacos-provider:6002

      gateway:6003

    4)服務架構如下:

    Nacos+Spring Cloud Gateway動態路由如何配置實現

    2、編寫測試代碼

    (1)在gateway模塊中主要實現以下功能:

    第一,從Nacos配置中心中加載動態路由的相關配置,就需要讀取Nacos的命名空間namespace,通過dataId獲取配置

    /**
     * 路由類配置
     */
    @Configuration
    public class GatewayConfig {
        public static final long DEFAULT_TIMEOUT = 30000;
    
        public static String NACOS_SERVER_ADDR;
    
        public static String NACOS_NAMESPACE;
    
        public static String NACOS_ROUTE_DATA_ID;
    
        public static String NACOS_ROUTE_GROUP;
    
        @Value("${spring.cloud.nacos.discovery.server-addr}")
        public void setNacosServerAddr(String nacosServerAddr){
            NACOS_SERVER_ADDR = nacosServerAddr;
        }
    
        @Value("${spring.cloud.nacos.discovery.namespace}")
        public void setNacosNamespace(String nacosNamespace){
            NACOS_NAMESPACE = nacosNamespace;
        }
    
        @Value("${nacos.gateway.route.config.data-id}")
        public void setNacosRouteDataId(String nacosRouteDataId){
            NACOS_ROUTE_DATA_ID = nacosRouteDataId;
        }
    
        @Value("${nacos.gateway.route.config.group}")
        public void setNacosRouteGroup(String nacosRouteGroup){
            NACOS_ROUTE_GROUP = nacosRouteGroup;
        }
    
    }

    properties配置關于Nacos下讀取gateway-router的配置:

    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
    spring.cloud.nacos.discovery.namespace=08ecd1e5-c042-410a-84d5-b0a8fbeed8ea
    nacos.gateway.route.config.data-id=gateway-router
    nacos.gateway.route.config.group=DEFAULT_GROUP

    第二,初始化路由,監聽動態路由配置的數據源變化(2020.12.28解決刪除路由不生效問題);

    /**
     *
     * 通過nacos下發動態路由配置,監聽Nacos中gateway-route配置
     *
     */
    @Component
    @Slf4j
    @DependsOn({"gatewayConfig"}) // 依賴于gatewayConfig bean
    public class DynamicRouteServiceImplByNacos {
    
        @Autowired
        private DynamicRouteServiceImpl dynamicRouteService;
    
    
        private ConfigService configService;
    
        @PostConstruct
        public void init() {
            log.info("gateway route init...");
            try{
                configService = initConfigService();
                if(configService == null){
                    log.warn("initConfigService fail");
                    return;
                }
                String configInfo = configService.getConfig(GatewayConfig.NACOS_ROUTE_DATA_ID, GatewayConfig.NACOS_ROUTE_GROUP, GatewayConfig.DEFAULT_TIMEOUT);
                log.info("獲取網關當前配置:\r\n{}",configInfo);
                List<RouteDefinition> definitionList = JSON.parseArray(configInfo, RouteDefinition.class);
                for(RouteDefinition definition : definitionList){
                    log.info("update route : {}",definition.toString());
                    dynamicRouteService.add(definition);
                }
            } catch (Exception e) {
                log.error("初始化網關路由時發生錯誤",e);
            }
            dynamicRouteByNacosListener(GatewayConfig.NACOS_ROUTE_DATA_ID,GatewayConfig.NACOS_ROUTE_GROUP);
        }
    
        /**
         * 監聽Nacos下發的動態路由配置
         * @param dataId
         * @param group
         */
        public void dynamicRouteByNacosListener (String dataId, String group){
            try {
                configService.addListener(dataId, group, new Listener()  {
                    @Override
                    public void receiveConfigInfo(String configInfo) {
                        log.info("進行網關更新:\n\r{}",configInfo);
                        List<RouteDefinition> definitionList = JSON.parseArray(configInfo, RouteDefinition.class);
                        log.info("update route : {}",definitionList.toString());
                        dynamicRouteService.updateList(definitionList);
                    }
                    @Override
                    public Executor getExecutor() {
                        log.info("getExecutor\n\r");
                        return null;
                    }
                });
            } catch (NacosException e) {
                log.error("從nacos接收動態路由配置出錯!!!",e);
            }
        }
    
        /**
         * 初始化網關路由 nacos config
         * @return
         */
        private ConfigService initConfigService(){
            try{
                Properties properties = new Properties();
                properties.setProperty("serverAddr",GatewayConfig.NACOS_SERVER_ADDR);
                properties.setProperty("namespace",GatewayConfig.NACOS_NAMESPACE);
                return configService= NacosFactory.createConfigService(properties);
            } catch (Exception e) {
                log.error("初始化網關路由時發生錯誤",e);
                return null;
            }
        }
    }

    第三,刷新最新的動態路由變化,實現動態增刪改路由(2020.12.28解決刪除路由不生效問題)

    /**
     * 動態更新路由網關service
     * 1)實現一個Spring提供的事件推送接口ApplicationEventPublisherAware
     * 2)提供動態路由的基礎方法,可通過獲取bean操作該類的方法。該類提供新增路由、更新路由、刪除路由,然后實現發布的功能。
     */
    @Slf4j
    @Service
    public class DynamicRouteServiceImpl implements ApplicationEventPublisherAware {
        @Autowired
        private RouteDefinitionWriter routeDefinitionWriter;
        @Autowired
        private RouteDefinitionLocator routeDefinitionLocator;
    
        /**
         * 發布事件
         */
        @Autowired
        private ApplicationEventPublisher publisher;
    
        @Override
        public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
            this.publisher = applicationEventPublisher;
        }
    
        /**
         * 刪除路由
         * @param id
         * @return
         */
        public String delete(String id) {
            try {
                log.info("gateway delete route id {}",id);
                this.routeDefinitionWriter.delete(Mono.just(id)).subscribe();
                this.publisher.publishEvent(new RefreshRoutesEvent(this));
                return "delete success";
            } catch (Exception e) {
                return "delete fail";
            }
        }
    
        /**
         * 更新路由
         * @param definitions
         * @return
         */
        public String updateList(List<RouteDefinition> definitions) {
            log.info("gateway update route {}",definitions);
            // 刪除緩存routerDefinition
            List<RouteDefinition> routeDefinitionsExits =  routeDefinitionLocator.getRouteDefinitions().buffer().blockFirst();
            if (!CollectionUtils.isEmpty(routeDefinitionsExits)) {
                routeDefinitionsExits.forEach(routeDefinition -> {
                    log.info("delete routeDefinition:{}", routeDefinition);
                    delete(routeDefinition.getId());
                });
            }
            definitions.forEach(definition -> {
                updateById(definition);
            });
            return "success";
        }
    
        /**
         * 更新路由
         * @param definition
         * @return
         */
        public String updateById(RouteDefinition definition) {
            try {
                log.info("gateway update route {}",definition);
                this.routeDefinitionWriter.delete(Mono.just(definition.getId()));
            } catch (Exception e) {
                return "update fail,not find route  routeId: "+definition.getId();
            }
            try {
                routeDefinitionWriter.save(Mono.just(definition)).subscribe();
                this.publisher.publishEvent(new RefreshRoutesEvent(this));
                return "success";
            } catch (Exception e) {
                return "update route fail";
            }
        }
    
        /**
         * 增加路由
         * @param definition
         * @return
         */
        public String add(RouteDefinition definition) {
            log.info("gateway add route {}",definition);
            routeDefinitionWriter.save(Mono.just(definition)).subscribe();
            this.publisher.publishEvent(new RefreshRoutesEvent(this));
            return "success";
        }
    }

    三、測試動態網關配置

    1、啟動服務,觀察注冊中心

    分別啟動gateway、nacos-consumer、nacos-provider三個服務,觀察是否已經在Nacos上正確注冊

    Nacos+Spring Cloud Gateway動態路由如何配置實現

    注意:需要指定注冊中心的namespace為dev的空間,即spring.cloud.nacos.discovery.namespace=08ecd1e5-c042-410a-84d5-b0a8fbeed8ea

    2、訪問網關,觀察服務日志

    (1)查看gateway服務的初始化啟動日志:會發現可以正常從Nacos獲取配置gateway-router網關配置文件內容,并進行正確路由加載...

    2020-05-10 14:33:44.557  INFO 1272 --- [           main] c.g.r.DynamicRouteServiceImplByNacos     : gateway route init...
    2020-05-10 14:33:44.578  INFO 1272 --- [           main] c.g.r.DynamicRouteServiceImplByNacos     : 獲取網關當前配置:
    [{
        "id": "consumer-router",
        "order": 0,
        "predicates": [{
            "args": {
                "pattern": "/consume/**"
            },
            "name": "Path"
        }],
        "uri": "lb://nacos-consumer"
    },{
        "id": "provider-router",
        "order": 2,
        "predicates": [{
            "args": {
                "pattern": "/provide/**"
            },
            "name": "Path"
        }],
        "uri": "lb://nacos-provider"
    }]
    2020-05-10 14:33:44.691  INFO 1272 --- [           main] c.g.r.DynamicRouteServiceImplByNacos     : update route : RouteDefinition{id='consumer-router', predicates=[PredicateDefinition{name='Path', args={pattern=/consume/**}}], filters=[], uri=lb://nacos-consumer, order=0, metadata={}}
    2020-05-10 14:33:44.691  INFO 1272 --- [           main] c.g.service.DynamicRouteServiceImpl      : gateway add route RouteDefinition{id='consumer-router', predicates=[PredicateDefinition{name='Path', args={pattern=/consume/**}}], filters=[], uri=lb://nacos-consumer, order=0, metadata={}}
    2020-05-10 14:33:45.192  INFO 1272 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [After]
    2020-05-10 14:33:45.192  INFO 1272 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Before]
    2020-05-10 14:33:45.192  INFO 1272 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Between]
    2020-05-10 14:33:45.193  INFO 1272 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Cookie]
    2020-05-10 14:33:45.193  INFO 1272 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Header]
    2020-05-10 14:33:45.193  INFO 1272 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Host]
    2020-05-10 14:33:45.194  INFO 1272 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Method]
    2020-05-10 14:33:45.194  INFO 1272 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Path]
    2020-05-10 14:33:45.194  INFO 1272 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Query]
    2020-05-10 14:33:45.194  INFO 1272 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [ReadBodyPredicateFactory]
    2020-05-10 14:33:45.194  INFO 1272 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [RemoteAddr]
    2020-05-10 14:33:45.194  INFO 1272 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Weight]
    2020-05-10 14:33:45.194  INFO 1272 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [CloudFoundryRouteService]
    2020-05-10 14:33:45.335  INFO 1272 --- [           main] c.g.r.DynamicRouteServiceImplByNacos     : update route : RouteDefinition{id='provider-router', predicates=[PredicateDefinition{name='Path', args={pattern=/provide/**}}], filters=[], uri=lb://nacos-provider, order=2, metadata={}}
    2020-05-10 14:33:45.335  INFO 1272 --- [           main] c.g.service.DynamicRouteServiceImpl      : gateway add route RouteDefinition{id='provider-router', predicates=[PredicateDefinition{name='Path', args={pattern=/provide/**}}], filters=[], uri=lb://nacos-provider, order=2, metadata={}}
    2020-05-10 14:33:45.336  INFO 1272 --- [           main] c.g.r.DynamicRouteServiceImplByNacos     : update route : RouteDefinition{id='github-router', predicates=[PredicateDefinition{name='Path', args={pattern=/github}}], filters=[], uri=https://github.com, order=3, metadata={}}
    2020-05-10 14:33:45.336  INFO 1272 --- [           main] c.g.service.DynamicRouteServiceImpl      : gateway add route RouteDefinition{id='github-router', predicates=[PredicateDefinition{name='Path', args={pattern=/github}}], filters=[], uri=https://github.com, order=3, metadata={}}

    但這只能說明是初始化靜態路由,下面我們改變gateway-router網關配置內容,追加github-router路由

    [{
        "id": "consumer-router",
        "order": 0,
        "predicates": [{
            "args": {
                "pattern": "/consume/**"
            },
            "name": "Path"
        }],
        "uri": "lb://nacos-consumer"
    },{
        "id": "provider-router",
        "order": 2,
        "predicates": [{
            "args": {
                "pattern": "/provide/**"
            },
            "name": "Path"
        }],
        "uri": "lb://nacos-provider"
    },{
        "id": "github-router",
        "order": 2,
        "predicates": [{
            "args": {
                "pattern": "/github/**"
            },
            "name": "Path"
        }],
        "uri": "https://github.com"
    }]

    之后點擊發布更新路由配置

    Nacos+Spring Cloud Gateway動態路由如何配置實現

    觀察gateway服務日志,有沒有監聽,并且進行正確的路由更新:如下日志所示,最新路由配置立馬被打印,并且進行正確路由更新

    2020-05-10 14:42:27.576  INFO 1272 --- [d5-b0a8fbeed8ea] c.g.r.DynamicRouteServiceImplByNacos     : 進行網關更新:
    
    [{
        "id": "consumer-router",
        "order": 0,
        "predicates": [{
            "args": {
                "pattern": "/consume/**"
            },
            "name": "Path"
        }],
        "uri": "lb://nacos-consumer"
    },{
        "id": "provider-router",
        "order": 2,
        "predicates": [{
            "args": {
                "pattern": "/provide/**"
            },
            "name": "Path"
        }],
        "uri": "lb://nacos-provider"
    },{
        "id": "github-router",
        "order": 2,
        "predicates": [{
            "args": {
                "pattern": "/github/**"
            },
            "name": "Path"
        }],
        "uri": "https://github.com"
    }]
    2020-05-10 14:42:27.576  INFO 1272 --- [d5-b0a8fbeed8ea] c.g.r.DynamicRouteServiceImplByNacos     : update route : RouteDefinition{id='consumer-router', predicates=[PredicateDefinition{name='Path', args={pattern=/consume/**}}], filters=[], uri=lb://nacos-consumer, order=0, metadata={}}
    2020-05-10 14:42:27.576  INFO 1272 --- [d5-b0a8fbeed8ea] c.g.service.DynamicRouteServiceImpl      : gateway update route RouteDefinition{id='consumer-router', predicates=[PredicateDefinition{name='Path', args={pattern=/consume/**}}], filters=[], uri=lb://nacos-consumer, order=0, metadata={}}
    2020-05-10 14:42:27.578  INFO 1272 --- [d5-b0a8fbeed8ea] c.g.r.DynamicRouteServiceImplByNacos     : update route : RouteDefinition{id='provider-router', predicates=[PredicateDefinition{name='Path', args={pattern=/provide/**}}], filters=[], uri=lb://nacos-provider, order=2, metadata={}}
    2020-05-10 14:42:27.578  INFO 1272 --- [d5-b0a8fbeed8ea] c.g.service.DynamicRouteServiceImpl      : gateway update route RouteDefinition{id='provider-router', predicates=[PredicateDefinition{name='Path', args={pattern=/provide/**}}], filters=[], uri=lb://nacos-provider, order=2, metadata={}}
    2020-05-10 14:42:27.580  INFO 1272 --- [d5-b0a8fbeed8ea] c.g.r.DynamicRouteServiceImplByNacos     : update route : RouteDefinition{id='github-router', predicates=[PredicateDefinition{name='Path', args={pattern=/github/**}}], filters=[], uri=https://github.com, order=2, metadata={}}
    2020-05-10 14:42:27.580  INFO 1272 --- [d5-b0a8fbeed8ea] c.g.service.DynamicRouteServiceImpl      : gateway update route RouteDefinition{id='github-router', predicates=[PredicateDefinition{name='Path', args={pattern=/github/**}}], filters=[], uri=https://github.com, order=2, metadata={}}

    其實,還有辦法可以知道我們的gateway服務有沒有監聽Nacos的gateway-router配置,那就是在Nacos Console--->監聽查詢----->選擇配置---->輸入配置文件的namespace與Group:可以發現我本地IP地址127.0.0.1對配置文件gateway-router進行了監聽

    Nacos+Spring Cloud Gateway動態路由如何配置實現

    (2)訪問gateway網關服務:http://localhost:6003/consume/sayHello/nacos

      Nacos+Spring Cloud Gateway動態路由如何配置實現

    查看consumer服務日志:

    2020-05-10 14:55:07.257 INFO 6552 --- [nio-6001-exec-2] c.n.c.controller.ConsumeController : I'm calling nacos-consumer service by dynamic gateway...

    發現跳轉至consumer服務,并且訪問了consumer服務的CosnumerController

    (3)訪問gateway網關服務:http://localhost:6003/provider/sayHello/nacos

    Nacos+Spring Cloud Gateway動態路由如何配置實現

    查看provider服務日志:

    2020-05-10 14:56:56.144 INFO 10024 --- [nio-6002-exec-1] c.n.p.controller.ProviderController : I'm calling nacos-provider service by dynamic gateway...

    發現跳轉至consumer服務,并且訪問了provider服務的ProviderController

    (4)訪問訪問gateway網關服務:http://localhost:6003/github,正確跳轉至github頁面

    Nacos+Spring Cloud Gateway動態路由如何配置實現

    四、總結

      1)Spring Cloud Gateway作用不光只是簡單的跳轉重定向,還可以實現用戶的驗證登錄,解決跨域,日志攔截,權限控制,限流,熔斷,負載均衡,黑名單和白名單機制等。是微服務架構不二的選擇;

      2)Nacos的配置中心支持動態獲取配置文件,可以將一些全局的經常變更的配置文件放在Nacos下,需要到微服務自行獲取。

    2020.12.28解決刪除路由不生效問題,主要是利用RouteDefinitionLocator先讀取變化之前的RouteDefinition,之后刪除重新再更新,或者可以實現routeDefinitionWriter、RouteDefinitionLocator重寫如下方法:

    Mono<Void> save(Mono<RouteDefinition> route);
    Mono<Void> delete(Mono<String> routeId);
    Flux<RouteDefinition> getRouteDefinitions();

    看完了這篇文章,相信你對“Nacos+Spring Cloud Gateway動態路由如何配置實現”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    大同市| 怀来县| 沂源县| 南郑县| 红桥区| 青海省| 宾川县| 邵东县| 龙川县| 怀仁县| 潼关县| 青岛市| 雅江县| 抚松县| 随州市| 乌什县| 山阴县| 禹城市| 马山县| 普兰县| 鹤庆县| 吐鲁番市| 连云港市| 昭平县| 偃师市| 兴山县| 沂水县| 宜昌市| 郑州市| 鄂托克前旗| 北碚区| 闵行区| 宁晋县| 长宁县| 弥渡县| 汉寿县| 昆山市| 隆德县| 寿宁县| 志丹县| 开原市|