1.naocs 配置
package com.vanrui.ihw.gateway.config;
import lombok.Data;
/**
* @author luos21
* @date 2022/1/27 18:37
*/
@Data
public class CustomizeRoute {
private String dataId;
private String groupId;
private Long timeout;
}
package com.vanrui.ihw.gateway.config;
import java.util.List;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* @author luos21
* @date 2022/1/27 14:28
*/
@ConfigurationProperties(prefix="gateway")
@Configuration
@Data
public class GatewayRouteProperties {
@Value("${spring.cloud.nacos.config.server-addr}")
private String address;
@Value("${spring.cloud.nacos.config.namespace}")
private String namespace;
private CustomizeRoute customizeRoute;
private List<String> defaultRouteIds;
}
2.nacos监听
package com.vanrui.ihw.gateway.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import com.vanrui.ihw.gateway.config.GatewayRouteProperties;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.Executor;
import javax.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.stereotype.Component;
/**
* @author luos21
* @date 2022/1/27 9:28
*/
@Component
@Slf4j
public class DynamicRouteServiceImplByNacos {
@Autowired
private NacosDynamicRouteService dynamicRouteService;
@Autowired
private GatewayRouteProperties gatewayRouteProperties;
private ConfigService configService;
@PostConstruct
public void init() {
try {
log.info("gatewayRouteProperties-info:\n{}",gatewayRouteProperties);
initConfigService();
String content = configService.getConfig(gatewayRouteProperties.getCustomizeRoute().getDataId(),
gatewayRouteProperties.getCustomizeRoute().getGroupId(), gatewayRouteProperties.getCustomizeRoute().getTimeout());
log.info("初始化网关路由\r\n: {}", content);
List<RouteDefinition> list = JSON.parseArray(content, RouteDefinition.class);
list.forEach(definition -> dynamicRouteService.add(definition));
}catch (Exception e){
log.error("初始化网关路由时发生错误",e);
throw new IllegalArgumentException(e);
}
dynamicRouteByNacosListener();
}
/**
* 初始化网关路由 nacos config
*
* @return
*/
private void initConfigService() throws NacosException {
Properties properties = new Properties();
properties.setProperty("serverAddr", gatewayRouteProperties.getAddress());
properties.setProperty("namespace", gatewayRouteProperties.getNamespace());
configService = NacosFactory.createConfigService(properties);
}
/**
* 监听Nacos Server下发的动态路由配置
*/
public void dynamicRouteByNacosListener() {
try {
configService.addListener(gatewayRouteProperties.getCustomizeRoute().getDataId(),
gatewayRouteProperties.getCustomizeRoute().getGroupId(), new Listener() {
@Override
public void receiveConfigInfo(String configInfo) {
log.info("进行网关路由更新:\n\r{}",configInfo);
List<RouteDefinition> list = JSON.parseArray(configInfo, RouteDefinition.class);
dynamicRouteService.updateRoutes(list);
}
@Override
public Executor getExecutor() {
return null;
}
});
} catch (NacosException e) {
log.error("nacos error", e);
}
}
}
package com.vanrui.ihw.gateway.service.impl;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
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;
/**
* @author luos21
* @date 2022/1/27 9:19
*/
@Service
public class NacosDynamicRouteService implements ApplicationEventPublisherAware {
@Autowired
private RouteDefinitionWriter routeDefinitionWriter;
private ApplicationEventPublisher publisher;
private static final List<String> routeList = new ArrayList<>();
/**
* 增加路由
* @param definition
* @return
*/
public String add(RouteDefinition definition) {
routeDefinitionWriter.save(Mono.just(definition)).subscribe();
routeList.add(definition.getId());
return "success";
}
public void updateRoutes(List<RouteDefinition> routeDefinitions) {
// 先删除已有路由
for (String routeId : routeList) {
delete(routeId);
}
routeList.clear();
for (RouteDefinition routeDefinition : routeDefinitions) {
add(routeDefinition);
}
publish();
}
/**
* 删除路由
* @param id
* @return
*/
public String delete(String id) {
try {
this.routeDefinitionWriter.delete(Mono.just(id)).subscribe();
return "delete success";
} catch (Exception e) {
e.printStackTrace();
return "delete fail";
}
}
public void publish() {
this.publisher.publishEvent(new RefreshRoutesEvent(this.routeDefinitionWriter));
}
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.publisher = applicationEventPublisher;
}
}
3.配置文件
[
{
"id": "ruixun-poc-service",
"order": 0,
"predicates": [{
"args": {
"_genkey_0": "/web/ruixun-gateway/intercoms/**",
"_genkey_1": "/device/ruixun-gateway/intercoms/**"
},
"name": "Path"
}],
"filters": [{
"args": {
"regexp": "/web/([A-Za-z\\-]*)/(?<segment>.*)",
"replacement": "/$\\{segment}"
},
"name": "RewritePath"
},{
"args": {
"regexp": "/device/([A-Za-z\\-]*)/(?<segment>.*)",
"replacement": "/$\\{segment}"
},
"name": "RewritePath"
}],
"uri": "lb://ruixun-poc-service"
},{
"id": "lingshi-service",
"order": 0,
"predicates": [{
"args": {
"_genkey_0": "/web/lingshi/**",
"_genkey_1": "/open/lingshi/**"
},
"name": "Path"
}],
"filters": [{
"args": {
"regexp": "/web/([A-Za-z\\-]*)/(?<segment>.*)",
"replacement": "/$\\{segment}"
},
"name": "RewritePath"
},{
"args": {
"regexp": "/open/([A-Za-z\\-]*)/(?<segment>.*)",
"replacement": "/$\\{segment}"
},
"name": "RewritePath"
}],
"uri": "http://lingshi-app-dev.vanrui.com:32463"
}
]