|
@@ -0,0 +1,80 @@
|
|
|
+/*
|
|
|
+ * Copyright (c) 2018-2025, lengleng All rights reserved.
|
|
|
+ *
|
|
|
+ * Redistribution and use in source and binary forms, with or without
|
|
|
+ * modification, are permitted provided that the following conditions are met:
|
|
|
+ *
|
|
|
+ * Redistributions of source code must retain the above copyright notice,
|
|
|
+ * this list of conditions and the following disclaimer.
|
|
|
+ * Redistributions in binary form must reproduce the above copyright
|
|
|
+ * notice, this list of conditions and the following disclaimer in the
|
|
|
+ * documentation and/or other materials provided with the distribution.
|
|
|
+ * Neither the name of the pig4cloud.com developer nor the names of its
|
|
|
+ * contributors may be used to endorse or promote products derived from
|
|
|
+ * this software without specific prior written permission.
|
|
|
+ * Author: lengleng (wangiegie@gmail.com)
|
|
|
+ */
|
|
|
+
|
|
|
+package com.pig4cloud.pigx.gateway.support;
|
|
|
+
|
|
|
+import com.pig4cloud.pigx.common.core.constant.CommonConstant;
|
|
|
+import com.pig4cloud.pigx.gateway.support.vo.RouteDefinitionVo;
|
|
|
+import lombok.AllArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
+import org.springframework.cloud.gateway.route.RouteDefinition;
|
|
|
+import org.springframework.cloud.gateway.route.RouteDefinitionRepository;
|
|
|
+import org.springframework.data.redis.core.RedisTemplate;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+import reactor.core.publisher.Flux;
|
|
|
+import reactor.core.publisher.Mono;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author lengleng
|
|
|
+ * @date 2018/10/31
|
|
|
+ * <p>
|
|
|
+ * redis 保存路由信息,优先级比配置文件高
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Component
|
|
|
+@AllArgsConstructor
|
|
|
+public class RedisRouteDefinitionWriter implements RouteDefinitionRepository {
|
|
|
+ private final RedisTemplate redisTemplate;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Mono<Void> save(Mono<RouteDefinition> route) {
|
|
|
+ return route.flatMap(r -> {
|
|
|
+ RouteDefinitionVo vo = new RouteDefinitionVo();
|
|
|
+ BeanUtils.copyProperties(r, vo);
|
|
|
+ log.info("保存路由信息{}", vo);
|
|
|
+ redisTemplate.opsForHash().put(CommonConstant.ROUTE_KEY, r.getId(), vo);
|
|
|
+ return Mono.empty();
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Mono<Void> delete(Mono<String> routeId) {
|
|
|
+ routeId.subscribe(id -> {
|
|
|
+ log.info("删除路由信息{}", id);
|
|
|
+ redisTemplate.opsForHash().delete(CommonConstant.ROUTE_KEY, id);
|
|
|
+ });
|
|
|
+ return Mono.empty();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Flux<RouteDefinition> getRouteDefinitions() {
|
|
|
+ List<RouteDefinitionVo> values = redisTemplate.opsForHash().values(CommonConstant.ROUTE_KEY);
|
|
|
+ List<RouteDefinition> definitionList = new ArrayList<>();
|
|
|
+ values.forEach(vo -> {
|
|
|
+ RouteDefinition routeDefinition = new RouteDefinition();
|
|
|
+ BeanUtils.copyProperties(vo, routeDefinition);
|
|
|
+ definitionList.add(vo);
|
|
|
+ });
|
|
|
+ log.debug("redis 中路由定义条数: {}, {}", definitionList.size(), definitionList);
|
|
|
+ return Flux.fromIterable(definitionList);
|
|
|
+ }
|
|
|
+}
|