content: 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 Mono<ResponseEntity<Object>> delete(String id) {
          return this.repository.delete(Mono.just(id)).then(Mono.defer(() -> {
              return Mono.just(ResponseEntity.ok().build());
          })).onErrorResume((t) -> {
              return t instanceof NotFoundException;
          }, (t) -> {
              return Mono.just(ResponseEntity.notFound().build());
          });
      }
  
      /**
       * 更新路由
       *
       * @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";
      }
  }