spring cloud gateway系列教程4—其他配置

spring cloud gateway系列教程目錄

  1. spring cloud gateway系列教程1—Route Predicate
  2. spring cloud gateway系列教程2——GatewayFilter_上篇
  3. spring cloud gateway系列教程2——GatewayFilter_下篇
  4. spring cloud gateway系列教程3—Global Filters
  5. spring cloud gateway系列教程4—其他配置

1. TLS / SSL

Spring Cloud Gateway使用HTTPS搁嗓,是和普通的Spring boot服務(wù)配置是一樣的腺逛,比如:

application.yml.

server:
  ssl:
    enabled: true
    key-alias: scg
    key-store-password: scg1234
    key-store: classpath:scg-keystore.p12
    key-store-type: PKCS12

Spring Cloud Gateway都可以路由轉(zhuǎn)給給http和HTTPS的下游后端服務(wù)棍矛,如果是路由去HTTPS后端服務(wù)够委,gateway像下面一樣配置信任所有下游服務(wù):

application.yml.

spring:
  cloud:
    gateway:
      httpclient:
        ssl:
          useInsecureTrustManager: true

當(dāng)然這種配置怖现,線上生成環(huán)境還是不太適合的,所以gateway可以配置自己的信任的證書(shū)列表:

application.yml.

spring:
  cloud:
    gateway:
      httpclient:
        ssl:
          trustedX509Certificates:
          - cert1.pem
          - cert2.pem

Spring Cloud Gateway如果沒(méi)有配置信任證書(shū)列表吊输,則會(huì)拿系統(tǒng)默認(rèn)的證書(shū)庫(kù)(可以通過(guò)system property的javax.net.ssl.trustStore屬性來(lái)修改系統(tǒng)默認(rèn)證書(shū)庫(kù))季蚂。

TLS Handshake

當(dāng)是用HTTPS來(lái)通訊時(shí)扭屁,http客戶(hù)端就需要初始化TLS握手連接了料滥,所以就需要配置握手連接時(shí)的超時(shí)配置:

application.yml.

spring:
  cloud:
    gateway:
      httpclient:
        ssl:
          handshake-timeout-millis: 10000
          close-notify-flush-timeout-millis: 3000
          close-notify-read-timeout-millis: 0

2. Configuration

Spring Cloud Gateway是通過(guò)一系列的RouteDefinitionLocator接口配置的幔欧,接口如下:

RouteDefinitionLocator.java.

public interface RouteDefinitionLocator {
    Flux<RouteDefinition> getRouteDefinitions();
}

默認(rèn)情況下,PropertiesRouteDefinitionLocator會(huì)通過(guò)Spring Boot的@ConfigurationProperties機(jī)制來(lái)加載路由配置雁社,比如下面的例子(一個(gè)使用了完整的配置霉撵,一個(gè)使用了快捷配置徒坡,前幾章也大量的用了這些配置):

application.yml.

spring:
  cloud:
    gateway:
      routes:
      - id: setstatus_route
        uri: http://example.org
        filters:
        - name: SetStatus
          args:
            status: 401
      - id: setstatusshortcut_route
        uri: http://www.google.com
        filters:
        - SetStatus=401

通常情況下瘤缩,properties的配置就已經(jīng)夠用的了喇完,但也有一些人的需求是從外部源來(lái)加載配置文件剥啤,比如數(shù)據(jù)庫(kù)等锦溪,所以官方也承諾未來(lái)的版本會(huì)基于Spring Data Repositories實(shí)現(xiàn)Redis, MongoDB和Cassandra版本的RouteDefinitionLocator

2.1 Fluent Java Routes API

除了上面的配置文件配置外刻诊,也可以通過(guò)RouteLocatorBuilder的流式API來(lái)進(jìn)行java實(shí)現(xiàn)配置。

GatewaySampleApplication.java.

