8.1 網(wǎng)關(guān)作用介紹
網(wǎng)關(guān)功能:
- 身份認(rèn)證和權(quán)限校驗(yàn)
- 服務(wù)路由、負(fù)載均衡
- 請求限流
網(wǎng)關(guān)的技術(shù)實(shí)現(xiàn)
在SpringCloud中網(wǎng)關(guān)的實(shí)現(xiàn)包括兩種:
- gateway
- zuul
Zuul是基于Servlet的實(shí)現(xiàn),屬于阻塞式編程。而SpringCloudGateway則是基于Spring5中提供的WebFlux,屬于響應(yīng)式編程的實(shí)現(xiàn),具備更好的性能。
總結(jié)
網(wǎng)關(guān)的作用
- 對用戶請求做身份認(rèn)證、權(quán)限驗(yàn)證
- 將用戶請求路由到微服務(wù),并實(shí)現(xiàn)負(fù)載均衡
- 對用戶請求做限流
8.2 搭建網(wǎng)關(guān)服務(wù)
搭建網(wǎng)關(guān)服務(wù)的步驟:
- 創(chuàng)建新的module,引入SpringCloudGateway的依賴和nacos的發(fā)現(xiàn)服務(wù)依賴
<!--網(wǎng)關(guān)依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos服務(wù)發(fā)現(xiàn)依賴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 編寫路由配置及nacos地址
server:
port: 10010 # 網(wǎng)關(guān)端口
spring:
application:
name: gateway # 服務(wù)名稱
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
gateway:
routes: # 網(wǎng)關(guān)路由配置
- id: user-service # 路由id,自定義,只要唯一即可
# uri: http://127.0.0.1:8081 #路由的目標(biāo)地址,http就是固定地址
uri: lb://userservice # 路由的目標(biāo)地址 lb就是負(fù)載均衡,后面跟服務(wù)名稱
predicates: # 路由斷言,也就是判斷請求是否符合路由規(guī)則的條件
- Path=/user/** # 這個是按照路徑匹配,只要以/user/開頭就符合要求
-id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
“-”代表集合,會有很多個
配置完之后,訪問localhost:10010/order/…就可以訪問到訂單服務(wù) 換成user就可以訪問到用戶服務(wù)
路由過程:
總結(jié)
網(wǎng)關(guān)搭建步驟:
- 創(chuàng)建項目,引入nacos服務(wù)發(fā)現(xiàn)和gateway依賴
- 配置application.yaml,包括服務(wù)基本信息、nacos地址、路由
路由配置包括:
- 路由id:路由的唯一標(biāo)示
- 路由目標(biāo)(uri):路由的目標(biāo)地址,http代表固定地址,lb代表根據(jù)服務(wù)名負(fù)載均衡
- 路由斷言(predicates):判斷請求是否符合要求,符合則轉(zhuǎn)發(fā)到路由目的地
- 路由過濾器(filter):對請求或響應(yīng)做處理
8.3 路由斷言工廠 Route Predicate Factory
- 我們在配置文件中寫的斷言規(guī)則只是字符串,這些字符串會被Predicate Factory讀取并處理,轉(zhuǎn)變?yōu)槁酚膳袛嗟臈l件
- 例如Path=/user/**是按照路徑匹配,這個規(guī)則是由org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory類來處理的
- 像這樣的斷言工廠在springCloudGateway還有十幾個
Spring提供了11種基本的Predicate工廠:
可以在官方文檔查看使用方式
總結(jié)
PredicateFactory的作用是什么?
讀取用戶定義的斷言條件,對請求做出判斷
Path=/user/**是什么含義?
路徑是以/user開頭的就認(rèn)為是符合的
8.4 路由的過濾器配置
路由過濾器 GatewayFilter
GatewayFilter是網(wǎng)關(guān)中提供的一種過濾器,可以對進(jìn)入網(wǎng)關(guān)的請求和微服務(wù)返回的響應(yīng)做處理:
過濾器工廠GatewayFilterFactory
Spring提供了31種不同的路由過濾器工廠。例如:
案例:給所有進(jìn)入userservice的請求添加一個請求頭
給所有進(jìn)入userservice的請求添加一個請求頭:Truth=itcast is freaking awesome!
實(shí)現(xiàn)方式:在gateway中修改application.yml文件,給userservice的路由添加過濾器:
spring:
cloud:
gateway:
routes: # 網(wǎng)關(guān)路由配置
- id: user-service
uri: lb://userservice
predicates:
- Path=/user/**
filters: #過濾器
-AddRequstHeader=Truth, Itcast is freaking awesome! #添加請求頭
,逗號前代表key,逗號后代表value
如何查看添加請求頭是否生效:在userservice的接口上添加參數(shù),調(diào)用接口查看日志
默認(rèn)過濾器:
如果要對所有的路由都生效,則可以將過濾器工廠寫到default下。格式如下:
總結(jié)
過濾器的作用是什么?
- 對路由的請求或響應(yīng)做加工處理,比如添加請求頭
- 配置在路由下的過濾器只對當(dāng)前路由的請求生效
defaultFilters的作用是什么?
對所有路由都生效的過濾器
8.5 ### 全局過濾器 GlobalFilter
全局過濾器的作用也是處理一切進(jìn)入網(wǎng)關(guān)的請求和微服務(wù)響應(yīng),與GatewayFilter一樣。
區(qū)別在于GatewayFilter通過配置定義,處理邏輯是固定的。而GlobalFilter的邏輯需要自己寫代碼實(shí)現(xiàn)。
定義方式是實(shí)現(xiàn)GlobalFilter接口
public interface GlobalFiter {
/**
* 處理當(dāng)前請求,有必要的話通過{@link GatewayFilterChain}將請求交給下一個過濾器處理
exchange 請求上下文,里面可以獲取Request、Response等信息
chain 用來把請求委托給下一個過濾器
{@code Momo<Void>} 返回標(biāo)示當(dāng)前過濾器業(yè)務(wù)結(jié)束
**/
Momo<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}
案例:定義全局過濾器,攔截并判斷用戶身份
需求:定義全局過濾器,攔截請求,判斷請求的參數(shù)是否滿足下面條件:
- 參數(shù)中是否有authorization
- authorization參數(shù)值是否為admin
如果同時滿足則放行,否則攔截
實(shí)現(xiàn):
@Order(-1) // 實(shí)現(xiàn)順序方法二
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered{
@Override
Momo<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain){
// 1. 獲取請求參數(shù)
ServerHttpRequest request = exchange.getRequest();
MultiValueMap<String, String> params = request.getQueryParams();
// 2. 獲取參數(shù)中的 authorization參數(shù)
Spring auth = params.getFirst("authorization");
// 3. 判斷參數(shù)值是否等于admin
if("admin".equals(auth)){
// 4. 是,放行
return chain.filter(exchange);
}
// 5. 否,攔截
// 5.1 設(shè)置狀態(tài)碼
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
// 5.2 攔截請求
return exchange.getResponse().setComplete();
}
// 添加順序方法一:Ordered 實(shí)現(xiàn)ordered
public int getOrder(){
return -1; // -1優(yōu)先級高 優(yōu)先級從小到大,數(shù)字越小越優(yōu)先
}
}
總結(jié):
全局過濾器的作用是什么?
對所有路由都生效的過濾器,并且可以自定義處理邏輯
實(shí)現(xiàn)全局過濾器的步驟?
- 實(shí)現(xiàn)GlobalFilter接口
- 添加@Order注解或?qū)崿F(xiàn)Orderd接口
- 編寫處理邏輯
8.6 過濾器鏈執(zhí)行順序
請求進(jìn)入網(wǎng)關(guān)會碰到三類過濾器:當(dāng)前路由的過濾器、DefaultFilter、GlobalFilter
請求路由后,會將當(dāng)前路由過濾器和DefaultFilter、GlobalFilter,合并到一個過濾器鏈(集合中),排序后依次執(zhí)行每個過濾器
- 每一個過濾器都必須指定一個int類型的order值,order值越小,優(yōu)先級越高,執(zhí)行順序越靠前。
- GlobalFilter通過實(shí)現(xiàn)Ordered接口,或者添加@Order注解來指定order值,由我們自己指定
- 路由過濾器和defaultFilter的order由Spring指定,默認(rèn)是按照聲明順序從1遞增
- 當(dāng)過濾器的order值一樣時,會按照defaultFilter>路由過濾器>GlobalFilter的順序執(zhí)行。
可以參考下面幾個類的源碼來查看:
org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#getFilters()方法是先加載defaultFilters,然后再加載某個route的filters,然后合并。
org.springframework.cloud.gateway.handler.FilteringWebHandler#handle()方法會加載全局過濾器,與前面的過濾器合并后根據(jù)order排序,組織過濾器鏈
總結(jié)
路由過濾器、defaultFilter、全局過濾器的執(zhí)行順序?
order值越小,優(yōu)先級越高
當(dāng)order值一樣時,順序是defaultFilter最先,然后是局部的路由過濾器,最后是全局過濾器
8.7 網(wǎng)關(guān)的cors跨域配置
跨越問題處理
跨域:域名不一致就是跨域,主要包括:
- 域名不同:www.taobao.com和www.taobao.org和www.jd.com和miaosha.jd.com
- 域名相同,端口不同:localhost:8080和localhost:8081
跨域問題:瀏覽器禁止請求的發(fā)起者與服務(wù)端發(fā)生跨域ajax請求,請求被瀏覽器攔截的問題
解決方案:CORS
網(wǎng)關(guān)處理跨域采用的同樣是CORS方案,并且只需要簡單配置即可實(shí)現(xiàn):
spring:
cloud:
gateway:
globalcors: #全局的跨域處理
add-to-simple-url-handler-mapping: true # 解決options請求被攔截問題
crosConfigurations:
'[/**]':
allowedOrigins: # 允許哪些網(wǎng)站的跨域請求
- "http://localhost:8090"
- "http://www.leyou.com"
allowedMethods: # 允許的跨域ajax的請求方式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" # 允許在請求中攜帶的頭信息
allowCredentials: true # 是否允許攜帶cookie
maxAge: 360000 # 這次跨域檢測的有效期
有效期范圍內(nèi)瀏覽器將不再發(fā)送請求,而是直接通過文章來源:http://www.zghlxwxcb.cn/news/detail-727464.html
總結(jié)
CORS跨域要配置的參數(shù)包括哪幾個?文章來源地址http://www.zghlxwxcb.cn/news/detail-727464.html
- 允許哪些域名跨域
- 允許哪些請求頭
- 允許哪些請求方式
- 是否允許使用cookie
- 有效期是多久
到了這里,關(guān)于【微服務(wù)】八. 統(tǒng)一網(wǎng)關(guān)gateway的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!