Spring Cloud的gateway之动态路由

前言

最近在项目中碰到这样一个需求,我们公司需要在中台系统中,添加一个gateway的动态路由添加功能。就是说要在中台系统里添加一条数据,这条数据对应一个gateway路由,然后gateway服务就需要把这个路由加进去,不然的话这个路由就访问不到,由于是动态,所以gateway服务的配置文件路由不能写死,浏览了一些文章后,才发现有动态路由这个功能,果然活到老学到老啊兄弟们,既然这么牛皮那不得给大家安排一下,话不多说,看教程。

DynamicRouteServiceImpl文件

创建DynamicRouteServiceImpl文件并实现ApplicationEventPublisherAware。

@Slf4j
@Service
public class DynamicRouteServiceImpl implements ApplicationEventPublisherAware {

    @Autowired
    private RouteDefinitionWriter routeDefinitionWriter;

    private ApplicationEventPublisher publisher;

    /**
     * 添加路由实体类
     *
     * @param definition
     * @return
     */
    public boolean add(RouteDefinition definition) {
        routeDefinitionWriter.save(Mono.just(definition)).subscribe();
        this.publisher.publishEvent(new RefreshRoutesEvent(this));
        return true;
    }

    /**
     * @param definition 路由实体类
     * @return
     */
    public boolean update(RouteDefinition definition) {
        try {
            routeDefinitionWriter.delete(Mono.just(definition.getId())).subscribe();
        } catch (Exception e) {
            log.error("update 失败。没有找到对应的路由ID :{}", definition.getId());
        }
        routeDefinitionWriter.save(Mono.just(definition)).subscribe();
        this.publisher.publishEvent(new RefreshRoutesEvent(this));
        return true;
    }

    /**
     * serviceId
     *
     * @param id
     * @return
     */
    public boolean del(String id) {
        routeDefinitionWriter.delete(Mono.just(id)).subscribe();
        this.publisher.publishEvent(new RefreshRoutesEvent(this));
        return true;
    }

    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.publisher = applicationEventPublisher;
    }
}

RefreshRouteService文件

新建RefreshRouteService文件并实现ApplicationEventPublisherAware

@Component
@Slf4j
public class RefreshRouteService implements ApplicationEventPublisherAware {

    private ApplicationEventPublisher publisher;

    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
        this.publisher = publisher;
    }

    /**
     * 刷新路由表
     */
    public void refreshRoutes() {
        publisher.publishEvent(new RefreshRoutesEvent(this));
    }
}

新建GatewayRoutesController
@RestController
@RequestMapping("/gateway")

public class GatewayRoutesController {

    @Autowired
    private RefreshRouteService refreshRouteService;

    @Autowired
    private DynamicRouteServiceImpl dynamicRouteService;

    @GetMapping("/refreshRoutes")
    public CommonResult refreshRoutes() {
        refreshRouteService.refreshRoutes();
        return CommonResult.builder().message("成功").build();
    }

    /**
     * @param
     * @return
     */
    @RequestMapping(value = "routes/add", method = RequestMethod.POST)
    public CommonResult add(@RequestBody RouteDefinition routeDefinition) {
        boolean flag = dynamicRouteService.add(routeDefinition);
        if (flag) return CommonResult.builder().message("成功").build();
        return CommonResult.builder().message("失败").build();
    }

    /**
     * @param definition
     * @return
     */
    @RequestMapping(value = "routes/update", method = RequestMethod.POST)
    public CommonResult update(@RequestBody RouteDefinition definition) {
        boolean flag = dynamicRouteService.update(definition);
        if (flag) return CommonResult.builder().message("成功").build();
        return CommonResult.builder().message("失败").build();
    }

    /**
     * @param serviceId
     * @return
     */
    @RequestMapping(value = "routes/del", method = RequestMethod.POST)
    public CommonResult update(@RequestParam("serviceId") String serviceId) {
        boolean flag = dynamicRouteService.del(serviceId);
        if (flag) return CommonResult.builder().message("成功").build();
        return CommonResult.builder().message("失败").build();
    }

}

至此gateway的动态路由就已经完成了,当需要添加路由时只需执行routes/add接口 传入相对应的参数格式即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Cloud Gateway支持通过配置中心动态配置路由。可以通过开启从配置中心拉取服务列表自动创建路由配置来实现。这样,新加的服务就不需要手动添加配置了。具体实现的核心是通过实现RouteDefinitionRepository接口来对路由信息进行写入和删除,同时也继承了RouteDefinitionLocator接口来获取路由信息。在配置文件中,可以使用spring.cloud.gateway.locator.enabled属性来开启从配置中心拉取服务列表自动创建路由配置。然后在routes属性中配置具体的路由信息,包括路由的ID、路由地址、断言等。这样就可以实现动态配置路由了。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [spring cloud gateway 动态创建路由配置](https://blog.csdn.net/suject/article/details/127343833)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [SpringCloudGateway实现动态路由](https://blog.csdn.net/qq_38516524/article/details/128700534)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值