網關的作用
- 對用戶請求做身份認證、權限校驗
- 將用戶請求路由到微服務,并實現(xiàn)負載均衡
- 對用戶請求做限流
搭建網關服務
- 創(chuàng)建新module,命名為Gateway,引入依賴(1.SpringCloudGateway依賴;2.Eureka客戶端依賴或者nacos的服務發(fā)現(xiàn)依賴)。在本案例中使用的是Eureka。
<!--網關依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--Eureka客戶端依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--nacos服務發(fā)現(xiàn)依賴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 配置Application.yml的網關服務
- 路由id:路由的唯一標示
- 路由目標(uri):路由的目標地址,http代表固定地址,lb代表根據服務名負載均衡
- 路由斷言(predicates):判斷路由的規(guī)則,
- 路由過濾器(filters):對請求或響應做處理
server:
port: 10010 # 網關端口
spring:
application:
name: gateway # 服務名稱
cloud:
gateway:
routes: # 網關路由配置
- id: user-service # 路由id,自定義,只要唯一即可
# uri: http://127.0.0.1:8081 # 路由的目標地址 http就是固定地址
uri: lb://userservice # 路由的目標地址 lb就是負載均衡,后面跟服務名稱
predicates: # 路由斷言,也就是判斷請求是否符合路由規(guī)則的條件
- Path=/user/** # 這個是按照路徑匹配,只要以/user/開頭就符合要求
- id: order-service # 路由id,自定義,只要唯一即可
uri: lb://orderservice
predicates:
- Path=/order/**
# nacos:
# server-addr: localhost:8848 # nacos地址
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka/ # 注冊到eureka
- 啟動測試
目錄結構
服務
瀏覽器的測試結果,可見當給網關服務發(fā)送請求時,對應于orderservice和userservice的請求被成功轉發(fā)到對應路由 - 總結搭建網關服務的流程
路由斷言工廠
predicates:路由斷言,判斷請求是否符合要求,符合則轉發(fā)到路由目的地
路由過濾器GatewayFilter
spring官方文檔用@RequestHeader來獲取
給所有的微服務都加一個請求頭,用默認過濾器
spring:
application:
name: gateway # 服務名稱
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
gateway:
routes: # 網關路由配置
- id: user-service
uri: lb://userservice
predicates:
- Path=/user/**
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
default-filters: # 默認過濾器,會對所有的路由請求都生效
- AddRequestHeader=Truth, Itcast is freaking awesome! # 添加請求頭
全局過濾器
需求:定義全局過濾器,攔截請求,判斷請求的參數(shù)是否滿足下面條件:
參數(shù)中是否有authorization,
authorization參數(shù)值是否為admin
如果同時滿足則放行,否則攔截
@Order(-1) //順序,越小越靠前
@Component //定義組件
public class AuthorizeFilter implements GlobalFilter{
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 1.獲取請求參數(shù)
MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
// 2.獲取authorization參數(shù)
String auth = params.getFirst("authorization");
// 3.校驗
if ("admin".equals(auth)) {
// 放行
return chain.filter(exchange);
}
// 4.攔截
// 4.1.禁止訪問
exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
// 4.2.結束處理
return exchange.getResponse().setComplete();
}
}
路由過濾器、defaultFilter、全局過濾器的執(zhí)行順序?
1、order值越小,優(yōu)先級越高
2、當order值一樣時,順序是defaultFilter最先,然后是局部的路由過濾器,最后是全局過濾器
cors跨域配置
文章來源:http://www.zghlxwxcb.cn/news/detail-716525.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-716525.html
到了這里,關于微服務-統(tǒng)一網關Gateway的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!