前言
微服務(wù)分為多個服務(wù),有很多服務(wù)是內(nèi)部人員要用的,但是現(xiàn)在誰都可以訪問到,那我們該怎么辦呢?
Spring Cloud最新面試題
Spring Cloud Nacos詳解之注冊中心
Spring Cloud Nacos詳解之配置中心
Spring Cloud Nacos詳解之集群配置
Spring Cloud Eureka詳解
Spring Cloud Frign詳解
Spring Cloud Ribbon詳解
Spring Cloud Hystrix詳解
SpringCloud Gatewy網(wǎng)關(guān)
一.網(wǎng)關(guān)功能和工作原理
二.網(wǎng)關(guān)的類型
-
Gateway
響應(yīng)式編程,具有更好的性能。 -
Zuul
阻塞式編程。
三.搭建網(wǎng)關(guān)
1.創(chuàng)建一個新的服務(wù)
2.添加網(wǎng)關(guān)依賴和nacos服務(wù)發(fā)現(xiàn)依賴
<!--nacos服務(wù)注冊發(fā)現(xiàn)依賴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--網(wǎng)關(guān)gateway依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
3.編寫yml配置文件
server:
port: 10086 #端口號
spring:
application:
name: gateway #服務(wù)名稱
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
gateway:
routes:
- id: user-service # 路由id,必須唯一。 用戶服務(wù)
uri: lb://userservice # 路由的目標(biāo)地址,lb是負(fù)載均衡。
# uri: http://127.0.0.1/user/1 也可以使用這種,但是這種就固定了路由地址,就不能負(fù)載均衡了。
predicates: # 路由斷言,判斷請求是否符合規(guī)則,符合就轉(zhuǎn)發(fā)到目的路由??梢耘渲枚鄠€規(guī)則
- Path=/user/** # 路徑斷言,判斷路徑是否是以/user開頭,如果是則符合。
- id: order-service # 訂單服務(wù)
uri: lb://orderservice
predicates:
- Path=/order/**
四.路由斷言工廠(Route Predicate Factory)
官網(wǎng)示例
屬性 | 描述 | 示例 |
---|---|---|
After | 是某個時間點之后的請求 | -After=2023-01-01T17:42:47.789-07:00[America/Denver] (必須在2023年1月1日17點42分47秒之后發(fā)的請求才能通過,根據(jù)美國丹佛[America/Denver]的時間算) |
Before | 是某個時間點之前的請求 | -Before=2022-02-22T22:22:22.433+8:00[Asia/Shanghai] (必須在2022年2月22日22時22分22秒之前發(fā)的請求才能通過,根據(jù)[Asia/Shanghai]上海時間算) |
Between | 是某兩個時間點之前的請求 | -Between=時間[時區(qū)],時間[時區(qū)] |
Cookie | 請求必須包含某些cookie | - Cookie=ikun, rap |
Header | 請求必須包含某些header | - Header=X-Request-Id,\d+ |
Host | 請求必須是訪問某個host(域名) | - Host=**.kunkun,**com.cn |
Method | 請求方式必須是指定方式 | -Method=GETPOST |
Path | 請求路徑必須符合指定規(guī)則 | -path=user/** |
Query | 請求參數(shù)必須包含指定參數(shù) | Query=ikun |
RemoteAddr | 請求者的ip必須是指定范圍 | - RemoteAddr=192.168.1.1/24 |
Weight | 權(quán)重處理 |
五.路由過濾器(屬于GatewayFilter)
對進(jìn)入網(wǎng)關(guān)的請求和微服務(wù)返回的響應(yīng)做處理。比如:添加請求頭。
官網(wǎng)示例
1.配置網(wǎng)關(guān)服務(wù)yml文件
路由過濾器:對當(dāng)前路由生效。
server:
port: 10086 #端口號
spring:
application:
name: gateway #服務(wù)名稱
cloud:
gateway:
routes:
- id: user-service # 路由id,必須唯一。 用戶服務(wù)
uri: lb://userservice # 路由的目標(biāo)地址,lb是負(fù)載均衡。
# uri: http://127.0.0.1/user/1 也可以使用這種,但是這種就固定了路由地址,就不能負(fù)載均衡了。
predicates: # 路由斷言,判斷請求是否符合規(guī)則,符合就轉(zhuǎn)發(fā)到目的路由??梢耘渲枚鄠€規(guī)則
- Path=/user/** # 路徑斷言,判斷路徑是否是以/user開頭,如果是則符合。
filters:
- AddRequestHeader=Ikun,ji ni tai mei! # 添加請求頭,針對某個服務(wù)生效。
2.在添加請求頭的服務(wù)編寫代碼
在用戶服務(wù)的controller里面寫
/**
* @param id 用戶id
* @return 用戶
*/
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id,
@RequestHeader(value = "Ikun", required = false) String ikun) {
System.out.println("Ikun最喜歡的歌是什么:" + ikun);
return userService.queryById(id);
}
然后訪問 localhost:10086/user/1
,控制臺就會打印 ikun 的值。
六.DefaultFilter過濾器(屬于GatewayFilter)
DefaultFilter:對所有路由都生效。
server:
port: 10086 #端口號
spring:
application:
name: gateway #服務(wù)名稱
cloud:
gateway:
routes:
- id: user-service # 路由id,必須唯一。 用戶服務(wù)
uri: lb://userservice # 路由的目標(biāo)地址,lb是負(fù)載均衡。
# uri: http://127.0.0.1/user/1 也可以使用這種,但是這種就固定了路由地址,就不能負(fù)載均衡了。
predicates: # 路由斷言,判斷請求是否符合規(guī)則,符合就轉(zhuǎn)發(fā)到目的路由。可以配置多個規(guī)則
- Path=/user/** # 路徑斷言,判斷路徑是否是以/user開頭,如果是則符合。
default-filters:
- AddRequestHeader=Ikun,ji ni tai mei! #添加請求頭,全局生效
七.全局過濾器(GlobalFilter)
對進(jìn)入網(wǎng)關(guān)的請求和微服務(wù)返回的響應(yīng)做處理。和GatewayFilter作用一樣
因為GatewayFilter是基于配置實現(xiàn),處理的邏輯是固定的,GlobalFilter基于代碼邏輯實現(xiàn),更加靈活一些,可以用于驗證用戶身份等功能。
1.實現(xiàn)GlobalFilter接口
驗證身份信息,根據(jù)authorization的值是否是ikun
// @Order(-1) 注解方式實現(xiàn),如果有多個過濾器,越小越早走。
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 1.獲取請求參數(shù)
ServerHttpRequest request = exchange.getRequest();
MultiValueMap<String, String> params = request.getQueryParams();
// 2.獲取參數(shù)中的 authorization 參數(shù)
String auth = params.getFirst("authorization");
// 3.判斷參數(shù)值是否等于 ikun
if ("ikun".equals(auth)) {
// 4.是,放行
return chain.filter(exchange);
}
// 5.否,攔截
// 5.1.設(shè)置狀態(tài)碼,未登錄
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
// 5.2.攔截請求
return exchange.getResponse().setComplete();
}
/**
* 代碼方式實現(xiàn),實現(xiàn) Ordered 接口,多個過濾器,返回值越小,越早走。
**/
@Override
public int getOrder() {
return -1;
}
}
2.驗證身份
(1) 如果authorization 參數(shù)不等于ikun或沒有都會報錯。
(2) authorization 參數(shù)等于 ikun正常訪問。
八.過濾器執(zhí)行順序
請求路由后,會將當(dāng)前路由過濾器和DefaultFilter、GlobalFilter,合并到一個過濾鏈(集合)中,排序后依次執(zhí)行每個過濾器**(DefaultFilter -> 路由過濾器 -> GlobalFilter)**。
1.為什么不是同一個過濾器可以放在一個過濾鏈中呢?由下面可得這三個過濾器本質(zhì)上都是GatewayFilter
DefaultFilter 和 路由過濾器的實現(xiàn)都是 AddRequestHeaderGatewayFilterFactory
類,最后會生成一個真正的過濾器(GatewayFilter
)。
GlobalFilter的實現(xiàn)是通過 GatewayFilterAdapter
適配器類實現(xiàn)了GatewayFilter
,然后就可以把GlobalFilter適配成GatewayFilter
。
2.路由過濾器和DefaultFilter怎么設(shè)置@Order順序呢?
由spring指定order,按聲明順序1開始遞增。
擴(kuò)展:文章來源:http://www.zghlxwxcb.cn/news/detail-659482.html
- org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#getFilters()方法是先加載defaultFilters,然后再加載某個route的filters,然后合并。
- org.springframework.cloud.gateway.handler.FilteringlWebHandler#handle()方法會加載全局過濾器與前面的過濾器合并后根據(jù)order排序,組織過濾器鏈。
九.Gateway解決跨域問題
跨域: 瀏覽器禁止請求的發(fā)起者與服務(wù)端發(fā)生跨域ajax請求,請求被瀏覽器攔截的問題。
解決: 采用CORS方案,網(wǎng)關(guān)處理跨域采用的同樣是CORS方案。(簡單來說就是瀏覽器詢問服務(wù)端讓不讓這個請求跨域,如果讓會返回結(jié)果)。文章來源地址http://www.zghlxwxcb.cn/news/detail-659482.html
在yml文件配置以下內(nèi)容
spring:
cloud:
gateway:
globalcors: # 全局的跨域處理
add-to-simple-url-handler-mapping: true # 解決options請求被攔截問題(瀏覽器去詢問服務(wù)端的請求就是options)
corsConfigurations:
'[/**]':
allowedOrigins: # 允許哪些網(wǎng)站的跨域請求
-"http://localhost:8888"
-"http://www.ikun.com"
allowedMethods: # 允許的跨域ajax的請求方式
-"GET"
-"POST"
-"DELETE"
-"PUT"
-"OPTIONS"
allowedHeaders: "*" # 允許請求頭跨域
allowCredentials: true # 是否允許攜帶cookie
maxAge: 360000 # 這次跨域檢測的有效期
到了這里,關(guān)于【SpringCloud】SpringCloud Gateway詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!