Nacos实现Zuul网关动态路由配置刷新

注意:如果Zuul网关应用注册到Eureka或Nacos,则会自动刷新路由配置,无需手动刷新

Nacos配置

routes:
  services:
    alipay: ok-cloud-service-alipay
    wechatpay: ok-cloud-service-wechatpay

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * @author yezhou
 */
@Data
@Configuration
@RefreshScope
public class RouteConfig {

    @Value("${zuul.prefix}")
    private String prefix;

    @Bean
    @ConfigurationProperties(prefix = "routes.services")
    public Map<String, String> services() {
        return new HashMap<>();
    }

}

动态路由实现

import com.alibaba.fastjson.JSON;
import com.lianlian.global.thai.provider.channel.callback.config.RouteConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.cloud.netflix.zuul.filters.RefreshableRouteLocator;
import org.springframework.cloud.netflix.zuul.filters.SimpleRouteLocator;
import org.springframework.cloud.netflix.zuul.filters.ZuulProperties;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author yezhou
 */
@Slf4j
@Component
public class DynamicZuulRouteLocator extends SimpleRouteLocator implements RefreshableRouteLocator {

    private ZuulProperties properties;

    @Autowired
    private RouteConfig routeConfig;

    public DynamicZuulRouteLocator(ServerProperties serverProperties, ZuulProperties properties) {
        super(serverProperties.getServlet().getContextPath(), properties);
        this.properties = properties;
    }

    @Override
    public void refresh() {
        doRefresh();
    }

    @Override
    protected Map<String, ZuulProperties.ZuulRoute> locateRoutes() {
        log.info("DynamicZuulRouteLocator.locateRoutes: {}", JSON.toJSONString(routeConfig.services()));
        Map<String, ZuulProperties.ZuulRoute> routesMap = new LinkedHashMap<>();

        // 静态路由信息
        routesMap.putAll(super.locateRoutes());

        // 动态加载路由信息
        Map<String, String> services = routeConfig.services();
        for (Map.Entry<String, String> entry : services.entrySet()) {
            ZuulProperties.ZuulRoute zuulRoute = new ZuulProperties.ZuulRoute();
            zuulRoute.setId(entry.getKey());
            String path = String.format("/%s/**", entry.getKey());
            zuulRoute.setPath(path);
            zuulRoute.setServiceId(entry.getValue());
            zuulRoute.setRetryable(true);
            routesMap.put(path, zuulRoute);
        }

        Map<String, ZuulProperties.ZuulRoute> values = new LinkedHashMap<>();
        for (Map.Entry<String, ZuulProperties.ZuulRoute> entry : routesMap.entrySet()) {
            String path = entry.getKey();
            if (!path.startsWith("/")) {
                path = "/" + path;
            }
            if (StringUtils.hasText(this.properties.getPrefix())) {
                path = this.properties.getPrefix() + path;
                if (!path.startsWith("/")) {
                    path = "/" + path;
                }
            }
            values.put(path, entry.getValue());
        }
        return values;
    }
}
上一篇 SpringBoot集成Knife4j(Swagger-Bootstrap-UI),页面更清爽!
下一篇 Spring Cloud Zuul MySQL 实现动态路由以及手动刷新
目录
文章列表
1 Spring Boot国际化MessageSource使用
Spring Boot国际化MessageSource使用
2
以太坊买狗流程
以太坊买狗流程
3
Linux服务器时间同步
Linux服务器时间同步
4
Spring Boot 实现ErrorController接口处理404、500等错误页面
Spring Boot 实现ErrorController接口处理404、500等错误页面
5
woocommerce plugin add_action always return -1
woocommerce plugin add_action always return -1
最新评论
一位WordPress评论者
一位WordPress评论者
2月12日
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。