wordpress網(wǎng)站生成app應(yīng)用指數(shù)基金
官網(wǎng)地址: Spring Cloud Gateway
目錄
1、SpringGateway簡(jiǎn)介
1、什么是網(wǎng)關(guān)
2、為什么用網(wǎng)關(guān)【為了轉(zhuǎn)發(fā)】
2、應(yīng)用:
1.啟動(dòng)nacos
2.創(chuàng)建網(wǎng)關(guān)項(xiàng)目
3.網(wǎng)關(guān)配置1
4.網(wǎng)關(guān)配置2【了解】
5.過(guò)濾器配置【了解】
1、SpringGateway簡(jiǎn)介
核心功能有三個(gè):
-
路由:用于設(shè)置轉(zhuǎn)發(fā)地址的
-
斷言:用來(lái)判斷真實(shí)應(yīng)該請(qǐng)求什么地址
-
過(guò)濾器:可以過(guò)濾地址和處理參數(shù)
1、什么是網(wǎng)關(guān)
網(wǎng)關(guān)是后臺(tái)服務(wù)的統(tǒng)一入口,類(lèi)似于平時(shí)網(wǎng)絡(luò)里提到的網(wǎng)關(guān)。
2、為什么用網(wǎng)關(guān)【為了轉(zhuǎn)發(fā)】
在微服務(wù)架構(gòu)開(kāi)發(fā)中,網(wǎng)關(guān)是必要有的服務(wù),它可以統(tǒng)一入口,解決跨域,負(fù)載均衡,各微服務(wù)通信等微服務(wù)整體管理和通信的。
場(chǎng)景:如果沒(méi)有網(wǎng)關(guān),前臺(tái)要查用戶(hù)信息,先往user的微服務(wù)下發(fā)送請(qǐng)求。然后又要查學(xué)生的信息,再往student的微服務(wù)下發(fā)送請(qǐng)求。這樣的話,我要知道所有的微服務(wù),他們的ip是什么?他們的端口是什么?才能把請(qǐng)求發(fā)送到他們的里面。那對(duì)于前端來(lái)講的話,他要管理的微服務(wù)就太多了。而且還有一個(gè)問(wèn)題,前端這么做,它是沒(méi)有負(fù)載均衡的。它不知道我究竟應(yīng)該發(fā)給誰(shuí)?比如說(shuō)user這個(gè)服務(wù)現(xiàn)在搭建了集群有三個(gè),那請(qǐng)求過(guò)來(lái)了,我究竟是往集群里的哪一個(gè)發(fā)送呢?對(duì)于前端來(lái)說(shuō)也是不知道的。
后臺(tái)為了解決這個(gè)問(wèn)題,就是你別搞這么復(fù)雜了,發(fā)送請(qǐng)求的時(shí)候都往一個(gè)地址發(fā),但是url不一樣。至于跳到哪個(gè)微服務(wù),我后臺(tái)來(lái)解決。Gateway就是專(zhuān)門(mén)來(lái)處理這個(gè)事的。在網(wǎng)關(guān)里面 集成了負(fù)載均衡 咱們就不用考慮這集群起來(lái)的微服務(wù)該給哪一個(gè)發(fā)了。
對(duì)于前端來(lái)講,它發(fā)的不是網(wǎng)關(guān)的請(qǐng)求地址,而是nginx 的請(qǐng)求地址。發(fā)送到nginx地址后,再通過(guò)反向代理,代理到網(wǎng)關(guān)上。所以對(duì)于前端來(lái)說(shuō),只需要知道nginx就可以了,網(wǎng)關(guān)是不暴露給前端的。
一般來(lái)說(shuō)都會(huì)為網(wǎng)關(guān)建立一個(gè)單獨(dú)的微服務(wù)。
2、應(yīng)用:
1.啟動(dòng)nacos
2.創(chuàng)建網(wǎng)關(guān)項(xiàng)目
【2.1添加pom.xml依賴(lài)】
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.7.RELEASE</version></parent><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.6.13</spring-boot.version><jwt.version>0.7.0</jwt.version><fastjson.version>1.2.60</fastjson.version><spring-cloud-alibaba.version>2.0.3.RELEASE</spring-cloud-alibaba.version><spring-cloud.version>Finchley.SR2</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><classifier>exec</classifier></configuration></plugin></plugins></build>
【2.2】創(chuàng)建啟動(dòng)類(lèi):
@SpringBootApplication
public class SpringBootMain {public static void main(String[] args) {SpringApplication.run(SpringBootMain.class,args);}
}
【注意】
網(wǎng)關(guān)是一個(gè)非常干凈的工程,不會(huì)添加其它中間件的配置,所以網(wǎng)關(guān)工程里只有一個(gè)Application的啟動(dòng)類(lèi)和配置文件。
啟動(dòng)類(lèi)的注解@SpringBootApplication注解中可能開(kāi)啟的其它中間件的@EnableXXX,可以把其它中間件的注解排除掉,保證網(wǎng)關(guān)只啟動(dòng)自己的應(yīng)用,只完成網(wǎng)關(guān)功能。
# 如果導(dǎo)入別人的項(xiàng)目,依賴(lài)是有傳遞性的這樣你的項(xiàng)目里依賴(lài)的中間件就會(huì)很多,可以通過(guò)exclude屬性排除掉。這樣其他的中間件就不會(huì)啟動(dòng)了。
@SpringBootApplication(exclude = {XXXX.class, YYYY.class})
【2.3】編寫(xiě)bootstrap.yml配置文件
spring:cloud:nacos:discovery:server-addr: 192.168.146.128:8848config:server-addr: 192.168.146.128:8848inetutils:preferred-networks: 192.168.146
查看端口號(hào)
【2.4】編寫(xiě)application.properties配置文件
spring.application.name=gateway
server.port=300
創(chuàng)建一個(gè)頁(yè)面來(lái)進(jìn)行測(cè)試? ?【注意要建立index.html頁(yè)面】要在static包下
【2.5】啟動(dòng)項(xiàng)目
3.網(wǎng)關(guān)配置1
刪除頁(yè)面
網(wǎng)關(guān)配置官方文檔: Spring Cloud Gateway
【3.0】改動(dòng):
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><scope>compile</scope></dependency>
修改為:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><scope>compile</scope></dependency>
【3.1】添加依賴(lài)
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><scope>compile</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>
【3.2】添加application.yml 配置文件:
spring:cloud:gateway:routes:- id: baidu_routeuri: https://www.baidu.compredicates:- Query=baidu
spring:
?? cloud:
???? gateway:
?????? routes:
???????? - id: baidu_route(路由id唯一,是一個(gè)數(shù)組,可以配置多個(gè)路由)
?????????? uri: https://www.baidu.com(路由到的地址)
?????????? predicates:(斷言)
???????????? - Query=url, baidu(如果存在url和baidu,那么跳轉(zhuǎn)到uri地址)
【3.3】啟動(dòng)項(xiàng)目:
http://localhost:300/baidu不會(huì)跳轉(zhuǎn)到百度,http://localhost:300/baidu?baidu才會(huì)跳轉(zhuǎn)到百度,是根據(jù)參數(shù)做斷言。?后面的值下圖
輸入正確跳到頁(yè)面
【如果導(dǎo)入gateway依賴(lài)報(bào)錯(cuò),試著修改下面的的java版本】
4.網(wǎng)關(guān)配置2【了解】
-
The Path Route Predicate Factory
Path路由斷言工廠接受一個(gè)參數(shù):采用Spring PathMatcher 模式。
spring:
? cloud:
? ? gateway:
? ? ? routes:
? ? ? ?? ?- id: path_route
? ? ? ? ? uri: https://example.org
? ? ? ? ? predicates:
? ? ? ? ? ? - Path=/red/{segment},/blue/{segment}
請(qǐng)求需要以red或者blue結(jié)尾,后面的參數(shù)會(huì)路由過(guò)去 例如:/red/1 ,/red/blue ,/blue/green等。
spring:
? cloud:
? ? gateway:
? ? ? routes:
? ? ? ? - id: baidu_route
? ? ? ? ? uri: https://www.baidu.com
? ? ? ? ? predicates:
? ? ? ? ? ? - Path=/red/**
5.過(guò)濾器配置【了解】
##公式模板
- id: third_party_route
? uri: lb://service-name
? predicates:
? ? - Path=/url1/url2/urln/**
? filters:
? ? - RewritePath=/url1/url2/urln/(?<segment>/?.*),/$\{segment}
? ??##例子代碼
spring:
? cloud:
? ? gateway:
? ? ? routes:
? ? ? ? #用戶(hù)中心
? ? ? ? - id: user-route
? ? ? ? ? uri: lb://user
? ? ? ? ? predicates:
? ? ? ? ? ? - Path=/api/services/user/**
? ? ? ? ? filters:
? ? ? ? ? ? - RewritePath=/api/services/user/(?<segment>/?.*),/user/$\{segment}
id:取一個(gè)名字,自定義,見(jiàn)名知意,不要有下劃線(規(guī)約)
uri:接收請(qǐng)求后真實(shí)轉(zhuǎn)發(fā)的地址,lb:開(kāi)頭代表用負(fù)載均衡的方式找注冊(cè)中心名字叫user服務(wù)的微服務(wù)
predicates:請(qǐng)求地址是以/api/services/user/開(kāi)頭,后接任意字符
filters:將請(qǐng)求地址重寫(xiě)成:/user/+參數(shù)/方法等