從零開始學YC-Framework之網關

語言: CN / TW / HK

一、網關是什麼?

所有微服務的入口。

二、網關的目的是什麼?

  • 1.統一入口(所有微服務的入口點);
  • 2.鑑權校驗(統一請求接口鑑權);
  • 3.動態路由(統一請求接口分發);
  • 4.降低耦合(服務獨立發展,網關映射即可)。

三、網關的優缺點有哪些?

1.優點

  • (1)避免將內部信息泄露給外部;
  • (2)為微服務添加額外的安全層;
  • (3)支持混合通信協議;
  • (4)降低構建微服務的複雜性;
  • (5)微服務模擬與虛擬化。

2.缺點

  • (1)架構上需要額外考慮更多的編排與管理;
  • (2)路由邏輯配置要進行統一的管理;
  • (3)可能引發單點故障。

四、網關現有的解決方案有哪些?

  • (1)SpringCloud Gateway;
  • (2)SpringCloud Zuul;
  • (3)Kong;
  • (4)Apache Shenyu;
  • (5)Apache Apisix;
  • (6)Nginx;
  • (7)Openrestry;
  • (8)Tyk;
  • (9)Gravitee;
  • (10)Express-Gateway;
  • (11)Gloo;
  • (12)KrakenD;
  • (13)WSO2;
  • (14)BFE。

五、YC-Framework中使用什麼技術作為網關?

YC-Framework使用SpringCloud Gateway作為網關技術。

1.我個人在應用SpringCloud Gateway作為網關遇到了哪些問題?

  • (1)網關與微服務沒有映射成功導致訪問404;
  • (2)網關因為磁盤空間不足陷入”假死”狀態導致所有服務不可用;
  • (3)網關某一個跟登錄相關的接口報錯導致系統無法使用;
  • (4)網關所涉及的中間件被黑客攻擊導致服務器崩潰,從而使得所有服務均不可用;
  • (5)網關503錯誤;
  • (6)網關504錯誤;
  • (7)網關跨域問題(SpringCloud Gateway與Nginx相關配置);
  • (8)網關請求體超出長度限制問題。

而上面這些問題都被我的方法論一一清理掉,使用過程中有任何問題均可留言給我!!!

2.有讀者問我不想使用SpringCloud Gateway作為網關是否可以?

我的回答是,當然可以,而且不用擔心鑑權會受到影響。因為鑑權早已模塊化。只要你對應的微服務引入了鑑權模塊就不需要擔心。無論採用何種技術作為網關,配置相關大同小異罷了。

3.網關在YC-Framework中的位置是什麼?

位置很重要,內外連接的關鍵點。看YC-Framework的架構圖就能知道:

4.YC-Framework的網關核心代碼有哪些?

(1)核心依賴

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

(2)核心配置

spring:
  cloud:
    gateway:
      discovery:
        locator:
          lowerCaseServiceId: true
          enabled: true
      routes:
        ## auth
        - id: yc-auth
          uri: lb://yc-auth
          predicates:
            - Path=/cert/**
          filters:
            - SwaggerHeaderFilter
            - StripPrefix=1
        ## admin
        - id: yc-admin
          uri: lb://yc-admin
          predicates:
            - Path=/admin/**
          filters:
            - SwaggerHeaderFilter
            - StripPrefix=1
        ## cms
        - id: yc-cms
          uri: lb://yc-cms
          predicates:
            - Path=/cms/**
          filters:
            - SwaggerHeaderFilter
            - StripPrefix=1
        ## file
        - id: yc-file
          uri: lb://yc-file
          predicates:
            - Path=/file/**
          filters:
            - SwaggerHeaderFilter
            - StripPrefix=1
# 打開客户端的監控
management:
  endpoints:
    sensitive: false
    web:
      exposure:
        include: '*'

(3)統一異常處理

@Order(-1)
@Configuration
public class GatewayExceptionHandler implements ErrorWebExceptionHandler {
    private static final Logger log = LoggerFactory.getLogger(GatewayExceptionHandler.class);

    @Override
    public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
        ServerHttpResponse response = exchange.getResponse();

        if (exchange.getResponse().isCommitted()) {
            return Mono.error(ex);
        }

        String msg;

        if (ex instanceof NotFoundException) {
            msg = "服務未找到";
        } else if (ex instanceof ResponseStatusException) {
            ResponseStatusException responseStatusException = (ResponseStatusException) ex;
            msg = responseStatusException.getMessage();
        } else {
            msg = "內部服務器錯誤";
        }

        log.error("[網關異常處理]請求路徑:{},異常信息:{}", exchange.getRequest().getPath(), ex.getMessage());

        response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
        response.setStatusCode(HttpStatus.OK);
        return response.writeWith(Mono.fromSupplier(() -> {
            DataBufferFactory bufferFactory = response.bufferFactory();
            return bufferFactory.wrap(JSON.toJSONBytes(RespBody.fail(msg)));
        }));
    }
}

其它相關代碼就不一一列舉了,有的與Knife4j有關,有的與Sentinel有關,具體大家可以看源碼!!!

YC-Framework官網:

https://framework.youcongtech.com/

YC-Framework Github源代碼:

https://github.com/developers-youcong/yc-framework

YC-Framework Gitee源代碼:

https://gitee.com/developers-youcong/yc-framework

以上源代碼均已開源,開源不易,如果對你有幫助,不妨給個star,鼓勵一下!!!