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

溫馨提示×

溫馨提示×

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

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

Spring Cloud Zuul的動態路由以及集成Nacos實現的示例分析

發布時間:2021-12-18 14:48:40 來源:億速云 閱讀:533 作者:柒染 欄目:大數據

Spring Cloud Zuul的動態路由以及集成Nacos實現的示例分析,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

一、說明

網關的核心概念就是路由配置和路由規則,而作為所有請求流量的入口,在實際生產環境中為了保證高可靠和高可用,是盡量要避免重啟的,所以實現動態路由是非常有必要的;下面主要介紹實現的思路,并且以Nacos為數據源來講解

二、實現要點

要實現動態路由只需關注下面4個點

  1. 網關啟動時,動態路由的數據怎樣加載進來

  2. 靜態路由動態路由以那個為準,ps:靜態路由指的是配置文件里寫死的路由配置

  3. 監聽動態路由的數據源變化

  4. 數據有變化時怎樣通知zuul刷新路由

三、具體實現

3.1. 實現動態路由的數據加載

  • 重寫SimpleRouteLocator類的locateRoutes方法,此方法是加載路由配置的,父類中是獲取properties中的路由配置,可以通過擴展此方法,達到動態獲取配置的目的

  • 這里采用靜態路由動態路由共存,相同路由id以動態路由優先覆蓋的實現方式

AbstractDynRouteLocator抽象類