// static imports from GatewayFilters and RoutePredicates
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder, ThrottleGatewayFilterFactory throttle) {
    return builder.routes()
            .route(r -> r.host("**.abc.org").and().path("/image/png")
                .filters(f ->
                        f.addResponseHeader("X-TestHeader", "foobar"))
                .uri("http://httpbin.org:80")
            )
            .route(r -> r.path("/image/webp")
                .filters(f ->
                        f.addResponseHeader("X-AnotherHeader", "baz"))
                .uri("http://httpbin.org:80")
            )
            .route(r -> r.order(-1)
                .host("**.throttle.org").and().path("/get")
                .filters(f -> f.filter(throttle.apply(1,
                        1,
                        10,
                        TimeUnit.SECONDS)))
                .uri("http://httpbin.org:80")
            )
            .build();
}

這種用法就可以通過(guò)實(shí)行Predicate<ServerWebExchange>接口來(lái)定義更復(fù)雜的匹配規(guī)則亿昏,也可以用and()or()negate()來(lái)組合不同的匹配規(guī)則彤断,靈活性會(huì)更大一點(diǎn)。

2.2 DiscoveryClient Route Definition Locator

通過(guò)服務(wù)發(fā)現(xiàn)客戶(hù)端DiscoveryClient供炼,gateway可以基于注冊(cè)了的服務(wù)自動(dòng)創(chuàng)建路由袋哼。
只需要配置spring.cloud.gateway.discovery.locator.enabled=true,以及引入DiscoveryClient的maven依賴(lài)即可弟翘,如:Netflix Eureka, Consul or Zookeeper。

Configuring Predicates and Filters For DiscoveryClient Routes

