最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Cloud Gateway + Nacos 實(shí)現(xiàn)動態(tài)路由

 更新時間:2020年10月26日 09:08:14   作者:空夜  
這篇文章主要介紹了Spring Cloud Gateway + Nacos 實(shí)現(xiàn)動態(tài)路由的方法,幫助大家實(shí)現(xiàn)路由信息的自動更新,感興趣的朋友可以了解下

本節(jié)開始介紹 SpringCloud Gateway 中動態(tài)路由的實(shí)現(xiàn)方法,包括:

Nacos 集成動態(tài)路由配置,更新配置文件即自動更新路由
MySQL + 二級緩存實(shí)現(xiàn),主要基于 Gateway 的一些特性進(jìn)行重寫,實(shí)現(xiàn)路由信息的自動更新

這篇文章主要介紹第一種方式:將配置文件放到 Nacos 進(jìn)行托管,網(wǎng)關(guān)服務(wù)通過引入 Nacos 而自動更新路由配置信息。實(shí)現(xiàn)較為簡單。

本節(jié)代碼在:https://github.com/laolunsi/spring-boot-examples,參考例 23 即可。

下面進(jìn)入正題。

1. 創(chuàng)建網(wǎng)關(guān)服務(wù)

創(chuàng)建一個 springboot gateway 網(wǎng)關(guān)服務(wù),默認(rèn)是從 yaml 文件中讀取 route 的配置。如果想要從 nacos 中讀取配置,就要引入 nacos-config 的依賴,并設(shè)置配置文件的地址。

首先創(chuàng)建一個空 maven 項(xiàng)目 spring-cloud-gateway-nacos-routes ,聲明 springboot 和 springcloud 的版本,并引入 nacos。

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.eknown</groupId>
    <artifactId>spring-cloud-gateway-nacos-routes</artifactId>
    <description>SpringCloud Gateway Nacos 動態(tài)路由示例</description>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR6</spring-cloud.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>0.9.0.RELEASE</version>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <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>

然后創(chuàng)建一個 springboot 項(xiàng)目,命名為:gateway-demo ,引入 gateway/nacos-config 等依賴:

<parent>
        <groupId>com.eknown</groupId>
        <artifactId>spring-cloud-gateway-nacos-routes</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <artifactId>gateway-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>gateway-demo</name>
    <description>Demo project for Spring Boot</description>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-core -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-core</artifactId>
            <version>5.3.9</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-alibaba-nacos-config</artifactId>
            <version>0.9.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
        </dependency>

    </dependencies>

我們知道 SpringBoot 加載配置文件的順序是:bootstrap.yml -> application.yml 這里需要將 nacos-config 的配置項(xiàng)放到 bootstrap.yml 中,這樣項(xiàng)目啟動時才能優(yōu)先從 nacos 中加載配置信息。主要配置如下:

server:
  port: 8501

spring:
  application:
    name: gateway-demo
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        group: ${gateway.dynamicRoute.group}
        file-extension: json
        server-addr: 127.0.0.1:8848
    gateway:
      discovery:
        locator:
          enabled: true
  redis:
    host: localhost
    password:
    port: 6379
    database: 10

# 自定義的配置項(xiàng),用于設(shè)置路由信息所載的配置文件,比如這里是 group + dataId
gateway:
  dynamicRoute:
    enabled:  true
    dataType: nacos
    dataId: 'yq_routes'
    group: 'YQ_GATEWAY'

將自定義配置項(xiàng)加載到 Java 中:

@Configuration
public class GatewayConfig {

    public static String NACOS_DATA_ID;
    public static String NACOS_GROUP_ID;

    @Value("${gateway.dynamicRoute.dataId}")
    public void setNacosDataId(String dataId) {
        NACOS_DATA_ID = dataId;
    }

    @Value("${gateway.dynamicRoute.group}")
    public void setNacosGroupId(String group) {
        NACOS_GROUP_ID = group;
    }
}

下面我們重寫一下 RouteDefinitionRepository 接口,將其改造成使用 Nacos 引入路由配置信息就可以了!

public class NacosRouteDefinitionRepository implements RouteDefinitionRepository {

    private static final Logger log = LoggerFactory.getLogger(NacosRouteDefinitionRepository.class);

    // 更新路由信息需要的
    private ApplicationEventPublisher publisher;

    // nacos 的配置信息
    private NacosConfigProperties nacosConfigProperties;

    // 構(gòu)造器
    public NacosRouteDefinitionRepository(ApplicationEventPublisher publisher, NacosConfigProperties nacosConfigProperties) {
        this.publisher = publisher;
        this.nacosConfigProperties = nacosConfigProperties;
        System.out.println(GatewayConfig.NACOS_DATA_ID + ", " + GatewayConfig.NACOS_GROUP_ID);
        addListener();
    }

