需求
我們使用spring cloud gateway搭建一個最簡單的微服務通用訪問網關(General Purpose Server-side API gateway)。
需求整理如下:
- 所有資源服務通過consul agent註冊到consul server,springcloud gateway直接根據service name做應用上下文轉發。
- 安全認證中心在gateway後面,springcloud gateway直接將token傳遞到resource server,由resource server自行做認證。
部署邏輯圖如下:
配置
配置pom.xml
新建springboot工程,引入以下依賴:
<!-- spring cloud gateway 只需要引入這個包夠了 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- 我們要使用consul的服務發現 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!-- 我們要使用ribbon的做負載均衡 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
配置application.properties
server.port=80
spring.application.name=gateway
#開啓基於服務發現的路由轉發規則
spring.cloud.gateway.discovery.locator.enabled=true
#配置服務註冊與發現
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.heartbeat.enabled=true
#開啓應用監控治理端點
management.endpoint.gateway.enabled=true
#暴露端點
management.endpoints.web.exposure.include=gateway,info,health,loggers,mappings
至此我們就可以完整的使用spring cloud gateway了。
開發運維工具
網關服務作爲應用的關鍵入口,我們希望它儘量穩定,我們後端服務變更或者系統配置變更時能夠不用重啓就可以獲知變化。spring cloud gateway通過Actuator提供了響應的能力。
actuator
Actuator本身提供了很多信息查詢服務,比如/info, /health, /loggers,/mappings等。
查看所有地址映射
“/actuator/mappings”提供了查看所有web 端點的能力,在我們不清楚網關代理了哪些接口時,先看看這個。
每個mapping有如下內容:
gateway actuator
spring cloud gateway通過GatewayControllerEndpoint增加了網關特有的端點。
ID | HTTP Method | Description |
---|---|---|
globalfilters |
GET | 展示所有全局過濾器 |
routefilters |
GET | 展示GatewayFilter factories |
refresh |
POST | 清理Route緩存 |
routes |
GET | 展示所有路由規則定義 |
routes/{id} |
GET | 展示特定Route的定義 |
routes/{id} |
POST | 添加一個新的Route定義 |
routes/{id} |
DELETE | 刪除一個路由定義 |
調用/actuator/gateway/globalfilters我們看到:
{
"org.springframework.cloud.gateway.filter.GatewayMetricsFilter@6221b13b": 0,
"org.springframework.cloud.gateway.filter.WebsocketRoutingFilter@e91af20": 2147483646,
"org.springframework.cloud.gateway.filter.NettyWriteResponseFilter@8c12524": -1,
"org.springframework.cloud.gateway.filter.NettyRoutingFilter@72557746": 2147483647,
"org.springframework.cloud.gateway.filter.ForwardRoutingFilter@11f23203": 2147483647,
"org.springframework.cloud.gateway.filter.ForwardPathFilter@101bdd1c": 0,
"org.springframework.cloud.gateway.filter.RouteToRequestUrlFilter@4844930a": 10000,
"org.springframework.cloud.gateway.filter.AdaptCachedBodyGlobalFilter@10a18e3e": -2147482648,
"org.springframework.cloud.gateway.filter.RemoveCachedBodyFilter@f723cdb": -2147483648,
"org.springframework.cloud.gateway.filter.LoadBalancerClientFilter@118acf70": 10100
}
調用/actuator/gateway/routefilters我們看到:
{
"[RequestHeaderToRequestUriGatewayFilterFactory@16bd7ae1 configClass = AbstractGatewayFilterFactory.NameConfig]": null,
"[ModifyRequestBodyGatewayFilterFactory@7a31ca20 configClass = ModifyRequestBodyGatewayFilterFactory.Config]": null,
"[PrefixPathGatewayFilterFactory@de579ff configClass = PrefixPathGatewayFilterFactory.Config]": null,
"[SetPathGatewayFilterFactory@4d518c66 configClass = SetPathGatewayFilterFactory.Config]": null,
"[StripPrefixGatewayFilterFactory@797fcf9 configClass = StripPrefixGatewayFilterFactory.Config]": null,
"[RetryGatewayFilterFactory@26be9a6 configClass = RetryGatewayFilterFactory.RetryConfig]": null,
"[SetStatusGatewayFilterFactory@5b0dbfb configClass = SetStatusGatewayFilterFactory.Config]": null,
"[SaveSessionGatewayFilterFactory@4b9dbf07 configClass = Object]": null,
"[RemoveResponseHeaderGatewayFilterFactory@46394f65 configClass = AbstractGatewayFilterFactory.NameConfig]": null,
"[RedirectToGatewayFilterFactory@2fd39436 configClass = RedirectToGatewayFilterFactory.Config]": null,
"[SecureHeadersGatewayFilterFactory@411fa0ce configClass = Object]": null,
"[AddRequestParameterGatewayFilterFactory@689faf79 configClass = AbstractNameValueGatewayFilterFactory.NameValueConfig]": null,
"[ModifyResponseBodyGatewayFilterFactory@21edd891 configClass = ModifyResponseBodyGatewayFilterFactory.Config]": null,
"[AddResponseHeaderGatewayFilterFactory@582e9152 configClass = AbstractNameValueGatewayFilterFactory.NameValueConfig]": null,
"[DedupeResponseHeaderGatewayFilterFactory@349c4d1c configClass = DedupeResponseHeaderGatewayFilterFactory.Config]": null,
"[AddRequestHeaderGatewayFilterFactory@357f6391 configClass = AbstractNameValueGatewayFilterFactory.NameValueConfig]": null,
"[RemoveRequestHeaderGatewayFilterFactory@60b5e80d configClass = AbstractGatewayFilterFactory.NameConfig]": null,
"[SetResponseHeaderGatewayFilterFactory@78e68401 configClass = AbstractNameValueGatewayFilterFactory.NameValueConfig]": null,
"[RewritePathGatewayFilterFactory@31aab981 configClass = RewritePathGatewayFilterFactory.Config]": null,
"[PreserveHostHeaderGatewayFilterFactory@7971c2a9 configClass = Object]": null,
"[SetRequestHeaderGatewayFilterFactory@251d7fdd configClass = AbstractNameValueGatewayFilterFactory.NameValueConfig]": null,
"[RewriteResponseHeaderGatewayFilterFactory@391515c7 configClass = RewriteResponseHeaderGatewayFilterFactory.Config]": null,
"[RequestSizeGatewayFilterFactory@15d114ce configClass = RequestSizeGatewayFilterFactory.RequestSizeConfig]": null
}
在生產實時調整日誌級別
生產上我們通常會禁止debug日誌,但有時需要網關上分析定位問題。這時我們可以打開訪問日誌。
以下日誌對我們分析問題有幫助:
org.springframework.cloud.gateway //輸出路由轉發規則
org.springframework.http.server.reactive
org.springframework.web.reactive
org.springframework.boot.autoconfigure.web
reactor.netty //輸出網絡請求響應記錄
redisratelimiter
可以通過/actuator/loggers地址獲得所有日誌名稱和日誌級別,然後通過以下http指令調整日誌級別:
$ curl 'http://localhost:8080/actuator/loggers/reactor.netty' -i -X POST \
-H 'Content-Type: application/json' \
-d '{"configuredLevel":"debug"}'
打開後一定要記得關閉:
$ curl 'http://localhost:8080/actuator/loggers/reactor.netty' -i -X POST \
-H 'Content-Type: application/json' \
-d '{}'
從Greenwich SR3開始可以針對Netty HttpClient和HttpServer啓用wiretap。通過以下配置,然後將將reator .netty日誌級別設置爲DEBUG或TRACE相結合時,將啓用對通過網絡發送和接收的頭和主體等信息的日誌記錄。
spring.cloud.gateway.httpserver.wiretap=true
spring.cloud.gateway.httpclient.wiretap=true
參考
Spring boot 2.0 Actuator 的健康檢查:https://www.jianshu.com/p/1aadc4c85f51
Spring Cloud Gateway官方文檔:https://cloud.spring.io/spring-cloud-gateway/reference/html/
Spring Cloud Gateway入門: http://blueskykong.com/2018/03/10/cloud-Gateway-1/