微服務(wù)網(wǎng)關(guān)spring cloud gateway

文檔:
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.0.2.RELEASE/single/spring-cloud-gateway.html

基本概念

Route

路由器=ID+URI+Predicates+Filters
路由器決定如何處理請求, 當一個請求到來的時候, 跟據(jù)匹配條件找到路由器, 再由路由器的過濾器來處理請求.

Predicate

匹配器, 是一個java8的函數(shù),輸入是ServerWebChange, 里面包含了ServerHttpRequest, 開發(fā)者跟據(jù)輸入決定是否匹配路由.

Filter

過濾器, 處理請求, 可以修改請求前的數(shù)據(jù)和返回后的數(shù)據(jù), 類似于spring webmvc的web過濾器.

How it works

image.png

spring cloud gateway默認有很多全局過濾器和普通過濾器, 可以通過配置文件配置發(fā)揮強大功效.

集成

spring cloud gateway 基于spring webflux, 而不是spring webmvc, 這一點要非常注意,如果classpath包含了spring webmvc那么啟動后,網(wǎng)關(guān)路由不會生效.

dependencies {
  compile('org.springframework.cloud:spring-cloud-starter')
  compile('org.springframework.cloud:spring-cloud-starter-gateway')
  compile('org.springframework.boot:spring-boot-starter-webflux')
}
configurations {
    all*.exclude group: 'org.springframework','spring-webmvc'
}

啟動成功后,應(yīng)該輸出:
INFO org.springframework.boot.web.embedded.netty.NettyWebServer - Netty started on port(s): ...

網(wǎng)關(guān)功能

微服務(wù)網(wǎng)關(guān)最重要的幾個功能分別是路由, 負載均衡,認證授權(quán), 跨域配置, 日志, 失敗重試, 下來一一來配置.

動態(tài)路由

通常微服務(wù)都是注冊中心, 服務(wù)都是自動發(fā)現(xiàn)的,spring cloud gateway可以基于注冊小心動態(tài)配置路由, 轉(zhuǎn)發(fā)的規(guī)則是:
/service_id/path->轉(zhuǎn)發(fā)到service_id對應(yīng)的服務(wù)
只需要添加配置:

spring.cloud.gateway.discovery.locator.enabled=true
spring.cloud.gateway.discovery.locator.lowerCaseServiceId=true

就能動態(tài)路由.

負載均衡

  以lb://開頭的請求, 會被全局過濾器RetryLoadBalancerClientFilter攔截并進行負載均衡處理, 所有的動態(tài)路由都會自動負載均衡.

認證授權(quán)

有一個專門用來做認證授權(quán)的服務(wù), 網(wǎng)關(guān)需要做的就是自定義一個全局過濾器, 將每一個請求發(fā)到授權(quán)服務(wù)進行認證授權(quán).

@Component
public class AuthFilter implements GlobalFilter, Ordered {
    @Override
    public int getOrder() {
        return Constants.PRE_FILTER_ORDER_AUTH;
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        try {
            //TODO 調(diào)用授權(quán)服務(wù)進行認證和授權(quán)
            return chain.filter(exchange.mutate().request(request).build());
        } catch (Exception e) {
            log.error("auth failed: " + e.getMessage());
            return exchange.getResponse()
                    .writeWith(Flux.just(exchange.getResponse().bufferFactory().wrap("授權(quán)失敗".getBytes())));
        }
    }

跨域設(shè)置

有時候前端需要支持跨域訪問, 這里簡單配置允許所有域名訪問.

spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-origins=*
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-methods=*
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-headers=*
spring.cloud.gateway.globalcors.cors-configurations.[/**].allow-credentials=true

日志

日志功能同樣是自定義全局過濾器實現(xiàn), 在請求進入時打印輸入日志,返回時打印輸出日志, 唯一的問題是在打印請求或返回的body時要處理下,一般情況下請求和響應(yīng)的body都不能多次讀, 需要自定義裝飾器封裝實現(xiàn)多次讀的功能.

失敗重試

這個沒有全局過濾器, 需要自己實現(xiàn).

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容