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

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

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

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

springcloud集成apollo后動(dòng)態(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沒(méi)有@PreDestroy和destroy方法
     * org.springframework.cloud.context.properties.ConfigurationPropertiesRebinder#rebind(java.lang.String)中destroyBean時(shí)不會(huì)銷毀當(dāng)前對(duì)象
     * 如果把spring.cloud.gateway.前綴的配置項(xiàng)全部刪除(例如需要?jiǎng)討B(tài)刪除最后一個(gè)路由的場(chǎng)景),initializeBean時(shí)也無(wú)法創(chuàng)建新的bean,則return當(dāng)前bean
     * 若仍保留有spring.cloud.gateway.routes[n]或spring.cloud.gateway.default-filters[n]等配置,initializeBean時(shí)會(huì)注入新的屬性替換已有的bean
     * 這個(gè)方法提供了類似@PreDestroy的操作,根據(jù)配置文件的實(shí)際情況把org.springframework.cloud.gateway.config.GatewayProperties#routes
     * 和org.springframework.cloud.gateway.config.GatewayProperties#defaultFilters兩個(gè)集合清空
     *
     * @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,如果所有對(duì)應(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;
    }
}

這里有個(gè)坑

如果是沒(méi)有用到默認(rèn)的application.properties,這里我們就需要填寫namespace了

如下,

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

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

springcloud集成apollo的注意事項(xiàng)

apollo的集成注意事項(xiàng)

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

本地緩存路徑默認(rèn)位于以下路徑,所以請(qǐng)確保/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)境變量。

在下面的目錄下面,建立一個(gè)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é)

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

相關(guān)文章

  • JavaSwing GridLayout 網(wǎng)格布局的實(shí)現(xiàn)代碼

    JavaSwing GridLayout 網(wǎng)格布局的實(shí)現(xiàn)代碼

    這篇文章主要介紹了JavaSwing GridLayout 網(wǎng)格布局的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Java實(shí)現(xiàn)富文本轉(zhuǎn)markdown

    Java實(shí)現(xiàn)富文本轉(zhuǎn)markdown

    這篇文章主要為大家詳細(xì)介紹了如何通過(guò)Java實(shí)現(xiàn)富文本轉(zhuǎn)markdown功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下
    2023-12-12
  • 使用Properties讀取配置文件的示例詳解

    使用Properties讀取配置文件的示例詳解

    開(kāi)發(fā)SpringBoot項(xiàng)目時(shí),使用配置文件配置項(xiàng)目相關(guān)屬性是必不可少的,所以下文為大家準(zhǔn)備了使用Properties讀取配置文件的示例代碼,希望對(duì)大家有所幫助
    2023-06-06
  • java實(shí)現(xiàn)消息隊(duì)列的兩種方式(小結(jié))

    java實(shí)現(xiàn)消息隊(duì)列的兩種方式(小結(jié))

    本文主要介紹了兩種java實(shí)現(xiàn)消息隊(duì)列的方式,利用Spring消息模板發(fā)送消息和Apache ActiveMQ官方實(shí)例發(fā)送消息,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • java圖論弗洛伊德和迪杰斯特拉算法解決最短路徑問(wèn)題

    java圖論弗洛伊德和迪杰斯特拉算法解決最短路徑問(wèn)題

    這篇文章主要為大家介紹了java圖論弗洛伊德算法和迪杰斯特拉算法解決最短路徑的問(wèn)題示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • SpringBoot文件上傳控制及Java 獲取和判斷文件頭信息

    SpringBoot文件上傳控制及Java 獲取和判斷文件頭信息

    這篇文章主要介紹了SpringBoot文件上傳控制的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-12-12
  • HttpClient的KeepAlive接口方法源碼解析

    HttpClient的KeepAlive接口方法源碼解析

    這篇文章主要為大家介紹了HttpClient的KeepAlive接口方法源碼解析,
    有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Mybatis環(huán)境搭建和使用實(shí)例代碼

    Mybatis環(huán)境搭建和使用實(shí)例代碼

    MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。本文重點(diǎn)給大家介紹Mybatis的環(huán)境搭建和使用實(shí)例代碼,需要的朋友參考下吧
    2017-12-12
  • Spring Batch讀取txt文件并寫入數(shù)據(jù)庫(kù)的方法教程

    Spring Batch讀取txt文件并寫入數(shù)據(jù)庫(kù)的方法教程

    這篇文章主要給大家介紹了Spring Batch讀取txt文件并寫入數(shù)據(jù)庫(kù)的方法,SpringBatch 是一個(gè)輕量級(jí)、全面的批處理框架。這里我們用它來(lái)實(shí)現(xiàn)文件的讀取并將讀取的結(jié)果作處理,處理之后再寫入數(shù)據(jù)庫(kù)中的功能。需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-04-04
  • Apache Shrio安全框架實(shí)現(xiàn)原理及實(shí)例詳解

    Apache Shrio安全框架實(shí)現(xiàn)原理及實(shí)例詳解

    這篇文章主要介紹了Apache Shrio安全框架實(shí)現(xiàn)原理及實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04

最新評(píng)論

鸡西市| 莒南县| 鄂伦春自治旗| 邛崃市| 紫阳县| 福海县| 化隆| 永宁县| 富裕县| 沁水县| 太和县| 兴安盟| 六安市| 图木舒克市| 理塘县| 平潭县| 慈溪市| 静乐县| 张掖市| 息烽县| 汨罗市| 怀来县| 钟山县| 高碑店市| 噶尔县| 海安县| 江北区| 资阳市| 河津市| 威远县| 河曲县| 六枝特区| 都江堰市| 休宁县| 双牌县| 静宁县| 象山县| 宁远县| 曲水县| 徐水县| 平顶山市|