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

基于Nacos實現(xiàn)Spring Cloud Gateway實現(xiàn)動態(tài)路由的方法

 更新時間:2020年06月11日 11:01:39   作者:java圈  
這篇文章主要介紹了基于Nacos實現(xiàn)Spring Cloud Gateway實現(xiàn)動態(tài)路由的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

簡介

該文檔主要介紹以Nacos為配置中心,實現(xiàn)Spring Cloud GateWay 實現(xiàn)動態(tài)路由的功能。Spring Cloud Gateway啟動時候,就將路由配置和規(guī)則加載到內(nèi)存里,無法做到不重啟網(wǎng)關(guān)就可以動態(tài)的對應(yīng)路由的配置和規(guī)則進(jìn)行增加,修改和刪除。通過nacos的配置下發(fā)的功能可以實現(xiàn)在不重啟網(wǎng)關(guān)的情況下,實現(xiàn)動態(tài)路由。

集成

Spring Cloud GateWay集成

spring-cloud-starter-gateway:路由轉(zhuǎn)發(fā)、請求過濾(權(quán)限校驗、限流以及監(jiān)控等)

spring-boot-starter-webflux:反應(yīng)式Web框架

spring-boot-starter-actuator:監(jiān)控系統(tǒng)健康

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

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

Nacos集成

nacos-client:nacos客戶端,現(xiàn)在用比較新的版本0.9.0

  <dependency>
			<groupId>com.alibaba.nacos</groupId>
			<artifactId>nacos-client</artifactId>
			<version>0.9.0</version>
		</dependency>

動態(tài)路由

DynamicRouteServiceImpl:提供動態(tài)路由的基礎(chǔ)方法,可通過獲取bean操作該類的方法。該類提供新增路由、更新路由、刪除路由,然后實現(xiàn)發(fā)布的功能。

@Service
public class DynamicRouteServiceImpl implements ApplicationEventPublisherAware {

  @Autowired
  private RouteDefinitionWriter routeDefinitionWriter;

  private ApplicationEventPublisher publisher;


  /**
   * 增加路由
   * @param definition
   * @return
   */
  public String add(RouteDefinition definition) {
    routeDefinitionWriter.save(Mono.just(definition)).subscribe();
    this.publisher.publishEvent(new RefreshRoutesEvent(this));
    return "success";
  }


  /**
   * 更新路由
   * @param definition
   * @return
   */
  public String update(RouteDefinition definition) {
    try {
      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 id
   * @return
   */
  public String delete(String id) {
    try {
      this.routeDefinitionWriter.delete(Mono.just(id));
      return "delete success";
    } catch (Exception e) {
      e.printStackTrace();
      return "delete fail";
    }

  }

  @Override
  public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
    this.publisher = applicationEventPublisher;
  }

}

RouteDefinition: 提供路由實體類,主要有predicates匹配來自用戶的請求,filters服務(wù)路由

@Validated
public class RouteDefinition {
	@NotEmpty
	private String id = UUID.randomUUID().toString();

	@NotEmpty
	@Valid
	private List<PredicateDefinition> predicates = new ArrayList<>();

	@Valid
	private List<FilterDefinition> filters = new ArrayList<>();

	@NotNull
	private URI uri;

	private int order = 0;

	public RouteDefinition() {}