    @Override
    public Flux<RouteDefinition> getRouteDefinitions() {
        try {
            String content = nacosConfigProperties.configServiceInstance()
                    .getConfig(GatewayConfig.NACOS_DATA_ID, GatewayConfig.NACOS_GROUP_ID,5000);
            List<RouteDefinition> routeDefinitions = getListByStr(content);
            return Flux.fromIterable(routeDefinitions);
        } catch (NacosException e) {
            log.error("getRouteDefinitions by nacos error", e);
        }
        return Flux.fromIterable(CollUtil.newArrayList());
    }

    /**
     * 添加Nacos監(jiān)聽
     */
    private void addListener() {
        try {
            nacosConfigProperties.configServiceInstance().addListener(GatewayConfig.NACOS_DATA_ID, GatewayConfig.NACOS_GROUP_ID, new Listener() {
                @Override
                public Executor getExecutor() {
                    return null;
                }

                @Override
                public void receiveConfigInfo(String configInfo) {
                    log.info("自動更新配置...\r\n" + configInfo);
                    publisher.publishEvent(new RefreshRoutesEvent(this));
                }
            });
        } catch (NacosException e) {
            log.error("nacos-addListener-error", e);
        }
    }

    @Override
    public Mono<Void> save(Mono<RouteDefinition> route) {
        return null;
    }

    @Override
    public Mono<Void> delete(Mono<String> routeId) {
        return null;
    }

    // 從 json 中解析出路由配置信息 —— 所以配置文件的格式一定要寫對!
    private List<RouteDefinition> getListByStr(String content) {
        if (StrUtil.isNotEmpty(content)) {
            return JSONObject.parseArray(content, RouteDefinition.class);
        }
        return new ArrayList<>(0);
    }
}

最簡單的方法是直接將這個 NacosRouteDefinitionRepository 類聲明為 Bean。這里為了方便配置的切換寫的復(fù)雜一點(diǎn),通過 DynamicRouteConfig 來確認(rèn)是否需要引入 nacos 的配置:

/**
 * 動態(tài)路由配置
 */
@Configuration
@ConditionalOnProperty(prefix = "gateway.dynamicRoute", name = "enabled", havingValue = "true")
public class DynamicRouteConfig {
    @Autowired
    private ApplicationEventPublisher publisher;

    /**
     * Nacos實(shí)現(xiàn)方式
     */
    @Configuration
    @ConditionalOnProperty(prefix = "gateway.dynamicRoute", name = "dataType", havingValue = "nacos", matchIfMissing = true)
    public class NacosDynRoute {
        @Autowired
        private NacosConfigProperties nacosConfigProperties;

        @Bean
        public NacosRouteDefinitionRepository nacosRouteDefinitionRepository() {
            return new NacosRouteDefinitionRepository(publisher, nacosConfigProperties);
        }
    }
}

到這一步我們其實(shí)已經(jīng)基本完成了 gateway + nacos 動態(tài)網(wǎng)關(guān)的實(shí)現(xiàn)了。下面我們測試一下。

2. 測試

創(chuàng)建一個簡單的 springboot web 項(xiàng)目,引入 nacos 作為注冊中心,并實(shí)現(xiàn)一個接口,比如:

server:
  port: 8502

spring:
  application:
    name: demo
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

注:這里實(shí)際上不需要引入 nacos 作為注冊中心的,因?yàn)槁酚蓪?shí)際上就是一個轉(zhuǎn)發(fā)功能,這個轉(zhuǎn)發(fā)操作是由 gateway 提供的,而不是 nacos 提供的。。。

接口:

@RestController
@RequestMapping(value = "test")
public class TestAction {

    @GetMapping(value = "hello")
    public String hello(String name) {
        System.out.println("hello, " + name);
        return "hello, " + name;
    }
}

啟動 nacos,添加配置文件,需要設(shè)置配置文件的 group 和 dataId 與上面的 gateway.dynamicRoute 中的配置相同。
內(nèi)容示例:

[
  {
    "id": "demo",
    "uri": "lb://demo",
    "predicates": [
      {
        "name": "Path",
        "args": {
          "pattern": "/api/demo/**"
        }
      }
    ],
    "filters": [
      {
        "name": "StripPrefix",
        "args": {
          "parts": "2"
        }
      }
    ]
  }
]

啟動 gateway-demo 以及 demo 項(xiàng)目,訪問 gateway-demo 項(xiàng)目對應(yīng)的路由地址,比如這里的:http://localhost:8501/api/demo/test/hello,如果運(yùn)行正常,請求將被轉(zhuǎn)發(fā)到 demo 項(xiàng)目的 /test/hello 接口,并返回對應(yīng)的數(shù)據(jù)。

