package org.jeecg.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) { } return "success"; } }