	public RouteDefinition(String text) {
		int eqIdx = text.indexOf("=");
		if (eqIdx <= 0) {
			throw new ValidationException("Unable to parse RouteDefinition text '" + text + "'" +
					", must be of the form name=value");
		}

		setId(text.substring(0, eqIdx));

		String[] args = tokenizeToStringArray(text.substring(eqIdx+1), ",");

		setUri(URI.create(args[0]));

		for (int i=1; i < args.length; i++) {
			this.predicates.add(new PredicateDefinition(args[i]));
		}
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public List<PredicateDefinition> getPredicates() {
		return predicates;
	}

	public void setPredicates(List<PredicateDefinition> predicates) {
		this.predicates = predicates;
	}

	public List<FilterDefinition> getFilters() {
		return filters;
	}

	public void setFilters(List<FilterDefinition> filters) {
		this.filters = filters;
	}

	public URI getUri() {
		return uri;
	}

	public void setUri(URI uri) {
		this.uri = uri;
	}

	public int getOrder() {
		return order;
	}

	public void setOrder(int order) {
		this.order = order;
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (o == null || getClass() != o.getClass()) return false;
		RouteDefinition routeDefinition = (RouteDefinition) o;
		return Objects.equals(id, routeDefinition.id) &&
				Objects.equals(predicates, routeDefinition.predicates) &&
				Objects.equals(order, routeDefinition.order) &&
				Objects.equals(uri, routeDefinition.uri);
	}

	@Override
	public int hashCode() {
		return Objects.hash(id, predicates, uri);
	}

	@Override
	public String toString() {
		return "RouteDefinition{" +
				"id='" + id + '\'' +
				", predicates=" + predicates +
				", filters=" + filters +
				", uri=" + uri +
				", order=" + order +
				'}';
	}
}

NacosGatewayProperties:自定義屬性綁定值,可通過配置文件配置屬性。

@ConfigurationProperties(prefix="nacos", ignoreUnknownFields = true)
@Configuration
public class NacosGatewayProperties {

	private String address;
	
	private String dataId;
	
	private String groupId;
	
	private Long timeout;

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String getDataId() {
		return dataId;
	}

	public void setDataId(String dataId) {
		this.dataId = dataId;
	}

	public String getGroupId() {
		return groupId;
	}

	public void setGroupId(String groupId) {
		this.groupId = groupId;
	}

	public Long getTimeout() {
		return timeout;
	}

	public void setTimeout(Long timeout) {
		this.timeout = timeout;
	}	
}

DynamicRouteServiceImplByNacos: 實現(xiàn)runner,通過nacos下發(fā)動態(tài)路由配置

@Component
public class DynamicRouteServiceImplByNacos implements CommandLineRunner{

	@Autowired
  private DynamicRouteServiceImpl dynamicRouteService;

	@Autowired
  private NacosGatewayProperties nacosGatewayProperties;

  /**
   * 監(jiān)聽Nacos Server下發(fā)的動態(tài)路由配置
   * @param dataId
   * @param group
   */
  public void dynamicRouteByNacosListener (){
    try {
      ConfigService configService=NacosFactory.createConfigService(nacosGatewayProperties.getAddress());
      String content = configService.getConfig(nacosGatewayProperties.getDataId(), nacosGatewayProperties.getGroupId(), nacosGatewayProperties.getTimeout());
      System.out.println(content);
      configService.addListener(nacosGatewayProperties.getDataId(), nacosGatewayProperties.getGroupId(), new Listener() {
        @Override
        public void receiveConfigInfo(String configInfo) {
        	List<RouteDefinition> list = JsonUtils.toList(configInfo, RouteDefinition.class);
        	list.forEach(definition->{
        		dynamicRouteService.update(definition);
        	});
        }
        @Override
        public Executor getExecutor() {
          return null;
        }
      });
    } catch (NacosException e) {
      e.printStackTrace();
    }
  }

	@Override
	public void run(String... args) throws Exception {
    dynamicRouteByNacosListener();
		
	}
  
}

nacos配置下發(fā)

nacos配置

nacos:
 address: 127.0.0.1:8848
 data-id: dhap-gateway #
 group-id: AAA
 timeout: 5000

nacos屬性文件定義

新建dataID為
groupID為AAA

[
	{
	"filters": [],
	"id": "blog1",
	"order": 0,
	"predicates": [{
		"args": {
			"pattern": "/z"
		},
		"name": "Path"
	}],
	"uri": "https://blog.csdn.net/zhangchangbin123"
},
 {
	"filters": [],
	"id": "blog1",
	"order": 0,
	"predicates": [{
		"args": {
			"pattern": "/c"
		},
		"name": "Path"
	}],
	"uri": "https://blog.csdn.net/zhangchangbin123"
}
]

查看路由信息




到此這篇關(guān)于基于Nacos實現(xiàn)Spring Cloud Gateway實現(xiàn)動態(tài)路由的方法的文章就介紹到這了,更多相關(guān)Spring Cloud Gateway動態(tài)路由內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring 加載多個xml配置文件的原理分析

