diff --git a/sop-admin/sop-admin-server/pom.xml b/sop-admin/sop-admin-server/pom.xml index 906848fc..4c8566b0 100644 --- a/sop-admin/sop-admin-server/pom.xml +++ b/sop-admin/sop-admin-server/pom.xml @@ -21,6 +21,8 @@ UTF-8 UTF-8 1.8 + 3.4.12 + 4.0.1 @@ -36,16 +38,31 @@ easyopen-spring-boot-starter 1.16.0 - + org.apache.curator - curator-framework - 2.13.0 + curator-recipes + ${curator-recipes.version} + + + org.apache.zookeeper + zookeeper + + - org.apache.curator - curator-recipes - 2.13.0 + org.apache.zookeeper + zookeeper + ${zookeeper.version} + + + org.slf4j + slf4j-log4j12 + + diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/demo/param/GoodsParam.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/demo/param/GoodsParam.java index 13798f4c..d5f099e4 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/demo/param/GoodsParam.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/demo/param/GoodsParam.java @@ -2,7 +2,8 @@ package com.gitee.sop.adminserver.api.demo.param; import com.gitee.easyopen.doc.annotation.ApiDocField; import org.hibernate.validator.constraints.Length; -import org.hibernate.validator.constraints.NotEmpty; + +import javax.validation.constraints.NotEmpty; public class GoodsParam { diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/RouteListApi.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/RouteApi.java similarity index 64% rename from sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/RouteListApi.java rename to sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/RouteApi.java index 2a5321fd..d763792f 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/RouteListApi.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/RouteApi.java @@ -5,16 +5,19 @@ import com.gitee.easyopen.annotation.Api; import com.gitee.easyopen.annotation.ApiService; import com.gitee.easyopen.doc.annotation.ApiDoc; import com.gitee.easyopen.doc.annotation.ApiDocMethod; +import com.gitee.easyopen.exception.ApiException; import com.gitee.sop.adminserver.api.service.param.RouteSearchParam; -import com.gitee.sop.adminserver.api.service.param.UpdateRouteParam; +import com.gitee.sop.adminserver.api.service.param.RouteParam; +import com.gitee.sop.adminserver.api.service.result.ServiceInfo; import com.gitee.sop.adminserver.bean.GatewayRouteDefinition; -import com.gitee.sop.adminserver.bean.SopAdminConstants; import com.gitee.sop.adminserver.bean.ZookeeperContext; import org.apache.commons.lang.StringUtils; import org.apache.curator.framework.recipes.cache.ChildData; import org.springframework.beans.BeanUtils; +import java.text.SimpleDateFormat; import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -23,7 +26,7 @@ import java.util.stream.Collectors; */ @ApiService @ApiDoc("服务管理") -public class RouteListApi { +public class RouteApi { @Api(name = "route.list") @ApiDocMethod(description = "路由列表", elementClass = GatewayRouteDefinition.class) @@ -58,13 +61,33 @@ public class RouteListApi { @Api(name = "route.update") @ApiDocMethod(description = "修改路由") - void updateRoute(UpdateRouteParam param) throws Exception { + void updateRoute(RouteParam param) throws Exception { String serviceIdPath = ZookeeperContext.getSopRouteRootPath(param.getProfile()) + "/" + param.getServiceId(); String zookeeperRoutePath = serviceIdPath + "/" + param.getId(); String data = ZookeeperContext.getData(zookeeperRoutePath); GatewayRouteDefinition routeDefinition = JSON.parseObject(data, GatewayRouteDefinition.class); BeanUtils.copyProperties(param, routeDefinition); - ZookeeperContext.setData(zookeeperRoutePath, JSON.toJSONString(routeDefinition)); + ZookeeperContext.updatePathData(zookeeperRoutePath, JSON.toJSONString(routeDefinition)); + } + + @Api(name = "route.add") + @ApiDocMethod(description = "新增路由") + void addRoute(RouteParam param) throws Exception { + String serviceIdPath = ZookeeperContext.getSopRouteRootPath(param.getProfile()) + "/" + param.getServiceId(); + String zookeeperRoutePath = serviceIdPath + "/" + param.getId(); + if (ZookeeperContext.isPathExist(zookeeperRoutePath)) { + throw new ApiException("id已存在"); + } + GatewayRouteDefinition routeDefinition = new GatewayRouteDefinition(); + BeanUtils.copyProperties(param, routeDefinition); + ZookeeperContext.createNewData(zookeeperRoutePath, JSON.toJSONString(routeDefinition)); + ServiceInfo serviceInfo = new ServiceInfo(); + serviceInfo.setServiceId(param.getServiceId()); + serviceInfo.setDescription(param.getServiceId()); + String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + serviceInfo.setCreateTime(now); + serviceInfo.setUpdateTime(now); + ZookeeperContext.updatePathData(serviceIdPath, JSON.toJSONString(serviceInfo)); } } diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/ServiceApi.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/ServiceApi.java index 2598bc86..c1f2cfea 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/ServiceApi.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/ServiceApi.java @@ -17,8 +17,6 @@ import org.springframework.core.env.Environment; import java.util.List; import java.util.stream.Collectors; -import static com.gitee.sop.adminserver.bean.SopAdminConstants.SOP_SERVICE_ROUTE_PATH; - /** * @author tanghc */ @@ -37,6 +35,7 @@ public class ServiceApi { String routeRootPath = ZookeeperContext.getSopRouteRootPath(param.getProfile()); List childDataList = ZookeeperContext.getChildrenData(routeRootPath); List serviceInfoList = childDataList.stream() + .filter(childData -> childData.getData() != null && childData.getData().length > 0) .map(childData -> { String serviceNodeData = new String(childData.getData()); ServiceInfo serviceInfo = JSON.parseObject(serviceNodeData, ServiceInfo.class); diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/UpdateRouteParam.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/RouteParam.java similarity index 97% rename from sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/UpdateRouteParam.java rename to sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/RouteParam.java index f70bf6bb..73e95d83 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/UpdateRouteParam.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/RouteParam.java @@ -10,7 +10,7 @@ import javax.validation.constraints.NotNull; * @author tanghc */ @Data -public class UpdateRouteParam { +public class RouteParam { @NotBlank(message = "profile不能为空") @ApiDocField(description = "profile") diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/bean/ZookeeperContext.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/bean/ZookeeperContext.java index 0898f5d4..625f25ae 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/bean/ZookeeperContext.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/bean/ZookeeperContext.java @@ -1,5 +1,6 @@ package com.gitee.sop.adminserver.bean; +import com.gitee.easyopen.exception.ApiException; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; import org.apache.curator.framework.CuratorFramework; @@ -69,10 +70,36 @@ public class ZookeeperContext { } } - public static Stat setData(String path, String data) throws Exception { + /** + * 对已存在的path赋值 + * + * @param path 已存在的 + * @param data + * @return + * @throws Exception + */ + public static Stat updatePathData(String path, String data) throws Exception { + if (!isPathExist(path)) { + throw new ApiException("path " + path + " 不存在"); + } return getClient().setData().forPath(path, data.getBytes()); } + /** + * 创建新的path,并赋值 + * @param path 待创建的path + * @param data 值 + */ + public static String createNewData(String path, String data) throws Exception { + if (isPathExist(path)) { + throw new ApiException("path " + path + " 已存在"); + } + return getClient().create() + // 如果指定节点的父节点不存在,则Curator将会自动级联创建父节点 + .creatingParentContainersIfNeeded() + .forPath(path, data.getBytes()); + } + public static String getData(String path) throws Exception { if (!isPathExist(path)) { return null; @@ -83,6 +110,7 @@ public class ZookeeperContext { /** * 获取子节点数据 + * * @param parentPath 父节点 * @return * @throws Exception diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/config/WebConfig.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/config/WebConfig.java index e051661b..e96f7e79 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/config/WebConfig.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/config/WebConfig.java @@ -1,23 +1,17 @@ package com.gitee.sop.adminserver.config; -import org.apache.commons.lang.math.NumberUtils; -import org.apache.curator.framework.CuratorFramework; -import org.apache.curator.framework.CuratorFrameworkFactory; -import org.apache.curator.retry.ExponentialBackoffRetry; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; /** * @author thc */ @Configuration -public class WebConfig extends WebMvcConfigurerAdapter { +public class WebConfig extends WebMvcConfigurationSupport { diff --git a/sop-admin/sop-admin-server/src/main/resources/application-dev.yml b/sop-admin/sop-admin-server/src/main/resources/application-dev.yml index 9afe91d4..69dd6fe9 100644 --- a/sop-admin/sop-admin-server/src/main/resources/application-dev.yml +++ b/sop-admin/sop-admin-server/src/main/resources/application-dev.yml @@ -5,17 +5,20 @@ spring: application: name: sop-admin + # zookeeper客户端连接 cloud: zookeeper: connect-string: localhost:2181 baseSleepTimeMs: 3000 maxRetries: 3 +# 固定不用改 easyopen: show-doc: true mono: false ignore-validate: true +# 默认profile列表,新增可以在后面加 sop-admin: profiles: default,prod,dev,test diff --git a/sop-gateway-common/pom.xml b/sop-gateway-common/pom.xml index 6a4d2c6f..b861d3ae 100644 --- a/sop-gateway-common/pom.xml +++ b/sop-gateway-common/pom.xml @@ -85,6 +85,7 @@ org.springframework.cloud spring-cloud-starter-zookeeper-discovery + org.apache.zookeeper zookeeper