欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springcloud?gateway高級功能之集成apollo后動態(tài)刷新路由方式

 更新時間:2023年08月28日 09:56:34   作者:lipengxs  
這篇文章主要介紹了springcloud?gateway高級功能之集成apollo后動態(tài)刷新路由方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

springcloud gateway集成apollo后動態(tài)刷新路由

springcloud集成apollo后動態(tài)刷新路由配置

官網(wǎng)給的demo如下

import com.ctrip.framework.apollo.enums.PropertyChangeType;
import com.ctrip.framework.apollo.model.ConfigChange;
import com.ctrip.framework.apollo.model.ConfigChangeEvent;
import com.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.context.environment.EnvironmentChangeEvent;
import org.springframework.cloud.gateway.config.GatewayProperties;
import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
/**
 * @author ksewen
 * @date 2019/5/175:24 PM
 */
@Configuration
public class GatewayPropertiesRefresher implements ApplicationContextAware,ApplicationEventPublisherAware {
    private static final Logger logger = LoggerFactory.getLogger(GatewayPropertiesRefresher.class);
    private static final String ID_PATTERN = "spring\\.cloud\\.gateway\\.routes\\[\\d+\\]\\.id";
    private static final String DEFAULT_FILTER_PATTERN = "spring\\.cloud\\.gateway\\.default-filters\\[\\d+\\]\\.name";
    private ApplicationContext applicationContext;
    private ApplicationEventPublisher publisher;
    @Autowired
    private GatewayProperties gatewayProperties;
    @Autowired
    private RouteDefinitionWriter routeDefinitionWriter;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.publisher = applicationEventPublisher;
    }
    @ApolloConfigChangeListener(interestedKeyPrefixes = "spring.cloud.gateway.",value="recommend-facade.yml")
    public void onChange(ConfigChangeEvent changeEvent) {
        refreshGatewayProperties(changeEvent);
    }
    /***
     * 刷新org.springframework.cloud.gateway.config.PropertiesRouteDefinitionLocator中定義的routes
     *
     * @param changeEvent
     * @return void
     * @author ksewen
     * @date 2019/5/21 2:13 PM
     */
    private void refreshGatewayProperties(ConfigChangeEvent changeEvent) {
        logger.info("Refreshing GatewayProperties!");
        preDestroyGatewayProperties(changeEvent);
        this.applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys()));
        refreshGatewayRouteDefinition();
        logger.info("GatewayProperties refreshed!");
    }
    /***
     * GatewayProperties沒有@PreDestroy和destroy方法
     * org.springframework.cloud.context.properties.ConfigurationPropertiesRebinder#rebind(java.lang.String)中destroyBean時不會銷毀當前對象
     * 如果把spring.cloud.gateway.前綴的配置項全部刪除(例如需要動態(tài)刪除最后一個路由的場景),initializeBean時也無法創(chuàng)建新的bean,則return當前bean
     * 若仍保留有spring.cloud.gateway.routes[n]或spring.cloud.gateway.default-filters[n]等配置,initializeBean時會注入新的屬性替換已有的bean
     * 這個方法提供了類似@PreDestroy的操作,根據(jù)配置文件的實際情況把org.springframework.cloud.gateway.config.GatewayProperties#routes
     * 和org.springframework.cloud.gateway.config.GatewayProperties#defaultFilters兩個集合清空
     *
     * @param
     * @return void
     * @author ksewen
     * @date 2019/5/21 2:13 PM
     */
    private synchronized void preDestroyGatewayProperties(ConfigChangeEvent changeEvent) {
        logger.info("Pre Destroy GatewayProperties!");
        final boolean needClearRoutes = this.checkNeedClear(changeEvent, ID_PATTERN, this.gatewayProperties.getRoutes().size());
        if (needClearRoutes) {
            this.gatewayProperties.setRoutes(new ArrayList<>());
        }
        final boolean needClearDefaultFilters = this.checkNeedClear(changeEvent, DEFAULT_FILTER_PATTERN, this.gatewayProperties.getDefaultFilters().size());
        if (needClearDefaultFilters) {
            this.gatewayProperties.setRoutes(new ArrayList<>());
        }
        logger.info("Pre Destroy GatewayProperties finished!");
    }
    private void refreshGatewayRouteDefinition() {
        logger.info("Refreshing Gateway RouteDefinition!");
        this.publisher.publishEvent(new RefreshRoutesEvent(this));
        logger.info("Gateway RouteDefinition refreshed!");
    }
    /***
     * 根據(jù)changeEvent和定義的pattern匹配key,如果所有對應(yīng)PropertyChangeType為DELETED則需要清空GatewayProperties里相關(guān)集合
     *
     * @param changeEvent
     * @param pattern
     * @param existSize
     * @return boolean
     * @author ksewen
     * @date 2019/5/23 2:18 PM
     */
    private boolean checkNeedClear(ConfigChangeEvent changeEvent, String pattern, int existSize) {
        return changeEvent.changedKeys().stream().filter(key -> key.matches(pattern))
                .filter(key -> {
                    ConfigChange change = changeEvent.getChange(key);
                    return PropertyChangeType.DELETED.equals(change.getChangeType());
                }).count() == existSize;
    }
}