    Spring 加載多個xml配置文件的原理分析

    我們知道Spring一次可以加載多個Bean定義的Xml配置文件,我們可以設(shè)想下如果讓我們來做我們會怎么做?我估計會根據(jù)配置文件的順序依次讀取并加載,那再來看看Spring是如何做的?
    2021-06-06
  • SpringBoot?將配置文件掛到?jar?包外面的操作方法

    SpringBoot?將配置文件掛到?jar?包外面的操作方法

    在 SpringBoot 中,可以將配置文件放在 jar 包外面,這樣可以方便地修改配置而不需要重新打包和部署,這篇文章主要介紹了SpringBoot?如何將配置文件掛到?jar?包外面,需要的朋友可以參考下
    2023-03-03
  • IDEA2023 配置使用Docker的詳細(xì)教程

    IDEA2023 配置使用Docker的詳細(xì)教程

    這篇文章主要介紹了IDEA2023 配置使用Docker的詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • 通過JDK源碼分析關(guān)閉鉤子詳解

    通過JDK源碼分析關(guān)閉鉤子詳解

    一個簡單的關(guān)閉鉤子,程序被中斷或者正常退出時會顯示 hook shutdown!非常的優(yōu)雅,有效,巧妙。那么這篇文章就來給大家介紹關(guān)于通過JDK源碼分析關(guān)閉鉤子的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒。
    2017-11-11
  • 切換多個Java版本的解決方案

    切換多個Java版本的解決方案

    文章主要介紹了在實際開發(fā)中需要切換Java版本的原因,以及三種常見的Java版本管理工具:jenv、SDKMAN!和自定義腳本,每種工具都有其特點和適用場景,幫助開發(fā)者在不同Java版本之間進(jìn)行快速切換和管理,需要的朋友可以參考下
    2025-12-12
  • 使用mybatis進(jìn)行數(shù)據(jù)插入時返回自增id的方法及注意點

    使用mybatis進(jìn)行數(shù)據(jù)插入時返回自增id的方法及注意點

    這篇文章主要給大家介紹了關(guān)于使用mybatis進(jìn)行數(shù)據(jù)插入時返回自增id的方法及注意點,在插入一條數(shù)據(jù)之后需要返回它的自增主鍵id,因為插入的實體類數(shù)據(jù)id為空,后面的邏輯還需要這個id,需要的朋友可以參考下
    2023-09-09
  • 深入理解java自旋鎖

    深入理解java自旋鎖

    這篇文章主要介紹了如何深入理解java自旋鎖,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,下面和小編來一起學(xué)習(xí)下吧
    2019-05-05
  • java編寫冒泡排序的完整示例

    java編寫冒泡排序的完整示例

    這篇文章主要給大家介紹了關(guān)于java編寫冒泡排序的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 淺談JVM系列之JIT中的Virtual Call

    淺談JVM系列之JIT中的Virtual Call

    什么是Virtual Call?Virtual Call在java中的實現(xiàn)是怎么樣的?Virtual Call在JIT中有沒有優(yōu)化?所有的答案看完這篇文章就明白了。
    2021-06-06
  • Java通過 Socket 實現(xiàn) TCP服務(wù)端

    Java通過 Socket 實現(xiàn) TCP服務(wù)端

    這篇文章主要介紹了Java通過 Socket 實現(xiàn) TCP服務(wù)端的相關(guān)資料,需要的朋友可以參考下
    2017-05-05

最新評論

台湾省| 荆州市| 隆林| 西贡区| 利津县| 景洪市| 比如县| 昌黎县| 揭西县| 绥阳县| 城口县| 宿迁市| 华池县| 平昌县| 伊金霍洛旗| 武鸣县| 东宁县| 凤山县| 桃园市| 金溪县| 共和县| 孙吴县| 宁津县| 福清市| 奈曼旗| 彭阳县| 定兴县| 红原县| 木里| 阜阳市| 德昌县| 财经| 格尔木市| 天等县| 宽甸| 金平| 武定县| 大兴区| 苏州市| 新疆| 简阳市|