97 lines
2.9 KiB
Java
97 lines
2.9 KiB
Java
package com.jero.loader;
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
|
|
import org.springframework.cloud.gateway.route.InMemoryRouteDefinitionRepository;
|
|
import org.springframework.cloud.gateway.route.RouteDefinition;
|
|
import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
|
|
import org.springframework.cloud.gateway.support.NotFoundException;
|
|
import org.springframework.context.ApplicationEventPublisher;
|
|
import org.springframework.context.ApplicationEventPublisherAware;
|
|
import org.springframework.http.ResponseEntity;
|
|
import org.springframework.stereotype.Service;
|
|
import reactor.core.publisher.Mono;
|
|
|
|
/**
|
|
* 动态更新路由网关service
|
|
* 1)实现一个Spring提供的事件推送接口ApplicationEventPublisherAware
|
|
* 2)提供动态路由的基础方法,可通过获取bean操作该类的方法。该类提供新增路由、更新路由、删除路由,然后实现发布的功能。
|
|
*
|
|
* @author zyf
|
|
*/
|
|
@Slf4j
|
|
@Service
|
|
public class DynamicRouteService implements ApplicationEventPublisherAware {
|
|
|
|
@Autowired
|
|
private RouteDefinitionWriter routeDefinitionWriter;
|
|
|
|
@Autowired
|
|
private InMemoryRouteDefinitionRepository repository;
|
|
|
|
/**
|
|
* 发布事件
|
|
*/
|
|
|
|
private ApplicationEventPublisher publisher;
|
|
|
|
@Override
|
|
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
|
|
this.publisher = applicationEventPublisher;
|
|
}
|
|
|
|
/**
|
|
* 删除路由
|
|
*
|
|
* @param id
|
|
* @return
|
|
*/
|
|
public synchronized void delete(String id) {
|
|
try {
|
|
repository.delete(Mono.just(id)).subscribe();
|
|
this.publisher.publishEvent(new RefreshRoutesEvent(this));
|
|
}catch (Exception e){
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 更新路由
|
|
*
|
|
* @param definition
|
|
* @return
|
|
*/
|
|
public synchronized String update(RouteDefinition definition) {
|
|
try {
|
|
log.info("gateway update route {}", definition);
|
|
delete(definition.getId());
|
|
} catch (Exception e) {
|
|
return "update fail,not find route routeId: " + definition.getId();
|
|
}
|
|
try {
|
|
repository.save(Mono.just(definition)).subscribe();
|
|
this.publisher.publishEvent(new RefreshRoutesEvent(this));
|
|
return "success";
|
|
} catch (Exception e) {
|
|
return "update route fail";
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 增加路由
|
|
*
|
|
* @param definition
|
|
* @return
|
|
*/
|
|
public synchronized String add(RouteDefinition definition) {
|
|
log.info("gateway add route {}", definition);
|
|
try {
|
|
repository.save(Mono.just(definition)).subscribe();
|
|
} catch (Exception e) {
|
|
log.error(e.toString());
|
|
}
|
|
return "success";
|
|
}
|
|
}
|