| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 | 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@Servicepublic 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";    }}
 |