默認(rèn)情況下gateway中的GatewayDiscoveryClientAutoConfiguration以及定義了一個(gè)predicate和filter的了睛琳。
默認(rèn)的predicate是配置了/serviceId/**路徑的path predicate,當(dāng)然serviceIdDiscoveryClient里面的服務(wù)id。
默認(rèn)的filter是配置了匹配參數(shù)/serviceId/(?<remaining>.*)和替換參數(shù)/${remaining}的rewrite path filter愿待,目的是將serviceId從path中去除掉仍侥,因?yàn)橄掠问遣恍枰摹?/p>

你也可以自定義DiscoveryClient路由的predicate和filter患蹂,只需要設(shè)置spring.cloud.gateway.discovery.locator.predicates[x]spring.cloud.gateway.discovery.locator.filters[y]即可,如下:
application.properties.

spring.cloud.gateway.discovery.locator.predicates[0].name: Path
spring.cloud.gateway.discovery.locator.predicates[0].args[pattern]: "'/'+serviceId+'/**'"
spring.cloud.gateway.discovery.locator.predicates[1].name: Host
spring.cloud.gateway.discovery.locator.predicates[1].args[pattern]: "'**.foo.com'"
spring.cloud.gateway.discovery.locator.filters[0].name: Hystrix
spring.cloud.gateway.discovery.locator.filters[0].args[name]: serviceId
spring.cloud.gateway.discovery.locator.filters[1].name: RewritePath
spring.cloud.gateway.discovery.locator.filters[1].args[regexp]: "'/' + serviceId + '/(?<remaining>.*)'"
spring.cloud.gateway.discovery.locator.filters[1].args[replacement]: "'/${remaining}'"

3. Reactor Netty Access Logs

spring cloud gateway是沒(méi)有打印access log的,但是底層的Reactor Netty是有的,在應(yīng)用啟動(dòng)命名中增加設(shè)置-Dreactor.netty.http.server.accessLogEnabled=true來(lái)開(kāi)啟找都。
注:因?yàn)镽eactor Netty不是基于spring boot的,所以它并不會(huì)去spring boot的配置中獲取上面的配置嗡贺,所以只能在Java System Property中獲取诫睬。

可以在常用的日志系統(tǒng)中配置日志的打印文件和格式续徽,如logback的配置:

logback.xml.

    <appender name="accessLog" class="ch.qos.logback.core.FileAppender">
        <file>access_log.log</file>
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder>
    </appender>
    <appender name="async" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="accessLog" />
    </appender>

    <logger name="reactor.netty.http.server.AccessLog" level="INFO" additivity="false">
        <appender-ref ref="async"/>
    </logger>

4. CORS Configuration

gateway是支持CORS的配置床绪,可以通過(guò)不同的URL規(guī)則匹配不同的CORS策略:

application.yml.

spring:
  cloud:
    gateway:
      globalcors:
        corsConfigurations:
          '[/**]':
            allowedOrigins: "http://docs.spring.io"
            allowedMethods:
            - GET

有不熟悉CORS的膀斋,可以看一下這篇介紹糊识。

5. Actuator API

Spring Cloud Gateway也可以配置actuator來(lái)監(jiān)控和操作一些功能點(diǎn),增加下面的配置即可:

application.properties.

management.endpoint.gateway.enabled=true # default value
management.endpoints.web.exposure.include=gateway

5.1 查看filter信息

5.1.1 Global Filters

使用GET請(qǐng)求gateway地址/actuator/gateway/globalfilters,就可以獲取類(lèi)似于下面的返回:

{
  "org.springframework.cloud.gateway.filter.LoadBalancerClientFilter@77856cc5": 10100,
  "org.springframework.cloud.gateway.filter.RouteToRequestUrlFilter@4f6fd101": 10000,
  "org.springframework.cloud.gateway.filter.NettyWriteResponseFilter@32d22650": -1,
  "org.springframework.cloud.gateway.filter.ForwardRoutingFilter@106459d9": 2147483647,
  "org.springframework.cloud.gateway.filter.NettyRoutingFilter@1fbd5e0": 2147483647,
  "org.springframework.cloud.gateway.filter.ForwardPathFilter@33a71d23": 0,
  "org.springframework.cloud.gateway.filter.AdaptCachedBodyGlobalFilter@135064ea": 2147483637,
  "org.springframework.cloud.gateway.filter.WebsocketRoutingFilter@23c05889": 2147483646
}

返回信息包含了gateway的使用中的global filters實(shí)例,包含了實(shí)例的toString()order的keyvalue信息。

5.1.2 Route Filters

使用GET請(qǐng)求gateway地址/actuator/gateway/routefilters祭隔,就可以獲取類(lèi)似于下面的返回:

{
  "[AddRequestHeaderGatewayFilterFactory@570ed9c configClass = AbstractNameValueGatewayFilterFactory.NameValueConfig]": null,
  "[SecureHeadersGatewayFilterFactory@fceab5d configClass = Object]": null,
  "[SaveSessionGatewayFilterFactory@4449b273 configClass = Object]": null
}

返回信息里面包含了gateway中可以提供使用的GatewayFilter factories 詳細(xì)信息屯仗,其中展示的是GatewayFilterFactory的實(shí)例toString()打印桩撮,及配置類(lèi)。后面的null是某些GatewayFilter factory實(shí)現(xiàn)問(wèn)題融师,本來(lái)是用來(lái)展示order的,但是GatewayFilter factory沒(méi)有實(shí)現(xiàn)后控,就返回null了。

5.2 路由緩存刷新

使用POST請(qǐng)求gateway地址/actuator/gateway/refresh,并返回http狀態(tài)碼為200,標(biāo)識(shí)刷新路由緩存成功。

5.3 查看路由定義信息

使用GET請(qǐng)求gateway地址/actuator/gateway/routes轻猖,獲取類(lèi)似下面的返回:

[{
  "route_id": "first_route",
  "route_object": {
    "predicate": "org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory$$Lambda$432/1736826640@1e9d7e7d",
    "filters": [
      "OrderedGatewayFilter{delegate=org.springframework.cloud.gateway.filter.factory.PreserveHostHeaderGatewayFilterFactory$$Lambda$436/674480275@6631ef72, order=0}"
    ]
  },
  "order": 0
},
{
  "route_id": "second_route",
  "route_object": {
    "predicate": "org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory$$Lambda$432/1736826640@cd8d298",
    "filters": []
  },
  "order": 0
}]

上面對(duì)象的定義如下表:

key value類(lèi)型 value描述
route_id String 路由id.
route_object.predicate Object Route Predicate
route_object.filters Array GatewayFilter
order Number 路由順序
5.3.1 查看單個(gè)路由信息

如果是想只獲取單個(gè)路由信息,則使用GET請(qǐng)求地址/actuator/gateway/routes/{id}即可。

5.3.2 創(chuàng)建和刪除路由

創(chuàng)建路由,使用POST請(qǐng)求,并附帶類(lèi)似下面的json body,到/gateway/routes/{id_route_to_create}即可婶肩。

{
  "route_id": "second_route",
  "route_object": {
    "predicate": "org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory$$Lambda$432/1736826640@cd8d298",
    "filters": []
  },
  "order": 0
}

刪除路由,使用DELETE請(qǐng)求地址/gateway/routes/{id_route_to_delete}即可。

5.4 Actuator API匯總

ID HTTP Method Description
globalfilters GET 展示global filters信息
routefilters GET 展示GatewayFilter factories信息
refresh POST 刷新路由緩存
routes GET 展示路由定義信息
routes/{id} GET 展示單個(gè)路由信息
routes/{id} POST 添加新的路由
routes/{id} DELETE 移除路由

開(kāi)發(fā)指南

自定義GatewayFilter Factories

如果想自定義實(shí)現(xiàn)GatewayFilterFactory跷跪,可以繼承AbstractGatewayFilterFactory抽象類(lèi)。

比如如果想請(qǐng)求前做一些事情,可以類(lèi)似于下面的實(shí)現(xiàn):

**PreGatewayFilterFactory.java. **

public class PreGatewayFilterFactory extends AbstractGatewayFilterFactory<PreGatewayFilterFactory.Config> {

    public PreGatewayFilterFactory() {
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(Config config) {
        // 從config對(duì)象中獲取配置
        return (exchange, chain) -> {
            // 在這里做請(qǐng)求前的事情
            ServerHttpRequest.Builder builder = exchange.getRequest().mutate();
            //重新構(gòu)造新的request
            return chain.filter(exchange.mutate().request(request).build());
        };
    }

    public static class Config {
        // 設(shè)置配置
    }

}

請(qǐng)求后做的是事情又厉,可以如下實(shí)現(xiàn):

PostGatewayFilterFactory.java.

public class PostGatewayFilterFactory extends AbstractGatewayFilterFactory<PostGatewayFilterFactory.Config> {

    public PostGatewayFilterFactory() {
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(Config config) {
        // 從config對(duì)象中獲取配置
        return (exchange, chain) -> {
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                ServerHttpResponse response = exchange.getResponse();
                // 在這里做請(qǐng)求后的操作實(shí)現(xiàn)
            }));
        };
    }

    public static class Config {
        // 設(shè)置配置
    }

}

以上就是spring cloud gateway的其他配置使用講解煌妈,如果想查看其他spring cloud gateway的案例和使用汰蜘,可以點(diǎn)擊查看

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末色难,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子涯贞,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毫深,死亡現(xiàn)場(chǎng)離奇詭異闸迷,居然都是意外死亡逮走,警方通過(guò)查閱死者的電腦和手機(jī)盾舌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)棚贾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)窖维,“玉大人榆综,你說(shuō)我怎么就攤上這事≈罚” “怎么了鼻疮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)琳轿。 經(jīng)常有香客問(wèn)我判沟,道長(zhǎng),這世上最難降的妖魔是什么崭篡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任挪哄,我火速辦了婚禮,結(jié)果婚禮上琉闪,老公的妹妹穿的比我還像新娘迹炼。我一直安慰自己,他們只是感情好颠毙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布斯入。 她就那樣靜靜地躺著,像睡著了一般蛀蜜。 火紅的嫁衣襯著肌膚如雪刻两。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,245評(píng)論 1 299
  • 那天滴某,我揣著相機(jī)與錄音磅摹,去河邊找鬼。 笑死壮池,一個(gè)胖子當(dāng)著我的面吹牛偏瓤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播椰憋,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼厅克,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了橙依?” 一聲冷哼從身側(cè)響起证舟,我...
    開(kāi)封第一講書(shū)人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎窗骑,沒(méi)想到半個(gè)月后女责,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡创译,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年抵知,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡刷喜,死狀恐怖残制,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掖疮,我是刑警寧澤初茶,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站浊闪,受9級(jí)特大地震影響恼布,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜搁宾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一折汞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧猛铅,春花似錦字支、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至栗菜,卻和暖如春欠雌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疙筹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工富俄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人而咆。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓霍比,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親暴备。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悠瞬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容