第十五章 網(wǎng)關(guān)
前言
本系統(tǒng)中網(wǎng)關(guān)最主要的功能就是:路由轉(zhuǎn)發(fā)哼勇、路徑重寫、負(fù)載均衡呕乎、過濾等积担。Spring Cloud Gateway官方文檔
一、POM配置
父級pom.xml引入相關(guān)依賴猬仁,具體內(nèi)容請參考源碼帝璧,核心的依賴就是SpringCloud、SpringCloudAlibaba湿刽、SpringBoot聋溜,
<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>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba-->
<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>
Gateway子項目引入的核心包,
<!--注冊中心客戶端-->
<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>
<!--gateway 網(wǎng)關(guān)依賴,內(nèi)置webflux 依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
二叭爱、路由配置
路由信息全部都托管到nacos里面一個名為dynamic_routes的文件撮躁。
routes:
# service-auth
- id: service-auth
predicates:
- Path=/auth/**
uri: lb://service-auth
filters:
- StripPrefix=1
# service-upms-api
- id: service-upms-api
predicates:
- Path=/upms/**
uri: lb://service-upms-api
filters:
- StripPrefix=1
# service-demo
- id: service-demo
predicates:
- Path=/demo/**
uri: lb://service-demo
filters:
- StripPrefix=1
- id: test
uri: http://www.baidu.com/
predicates:
- Path=/test
參數(shù)解釋:
id:路由唯一標(biāo)識,用來區(qū)別于其他的route
uri:請求被轉(zhuǎn)發(fā)到的微服務(wù)买雾,lb表示負(fù)載均衡
predicate:斷言的作用是進(jìn)行條件判斷把曼,我們這里用的是Path Route Predicate Factory,路徑匹配成功才會執(zhí)行路由漓穿。
filter: 過濾器嗤军,StripPrefix=1表示去掉前綴
三、路由初始化
路由的配置信息存放在Nacos里面晃危,在系統(tǒng)啟動的時候需要從nacos里面取出來叙赚,然后加載到系統(tǒng)里面;同時還需要監(jiān)聽配置文件的變化僚饭,方便實時更新配置文件震叮,源碼如下:
@Slf4j
@Configuration
@AllArgsConstructor
public class DynamicRouteInit {
private RouteDefinitionWriter routeDefinitionWriter;
private NacosConfigProperties nacosConfigProperties;
@PostConstruct
public void initRoute() {
try {
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, nacosConfigProperties.getServerAddr());
properties.put(PropertyKeyConst.USERNAME, nacosConfigProperties.getUsername());
properties.put(PropertyKeyConst.PASSWORD, nacosConfigProperties.getPassword());
ConfigService configService = NacosFactory.createConfigService(properties);
String content = configService.getConfig(CommonConstant.CONFIG_DATA_ID, CommonConstant.CONFIG_GROUP, CommonConstant.CONFIG_TIMEOUT_MS);
log.info("初始化路由網(wǎng)關(guān)開始");
updateRoute(content);
log.info("初始化路由網(wǎng)關(guān)完成");
/**
* 監(jiān)聽配置
* 如果希望 Nacos 推送配置變更,可以使用 Nacos 動態(tài)監(jiān)聽配置接口來實現(xiàn)鳍鸵。
*/
configService.addListener(CommonConstant.CONFIG_DATA_ID, CommonConstant.CONFIG_GROUP, new Listener() {
@Override
public void receiveConfigInfo(String configInfo) {
log.info("更新路由網(wǎng)關(guān)開始");
updateRoute(configInfo);
log.info("更新路由網(wǎng)關(guān)完成");
}
@Override
public Executor getExecutor() {
return null;
}
});
} catch (NacosException e) {
log.error("加載路由出錯:{}", e.getErrMsg());
}
}
public void updateRoute(String content) {
Yaml yaml = new Yaml();
GatewayRouteList gatewayRouteList = yaml.loadAs(content, GatewayRouteList.class);
gatewayRouteList.getRoutes().forEach(route -> {
log.info("加載路由:{},{}", route.getId(), route);
routeDefinitionWriter.save(Mono.just(route)).subscribe();
});
}
}
四苇瓣、其他配置
新建配置文件bootstrap.yml,用來配置一些固定不變的參數(shù)偿乖,其他動態(tài)或者有變化可以托管到nacos配置中心击罪。
server:
port: 8888
spring:
application:
# 應(yīng)用名稱
name: @artifactId@
# 配置中心
cloud:
nacos:
# 服務(wù)發(fā)現(xiàn)
discovery:
# 服務(wù)發(fā)現(xiàn)地址
server-addr: @nacos.addr@
# 組名
group: @group.name@
# 配置中心
config:
# 配置中心地址
server-addr: @nacos.addr@
# 文件擴展名
file-extension: yml
# 組名
group: @group.name@
# 共享文件配置
shared-configs[0]:
# 文件名稱
data-id: application.${spring.cloud.nacos.config.file-extension}
refresh: true
log:
# 日志名
appName: service-gateway
其中@***@這種類型的參數(shù)是配置到pom.xml里面的哲嘲,可以參考源碼
<profiles>
<!--生產(chǎn)環(huán)境-->
<profile>
<id>prod</id>
<properties>
<nacos.addr>127.0.0.1:8848</nacos.addr>
<group.name>DEFAULT_GROUP</group.name>
</properties>
</profile>
</profiles>
五、驗證
-
啟動Gateway服務(wù)媳禁,可以看到路由加載的日志眠副,并且能服務(wù)注冊中心發(fā)現(xiàn)該服務(wù)。
image.png
image.png 添加新路由竣稽,并發(fā)布囱怕,可以在控制臺看到路由更新日志
- id: test
uri: http://www.baidu.com/
predicates:
- Path=/test
- 訪問http://127.0.0.1:8888/demo/user/test,可以正確路由到service-demo這個服務(wù)的方法上丧枪。
image.png
當(dāng)前版本tag:2.0.0
代碼倉庫
六光涂、 體驗地址
后臺數(shù)據(jù)庫只給了部分權(quán)限庞萍,報錯屬于正常拧烦!
想學(xué)的老鐵給點點關(guān)注吧!6奂啤恋博!
歡迎留言交流!K教瘛债沮!
我是阿咕嚕,一個從互聯(lián)網(wǎng)慢慢上岸的程序員本鸣,如果喜歡我的文章疫衩,記得幫忙點個贊喲,謝謝荣德!