今天的分享就到這里啦!本來打算寫一篇前文所說的第二種實(shí)現(xiàn)方法的文章的,不過由于二級緩存那邊是用了組里封裝的框架所以不便公布,后面有空我會自己實(shí)現(xiàn)一個基本的 demo,并同步到 Git 上!

水平有限,如有紕漏還請見諒。如果對文章內(nèi)容有什么疑問,可以留言或直接聯(lián)系我!thanks for your reading !

以上就是Spring Cloud Gateway + Nacos 實(shí)現(xiàn)動態(tài)路由的詳細(xì)內(nèi)容,更多關(guān)于SpringCloud Gateway 動態(tài)路由實(shí)現(xiàn)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java實(shí)現(xiàn)斗地主最簡代碼實(shí)例

    Java實(shí)現(xiàn)斗地主最簡代碼實(shí)例

    在本篇文章里小編給各位分享的是關(guān)于Java實(shí)現(xiàn)斗地主最簡代碼實(shí)例,有興趣的朋友們可以參考下。
    2020-05-05
  • Java中的傳值與傳引用實(shí)現(xiàn)過程解析

    Java中的傳值與傳引用實(shí)現(xiàn)過程解析

    這篇文章主要介紹了java中的傳值與傳引用實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • Java之stream流求字段累計(jì)和的3種方法總結(jié)

    Java之stream流求字段累計(jì)和的3種方法總結(jié)

    Java中Stream流用來幫助處理集合,類似于數(shù)據(jù)庫中的操作,下面這篇文章主要介紹了Java之stream流求字段累計(jì)和的3種方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-09-09
  • 詳解批處理框架之Spring Batch

    詳解批處理框架之Spring Batch

    Spring Batch是一個輕量級的、完善的批處理框架,作為Spring體系中的一員,它擁有靈活、方便、生產(chǎn)可用的特點(diǎn)。在應(yīng)對高效處理大量信息、定時處理大量數(shù)據(jù)等場景十分簡便。結(jié)合調(diào)度框架能更大地發(fā)揮Spring Batch的作用
    2021-06-06
  • IntelliJ IDEA Java項(xiàng)目手動添加依賴 jar 包的方法(圖解)

    IntelliJ IDEA Java項(xiàng)目手動添加依賴 jar 包的方法(圖解)

    這篇文章主要介紹了IntelliJ IDEA Java項(xiàng)目手動添加依賴 jar 包,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • Java線程休眠之sleep方法詳解

    Java線程休眠之sleep方法詳解

    這篇文章主要介紹了Java線程休眠之sleep方法詳解,Thread?類中有一個靜態(tài)方法的sleep方法,當(dāng)該線程調(diào)用sleep方法后,就會暫時讓CPU的調(diào)度權(quán),但是監(jiān)視器資源比如鎖并不會釋放出去,需要的朋友可以參考下
    2024-01-01
  • 如何把idea中的項(xiàng)目導(dǎo)入github倉庫中(圖文詳解)

    如何把idea中的項(xiàng)目導(dǎo)入github倉庫中(圖文詳解)

    這篇文章主要介紹了如何把idea中的項(xiàng)目導(dǎo)入github倉庫中,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • springboot+redis+阿里云短信實(shí)現(xiàn)手機(jī)號登錄功能

    springboot+redis+阿里云短信實(shí)現(xiàn)手機(jī)號登錄功能

    這篇文章主要介紹了springboot+redis+阿里云短信實(shí)現(xiàn)手機(jī)號登錄功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-01-01
  • Java 線程池詳解及創(chuàng)建簡單實(shí)例

    Java 線程池詳解及創(chuàng)建簡單實(shí)例

    這篇文章主要介紹了Java 線程池詳解及創(chuàng)建簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Spark SQL的自定義函數(shù)UDF使用

    Spark SQL的自定義函數(shù)UDF使用

    Spark Sql可以通過UDF來對DataFrame的Column進(jìn)行自定義操作。在特定場景下定義UDF可能需要用到Spark Context以外的資源或數(shù)據(jù)。比如從List或Map中取值,或是通過連接池從外部的數(shù)據(jù)源中讀取數(shù)據(jù),然后再參與Column的運(yùn)算
    2023-02-02

最新評論

桃园县| 高碑店市| 遂昌县| 米林县| 长岭县| 依安县| 定远县| 乌兰浩特市| 达州市| 耒阳市| 盐边县| 中牟县| 仁化县| 东辽县| 华阴市| 肃北| 兴义市| 广昌县| 博野县| 壤塘县| 平和县| 西贡区| 开远市| 江阴市| 尼木县| 青阳县| 织金县| 普陀区| 恩平市| 乌鲁木齐市| 博白县| 平阳县| 徐闻县| 民勤县| 广东省| 灵台县| 肇东市| 开平市| 蒙自县| 天津市| 濉溪县|