這里有個坑

如果是沒有用到默認的application.properties,這里我們就需要填寫namespace了

如下,

需要配置value=“使用的namespace”

    @ApolloConfigChangeListener(interestedKeyPrefixes = "spring.cloud.gateway.",value="xxxx.yml")
    public void onChange(ConfigChangeEvent changeEvent) {
        refreshGatewayProperties(changeEvent);
    }

springcloud集成apollo的注意事項

apollo的集成注意事項

1、建立本地緩存目錄(這里的本地指的是java應(yīng)用程序所在的pc):/opt/data

本地緩存路徑默認位于以下路徑,所以請確保/opt/data或C:\opt\data\目錄存在,且應(yīng)用有讀寫權(quán)限。

  • Mac/Linux: /opt/data/{appId}/config-cache
  • Windows: C:\opt\data{appId}\config-cache

2、要在本地目錄下設(shè)置連接apollo環(huán)境變量。

在下面的目錄下面,建立一個server.properties文件

  • Mac/Linux: /opt/settings
  • Windows: C:\opt\settings

文件內(nèi)容如下:(DEV是SpringColoud 要連接的 apollo 配置 )

env=DEV

3、如果使用 apollo 自帶的 eureka 。

那么發(fā)布到 apollo 的yml文件需要指定配置(eureka注意不能省略)

eureka.client.service-url.defaultZone	http://【apollo所在的ip】:8080/eureka

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Maven中央倉庫發(fā)布的實現(xiàn)方法

    Maven中央倉庫發(fā)布的實現(xiàn)方法

    最近做了個項目,希望能夠上傳到maven中央倉庫,給更多的人使用,于是就產(chǎn)生了這次項目發(fā)布經(jīng)歷。感興趣的可以一起來參考一下
    2021-06-06
  • 分析Spring框架之設(shè)計與實現(xiàn)資源加載器

    分析Spring框架之設(shè)計與實現(xiàn)資源加載器

    Spring框架是由于軟件開發(fā)的復雜性而創(chuàng)建的。然而,Spring的用途不僅僅限于服務(wù)器端的開發(fā)。從簡單性、可測試性和松耦合性角度而言,絕大部分Java應(yīng)用都可以從Spring中受益。今天來分析它的設(shè)計與實現(xiàn)資源加載器,從Spring.xml解析和注冊Bean對象
    2021-06-06
  • 多線程下嵌套異步任務(wù)導致程序假死問題

    多線程下嵌套異步任務(wù)導致程序假死問題

    這篇文章主要介紹了多線程下嵌套異步任務(wù)導致程序假死問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 使用Java實現(xiàn)驗證碼程序

    使用Java實現(xiàn)驗證碼程序

    這篇文章主要為大家詳細介紹了使用Java實現(xiàn)驗證碼程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 詳談java命令的本質(zhì)邏輯揭秘

    詳談java命令的本質(zhì)邏輯揭秘

    一個簡單的java命令背后究竟做了些什么事情,很多朋友提出幾個問題,下面帶領(lǐng)大家一起學習Java命令的本質(zhì)邏輯問題,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • StringBuilder為什么線程不安全深入講解

    StringBuilder為什么線程不安全深入講解

    這篇文章主要給大家介紹了關(guān)于StringBuilder為什么線程不安全的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用StringBuilder線程具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • SpringBoot favicon Chrome設(shè)置問題解決方案

    SpringBoot favicon Chrome設(shè)置問題解決方案

    在本篇文章里小編給大家分享的是關(guān)于SpringBoot favicon Chrome設(shè)置問題實例內(nèi)容,小的朋友們可以參考學習下。
    2020-02-02
  • springmvc中RequestMappingHandlerAdapter與HttpMessageConverter的裝配講解

    springmvc中RequestMappingHandlerAdapter與HttpMessageConverter的

    今天小編就為大家分享一篇關(guān)于springmvc中RequestMappingHandlerAdapter與HttpMessageConverter的裝配講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • java實現(xiàn)簡單圖片上傳下載功能

    java實現(xiàn)簡單圖片上傳下載功能

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡單圖片上傳下載功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • Java零基礎(chǔ)講解異常

    Java零基礎(chǔ)講解異常

    異常就是不正常,比如當我們身體出現(xiàn)了異常我們會根據(jù)身體情況選擇喝開水、吃藥、看病、等?異常處理方法。?java異常處理機制是我們java語言使用異常處理機制為程序提供了錯誤處理的能力,程序出現(xiàn)的錯誤,程序可以安全的退出,以保證程序正常的運行等
    2022-04-04

最新評論