public abstract class AbstractDynRouteLocator extends SimpleRouteLocator implements RefreshableRouteLocator {    private ZuulProperties properties;    public AbstractDynRouteLocator(String servletPath, ZuulProperties properties) {        super(servletPath, properties);        this.properties = properties;    }    @Override    public void refresh() {        doRefresh();    }    @Override    protected Map<String, ZuulRoute> locateRoutes() {        LinkedHashMap<String, ZuulRoute> routesMap = new LinkedHashMap<>();        // 從application.properties中加載靜態路由信息        routesMap.putAll(super.locateRoutes());        // 從數據源中加載動態路由信息        routesMap.putAll(loadDynamicRoute());        // 優化一下配置        LinkedHashMap<String, ZuulRoute> values = new LinkedHashMap<>();        for (Map.Entry<String, ZuulRoute> entry : routesMap.entrySet()) {            String path = entry.getKey();            // Prepend with slash if not already present.            if (!path.startsWith("/")) {                path = "/" + path;            }            if (StringUtils.hasText(this.properties.getPrefix())) {                path = this.properties.getPrefix() + path;                if (!path.startsWith("/")) {                    path = "/" + path;                }            }            values.put(path, entry.getValue());        }        return values;    }    /**     * 加載路由配置,由子類去實現     */    public abstract Map<String, ZuulRoute> loadDynamicRoute();}

由于動態路由的數據可以有很多種途徑,如:Nacos、Redis、Zookeeper、DB等,所以這里定義一個抽象類,由具體的實現類去定義loadDynamicRoute方法

3.2. Nacos路由實現類

NacosDynRouteLocator類

3.2.1. 實現loadDynamicRoute方法獲取動態數據

@Overridepublic Map<String, ZuulProperties.ZuulRoute> loadDynamicRoute() {    Map<String, ZuulRoute> routes = new LinkedHashMap<>();    if (zuulRouteEntities == null) {        zuulRouteEntities = getNacosConfig();    }    for (ZuulRouteEntity result : zuulRouteEntities) {        if (StrUtil.isBlank(result.getPath()) || !result.isEnabled()) {            continue;        }        ZuulRoute zuulRoute = new ZuulRoute();        BeanUtil.copyProperties(result, zuulRoute);        routes.put(zuulRoute.getPath(), zuulRoute);    }    return routes;}private List<ZuulRouteEntity> getNacosConfig() {    try {        String content = nacosConfigProperties.configServiceInstance().getConfig(ZUUL_DATA_ID, ZUUL_GROUP_ID,5000);        return getListByStr(content);    } catch (NacosException e) {        log.error("listenerNacos-error", e);    }    return new ArrayList<>(0);}

3.2.2. 增加NacosListener監聽路由數據變化

private void addListener() {    try {        nacosConfigProperties.configServiceInstance().addListener(ZUUL_DATA_ID, ZUUL_GROUP_ID, new Listener() {            @Override            public Executor getExecutor() {                return null;            }            @Override            public void receiveConfigInfo(String configInfo) {                //賦值路由信息                locator.setZuulRouteEntities(getListByStr(configInfo));                RoutesRefreshedEvent routesRefreshedEvent = new RoutesRefreshedEvent(locator);                publisher.publishEvent(routesRefreshedEvent);            }        });    } catch (NacosException e) {        log.error("nacos-addListener-error", e);    }}

注意路由數據變化后不需要自己手動刷新路由,只需要給zuul發送一個RoutesRefreshedEvent事件即可,zuul自己有個ZuulRefreshListener類會監聽事件幫我們刷新路由

該類完整的代碼實現可查看:

https://gitee.com/zlt2000/microservices-platform/blob/master/zlt-gateway/zuul-gateway/src/main/java/com/central/gateway/route/nacos/NacosDynRouteLocator.java

3.3. 配置類創建NacosDynRouteLocator的Bean

DynamicZuulRouteConfig類

@Configuration@ConditionalOnProperty(prefix = "zlt.gateway.dynamicRoute", name = "enabled", havingValue = "true")public class DynamicZuulRouteConfig {    @Autowired    private ZuulProperties zuulProperties;    @Autowired    private DispatcherServletPath dispatcherServletPath;    /**     * Nacos實現方式     */    @Configuration    @ConditionalOnProperty(prefix = "zlt.gateway.dynamicRoute", name = "dataType", havingValue = "nacos", matchIfMissing = true)    public class NacosZuulRoute {        @Autowired        private NacosConfigProperties nacosConfigProperties;        @Autowired        private ApplicationEventPublisher publisher;        @Bean        public NacosDynRouteLocator nacosDynRouteLocator() {            return new NacosDynRouteLocator(nacosConfigProperties, publisher, dispatcherServletPath.getPrefix(), zuulProperties);        }    }}

這里通過自定義配置來控制是否開啟動態路由功能

3.4. 添加Nacos路由配置

Spring Cloud Zuul的動態路由以及集成Nacos實現的示例分析
新增配置項:

  • Data Id:zuul-routes

  • Group:ZUUL_GATEWAY

  • 配置內容:

[  {      "enabled":true,      "id":"csdn",      "path":"/csdn/**",      "retryable":false,      "stripPrefix":true,      "url":"https://www.csdn.net/"  }, {      "enabled":true,      "id":"github",      "path":"/github/**",      "retryable":false,      "stripPrefix":true,      "url":"http://github.com/"  }]

添加兩條路由數據

四、測試

  • 啟動網關通過/actuator/routes端點查看網關所有路由信息
    Spring Cloud Zuul的動態路由以及集成Nacos實現的示例分析

    可以看到靜態路由和Nacos里配置的兩條路由信息并存顯示

  • 修改Nacos配置,關閉csdn路由
    Spring Cloud Zuul的動態路由以及集成Nacos實現的示例分析

  • 刷新查看網關的路由信息
    Spring Cloud Zuul的動態路由以及集成Nacos實現的示例分析

    csdn的路由已經看不到了,實現了動態改變路由配置

關于Spring Cloud Zuul的動態路由以及集成Nacos實現的示例分析問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

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

AI

瓮安县| 汝城县| 郎溪县| 天柱县| 镇原县| 平塘县| 高密市| 建昌县| 灵台县| 芦溪县| 隆昌县| 托克托县| 全州县| 木兰县| 简阳市| 乌兰察布市| 通海县| 寻甸| 高淳县| 肇庆市| 昭通市| 东城区| 武乡县| 翁牛特旗| 云和县| 新余市| 淮南市| 通河县| 时尚| 民丰县| 绵竹市| 永新县| 永和县| 财经| 钟山县| 汶上县| 吉木萨尔县| 民乐县| 修武县| 海兴县| 英山县|