nacos gateway動(dòng)態(tài)路由實(shí)戰(zhàn)
nacos gateway動(dòng)態(tài)路由
說明:本次測試使用的gateway是2.2.2.RELEASE版本,其他版本可能存在不同
一、引入本次測試需要的pom依賴
<!--gateway網(wǎng)關(guān)依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos依賴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--json工具包-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
二、配置文件設(shè)置(*配置文件不生效的把名字改為bootstrap.yml)
server:
port: 8200
spring:
application:
name: lc-gateway
cloud:
nacos:
discovery:
#注冊中心地址
server-addr: 106.12.146.239:8848
config:
server-addr: 106.12.146.239:8848
# 配置中心-指定命名空間
namespace: bb79a8c4-e4e1-4a27-bceb-0810f278b5aa
# 指定配置文件后綴
file-extension: yaml
#配置組
group: DEFAULT_GROUP
#配置dateId
data-id: lc-gateway
#獲取配置超時(shí)時(shí)間
timeout: 5000
gateway:
#設(shè)置超時(shí)時(shí)間默認(rèn)
httpclient:
connect-timeout: 1000
response-timeout: 5s
ps:這里集成了nacos配置中心想了解詳情請(qǐng)移步spring cloud集成nacos配置中心
三、動(dòng)態(tài)路由實(shí)現(xiàn)
package com.lc.api.gateway.config;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.Executor;
/**
* 動(dòng)態(tài)路由,可以通過獲取Bean才做該類,提供增刪改查已經(jīng)發(fā)布功能
*
* @Author: lc
* @Date: 2020/7/8 15:49
*/
@Service
public class DynamicRouteConfig implements ApplicationEventPublisherAware {
private static final Logger logger = LoggerFactory.getLogger(DynamicRouteConfig.class);
@Autowired
private RouteDefinitionWriter routedefinitionWriter;
private ApplicationEventPublisher publisher;
@Value("${spring.cloud.nacos.config.data-id}")
private String dataId;
@Value("${spring.cloud.nacos.config.group}")
private String group;
@Value("${spring.cloud.nacos.config.server-addr}")
private String serverAddr;
@Value("${spring.cloud.nacos.config.namespace}")
private String namespace;
@Value("${spring.cloud.nacos.config.timeout}")
private long timeout;
private static final List<String> ROUTE_LIST = new ArrayList<>();
@PostConstruct
public void dynamicRouteByNacosListener() {
try {
Properties prop = new Properties();
prop.put("serverAddr", serverAddr);
prop.put("namespace", namespace);
ConfigService config = NacosFactory.createConfigService(prop);
String content = config.getConfig(dataId, group, timeout);
publisher(content);
config.addListener(dataId, group, new Listener() {
@Override
public void receiveConfigInfo(String config) {
publisher(config);
}
@Override
public Executor getExecutor() {
return null;
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 增加路由
*
* @param def
* @return
*/
public Boolean addRoute(RouteDefinition def) {
try {
routedefinitionWriter.save(Mono.just(def)).subscribe();
ROUTE_LIST.add(def.getId());
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
/**
* 刪除路由
*
* @return
*/
public Boolean clearRoute() {
for (String id : ROUTE_LIST) {
routedefinitionWriter.delete(Mono.just(id)).subscribe();
}
ROUTE_LIST.clear();
return Boolean.FALSE;
}
/**
* 發(fā)布路由
*/
private void publisher(String config) {
clearRoute();
try {
logger.info("Start updating dynamic routing ....");
List<RouteDefinition> routeDefinitionList = JSONObject.parseArray(config, RouteDefinition.class);
for (RouteDefinition route : routeDefinitionList) {
logger.info(route.toString());
addRoute(route);
}
publisher.publishEvent(new RefreshRoutesEvent(this.routedefinitionWriter));
logger.info("update completed ");
} catch (Exception e) {
logger.error("Failed to update routing information", e);
e.printStackTrace();
}
}
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
publisher = applicationEventPublisher;
}
}
四、nacos配置中心設(shè)置
1.說明

2.新建一個(gè)網(wǎng)關(guān)配置

3. 添加配置格式如下

這里我就不注釋了大家應(yīng)該都能看懂
[
{
"filters": [
{
"args": {
"parts": "1"
},
"name": "StripPrefix"
}
],
"id": "authent1",
"order": -1,
"predicates": [
{
"args": {
"pattern": "/authent/**"
},
"name": "Path"
}
],
"uri": "lb://lc-authenticate"
}
]
五、測試

gateway網(wǎng)關(guān)相關(guān)配置
創(chuàng)建,使用initilizer,
- Group:com.atguigu.gulimall
- Artifact: gulimall-gateway
- package:com.atguigu.gulimall.gateway
搜索gateway選中。
pom.xml里加上common依賴, 修改jdk版本
在啟動(dòng)類中添加注解@EeableDiscoveryClient

配置nacos注冊中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 spring.application.name=gulimall-gateway server.port=88
bootstrap.properties 填寫配置中心地址
spring.application.name=gulimall-gateway spring.cloud.nacos.config.server-addr=127.0.0.1:8848 spring.cloud.nacos.config.namespace=ab66aff2-0bd5-4f80-8a68-760d6ff7d96d
nacos里創(chuàng)建命名空間gateway
然后在命名空間里創(chuàng)建文件guilmall-gateway.yml
spring:
application:
name: gulimall-gateway
在主類中屏蔽數(shù)據(jù)源

在項(xiàng)目里創(chuàng)建application.yml
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://www.xiaomi.com
predicates:
- Query=url,xiaomi
# 若參數(shù)等于斷言 則跳轉(zhuǎn)到指定的uri
運(yùn)行結(jié)果

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何批量測試Mybatis項(xiàng)目中的Sql是否正確詳解
這篇文章主要給大家介紹了關(guān)于如何批量測試Mybatis項(xiàng)目中Sql是否正確的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12
Java 超詳細(xì)講解數(shù)據(jù)結(jié)構(gòu)的應(yīng)用
數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)存儲(chǔ)、組織數(shù)據(jù)的方式。數(shù)據(jù)結(jié)構(gòu)是指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合,讓我們一起來了解數(shù)據(jù)結(jié)構(gòu)是如何應(yīng)用的2022-04-04
詳解Java線程編程中的volatile關(guān)鍵字的作用
這篇文章主要介紹了Java線程編程中的volatile關(guān)鍵字的作用,針對(duì)其禁止進(jìn)行指令重排序和讀寫內(nèi)存方面著重講解,需要的朋友可以參考下2015-12-12
maven實(shí)現(xiàn)docker自動(dòng)化部署插件的使用
本文主要介紹了maven實(shí)現(xiàn)docker自動(dòng)化部署插件的使用,分享給大家,感興趣的小伙伴們可以參考一下2021-06-06

