SpringCloud gateway 動態路由入門

API 網關
API 網關出現的原因是微服務架構的出現,不同的微服務一般會有不同的網絡地址,而外部客戶端可能需要調用多個服務的接口才能完成一個業務需求,如果讓客戶端直接與各個微服務通信,會有以下的問題:

  1. 客戶端會多次請求不同的微服務,增加了客戶端的複雜性。
  2. 存在跨域請求,在一定場景下處理相對複雜。
  3. 認證複雜,每個服務都需要獨立認證。
  4. 難以重構,隨着項目的迭代,可能需要重新劃分微服務。例如,可能將多個服務合併成一個或者將一個服務拆分成多個。如果客戶端直接與微服務通信,那麼重構將會很難實施。
  5. 某些微服務可能使用了防火牆 / 瀏覽器不友好的協議,直接訪問會有一定的困難。
    以上這些問題可以藉助 API 網關解決。API 網關是介於客戶端和服務器端之間的中間層,所有的外部請求都會先經過 API 網關這一層。也就是說,API 的實現方面更多的考慮業務邏輯,而安全、性能、監控可以交由 API 網關來做,這樣既提高業務靈活性又不缺安全性,典型的架構圖如圖所示:
    在這裏插入圖片描述

使用 API 網關後的優點如下:

  •   易於監控。可以在網關收集監控數據並將其推送到外部系統進行分析。
    
  •   易於認證。可以在網關上進行認證,然後再將請求轉發到後端的微服務,而無須在每個微服務中進行認證。
    
  •   減少了客戶端與各個微服務之間的交互次數。
    

API 網關選型
業界的情況:在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

package com.ascs.learn.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
import org.springframework.cloud.gateway.handler.predicate.PredicateDefinition;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Service;
import org.springframework.web.util.UriComponentsBuilder;
import reactor.core.publisher.Mono;

import java.net.URI;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;


@Service
public class DynamicRouteService
        implements ApplicationEventPublisherAware
{
    @Autowired
    private RouteDefinitionWriter routeDefinitionWriter;
    private ApplicationEventPublisher publisher;
    public String save(String id,String path,String pattern,String pathPattern,String url) {
        RouteDefinition definition = new RouteDefinition();
        PredicateDefinition predicate = new PredicateDefinition();
        Map<String, String> predicateParams = new HashMap<>(8);
        definition.setId(id);
        predicate.setName("Path");

        predicateParams.put("pattern", pattern);
        predicateParams.put("pathPattern", pathPattern);
        predicate.setArgs(predicateParams);
        definition.setPredicates(Arrays.asList(predicate));
        URI uri = UriComponentsBuilder.fromHttpUrl(url).build().toUri();
        definition.setUri(uri);

        routeDefinitionWriter.save(Mono.just(definition)).subscribe();
        this.publisher.publishEvent(new RefreshRoutesEvent(this));
        return "success";
    }


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

    }
}



測試:
打開postman,輸入地址: http://localhost:8080/addRoute
然後選擇POST方式,添加必要的參數 如下圖所示:

然後點擊Send
在這裏插入圖片描述
打開瀏覽器 http://localhost:8080/house
就可以看到
在這裏插入圖片描述

說明動態添加的路由測試成功.

源代碼下載: https://github.com/HappyFreeAngel/springcloud-gateway-dynamic-route.git

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章