gateway-动态路由

1.naocs 配置
package com.vanrui.ihw.gateway.config;

import lombok.Data;

/**
 * @author luos21
 * @date 2022/1/27 18:37
 */
@Data
public class CustomizeRoute {

  private String dataId;

  private String groupId;

  private Long timeout;
}

package com.vanrui.ihw.gateway.config;

import java.util.List;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
 * @author luos21
 * @date 2022/1/27 14:28
 */
@ConfigurationProperties(prefix="gateway")
@Configuration
@Data
public class GatewayRouteProperties {
  @Value("${spring.cloud.nacos.config.server-addr}")
  private String address;

  @Value("${spring.cloud.nacos.config.namespace}")
  private String namespace;

  private CustomizeRoute customizeRoute;
  private List<String> defaultRouteIds;
}

2.nacos监听
package com.vanrui.ihw.gateway.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import com.vanrui.ihw.gateway.config.GatewayRouteProperties;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.Executor;
import javax.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.stereotype.Component;

/**
 * @author luos21
 * @date 2022/1/27 9:28
 */
@Component
@Slf4j
public class DynamicRouteServiceImplByNacos {
  @Autowired
  private NacosDynamicRouteService dynamicRouteService;
  @Autowired
  private GatewayRouteProperties gatewayRouteProperties;

  private ConfigService configService;


  @PostConstruct
  public void init() {
    try {
      log.info("gatewayRouteProperties-info:\n{}",gatewayRouteProperties);
      initConfigService();
      String content = configService.getConfig(gatewayRouteProperties.getCustomizeRoute().getDataId(),
          gatewayRouteProperties.getCustomizeRoute().getGroupId(), gatewayRouteProperties.getCustomizeRoute().getTimeout());
      log.info("初始化网关路由\r\n: {}", content);
      List<RouteDefinition> list = JSON.parseArray(content, RouteDefinition.class);
      list.forEach(definition -> dynamicRouteService.add(definition));
    }catch (Exception e){
      log.error("初始化网关路由时发生错误",e);
      throw new IllegalArgumentException(e);
    }
    dynamicRouteByNacosListener();
  }

  /**
   * 初始化网关路由 nacos config
   *
   * @return
   */
  private void initConfigService() throws NacosException {
      Properties properties = new Properties();
      properties.setProperty("serverAddr", gatewayRouteProperties.getAddress());
      properties.setProperty("namespace", gatewayRouteProperties.getNamespace());
      configService = NacosFactory.createConfigService(properties);
  }

  /**
   * 监听Nacos Server下发的动态路由配置
   */
  public void dynamicRouteByNacosListener() {
    try {
      configService.addListener(gatewayRouteProperties.getCustomizeRoute().getDataId(),
          gatewayRouteProperties.getCustomizeRoute().getGroupId(), new Listener() {
            @Override
            public void receiveConfigInfo(String configInfo) {
              log.info("进行网关路由更新:\n\r{}",configInfo);
              List<RouteDefinition> list = JSON.parseArray(configInfo, RouteDefinition.class);
              dynamicRouteService.updateRoutes(list);
            }
            @Override
            public Executor getExecutor() {
              return null;
            }
          });
    } catch (NacosException e) {
      log.error("nacos error", e);
    }
  }
}

package com.vanrui.ihw.gateway.service.impl;

import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;

/**
 * @author luos21
 * @date 2022/1/27 9:19
 */
@Service
public class NacosDynamicRouteService implements ApplicationEventPublisherAware {

  @Autowired
  private RouteDefinitionWriter routeDefinitionWriter;

  private ApplicationEventPublisher publisher;

  private static final List<String> routeList = new ArrayList<>();

  /**
   * 增加路由
   * @param definition
   * @return
   */
  public String add(RouteDefinition definition) {
    routeDefinitionWriter.save(Mono.just(definition)).subscribe();
    routeList.add(definition.getId());
    return "success";
  }


  public void updateRoutes(List<RouteDefinition> routeDefinitions) {
    // 先删除已有路由
    for (String routeId : routeList) {
      delete(routeId);
    }
    routeList.clear();
    for (RouteDefinition routeDefinition : routeDefinitions) {
      add(routeDefinition);
    }
    publish();
  }

  /**
   * 删除路由
   * @param id
   * @return
   */
  public String delete(String id) {
    try {
      this.routeDefinitionWriter.delete(Mono.just(id)).subscribe();
      return "delete success";
    } catch (Exception e) {
      e.printStackTrace();
      return "delete fail";
    }
  }

  public void publish() {
    this.publisher.publishEvent(new RefreshRoutesEvent(this.routeDefinitionWriter));
  }

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

3.配置文件
[
  {
    "id": "ruixun-poc-service",
    "order": 0,
    "predicates": [{
      "args": {
        "_genkey_0": "/web/ruixun-gateway/intercoms/**",
        "_genkey_1": "/device/ruixun-gateway/intercoms/**"
      },
      "name": "Path"
    }],
    "filters": [{
      "args": {
        "regexp": "/web/([A-Za-z\\-]*)/(?<segment>.*)",
        "replacement": "/$\\{segment}"
      },
      "name": "RewritePath"
    },{
      "args": {
        "regexp": "/device/([A-Za-z\\-]*)/(?<segment>.*)",
        "replacement": "/$\\{segment}"
      },
      "name": "RewritePath"
    }],
    "uri": "lb://ruixun-poc-service"
  },{
		"id": "lingshi-service",
		"order": 0,
		"predicates": [{
			"args": {
				"_genkey_0": "/web/lingshi/**",
        "_genkey_1": "/open/lingshi/**"

			},
			"name": "Path"
		}],
		"filters": [{
			"args": {
				"regexp": "/web/([A-Za-z\\-]*)/(?<segment>.*)",
				"replacement": "/$\\{segment}"
			},
			"name": "RewritePath"
		},{
			"args": {
				"regexp": "/open/([A-Za-z\\-]*)/(?<segment>.*)",
				"replacement": "/$\\{segment}"
			},
			"name": "RewritePath"
		}],
		"uri": "http://lingshi-app-dev.vanrui.com:32463"
	}

]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值