diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/service/ServerService.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/service/ServerService.java index 4949567e..4880084f 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/service/ServerService.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/service/ServerService.java @@ -1,9 +1,12 @@ package com.gitee.sop.adminserver.service; +import com.gitee.fastmybatis.core.query.Query; import com.gitee.sop.adminserver.api.service.param.ServiceSearchParam; import com.gitee.sop.adminserver.api.service.result.ServiceInstanceVO; import com.gitee.sop.adminserver.bean.ServiceInfo; import com.gitee.sop.adminserver.bean.ServiceInstance; +import com.gitee.sop.adminserver.entity.ConfigGrayInstance; +import com.gitee.sop.adminserver.mapper.ConfigGrayInstanceMapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.beans.BeanUtils; @@ -12,8 +15,12 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; +import java.util.stream.Collectors; /** * @author tanghc @@ -22,9 +29,13 @@ import java.util.concurrent.atomic.AtomicInteger; @Service public class ServerService { + public static final int GRAY_OPEN = 1; @Autowired private RegistryService registryService; + @Autowired + private ConfigGrayInstanceMapper grayInstanceMapper; + public List listService(ServiceSearchParam param) { List serviceInfos; try { @@ -33,6 +44,10 @@ public class ServerService { log.error("获取服务实例失败", e); return Collections.emptyList(); } + List configGrayInstances = grayInstanceMapper.list(new Query()); + // key: instanceId + Map grayInstanceMap = configGrayInstances.stream() + .collect(Collectors.toMap(ConfigGrayInstance::getInstanceId, Function.identity())); List serviceInfoVoList = new ArrayList<>(); AtomicInteger idGen = new AtomicInteger(1); serviceInfos.stream() @@ -58,12 +73,22 @@ public class ServerService { instanceVO.setId(id); instanceVO.setParentId(pid); if (instanceVO.getMetadata() == null) { - instanceVO.setMetadata(Collections.emptyMap()); + instanceVO.setMetadata(new HashMap<>(8)); } + bindGrayEnv(instanceVO, grayInstanceMap); serviceInfoVoList.add(instanceVO); } }); return serviceInfoVoList; } + + private void bindGrayEnv(ServiceInstanceVO instanceVO, Map grayInstanceMap) { + String instanceId = instanceVO.getInstanceId(); + ConfigGrayInstance configGrayInstance = grayInstanceMap.get(instanceId); + if (configGrayInstance != null && configGrayInstance.getStatus() == GRAY_OPEN) { + Map metadata = instanceVO.getMetadata(); + metadata.put("env", "gray"); + } + } } diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/route/NacosRegistryListener.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/route/NacosRegistryListener.java index bf9a6dce..a514f1b1 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/route/NacosRegistryListener.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/route/NacosRegistryListener.java @@ -33,6 +33,9 @@ public class NacosRegistryListener extends BaseRegistryListener { @Autowired private NacosDiscoveryProperties nacosDiscoveryProperties; + @Autowired(required = false) + private List registryEventList; + @Override public synchronized void onEvent(ApplicationEvent applicationEvent) { NamingService namingService = nacosDiscoveryProperties.namingServiceInstance(); @@ -86,13 +89,21 @@ public class NacosRegistryListener extends BaseRegistryListener { instanceDefinition.setPort(instance.getPort()); instanceDefinition.setMetadata(instance.getMetadata()); pullRoutes(instanceDefinition); + if (registryEventList != null) { + registryEventList.forEach(registryEvent -> registryEvent.onRegistry(instanceDefinition)); + } }); } // 如果有服务删除 Set removedServiceIdList = getRemovedServiceId(serviceNames); if (removedServiceIdList.size() > 0) { - removedServiceIdList.forEach(this::removeRoutes); + removedServiceIdList.forEach(serviceId->{ + this.removeRoutes(serviceId); + if (registryEventList != null) { + registryEventList.forEach(registryEvent -> registryEvent.onRemove(serviceId)); + } + }); } cacheServices = new HashSet<>(serviceNames); @@ -111,7 +122,6 @@ public class NacosRegistryListener extends BaseRegistryListener { return cache; } - @Data @AllArgsConstructor private static class InstanceInfo { diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/route/RegistryEvent.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/route/RegistryEvent.java new file mode 100644 index 00000000..5baf8c42 --- /dev/null +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/route/RegistryEvent.java @@ -0,0 +1,23 @@ +package com.gitee.sop.gatewaycommon.route; + +import com.gitee.sop.gatewaycommon.bean.InstanceDefinition; + +/** + * 新的实例注册事件 + * + * @author tanghc + */ +public interface RegistryEvent { + + /** + * 新实例注册进来时触发 + * @param instanceDefinition 实例信息 + */ + void onRegistry(InstanceDefinition instanceDefinition); + + /** + * 服务下线时触发 + * @param serviceId 服务id + */ + void onRemove(String serviceId); +} diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbEnvGrayManager.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbEnvGrayManager.java index c44c5ec5..4bf774d9 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbEnvGrayManager.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbEnvGrayManager.java @@ -6,8 +6,10 @@ import com.gitee.sop.gateway.entity.ConfigGrayInstance; import com.gitee.sop.gateway.mapper.ConfigGrayInstanceMapper; import com.gitee.sop.gateway.mapper.ConfigGrayMapper; import com.gitee.sop.gatewaycommon.bean.ChannelMsg; +import com.gitee.sop.gatewaycommon.bean.InstanceDefinition; import com.gitee.sop.gatewaycommon.bean.ServiceGrayDefinition; import com.gitee.sop.gatewaycommon.manager.DefaultEnvGrayManager; +import com.gitee.sop.gatewaycommon.route.RegistryEvent; import com.gitee.sop.gatewaycommon.zuul.loadbalancer.ServiceGrayConfig; import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; @@ -30,7 +32,7 @@ import java.util.stream.Stream; */ @Slf4j @Service -public class DbEnvGrayManager extends DefaultEnvGrayManager { +public class DbEnvGrayManager extends DefaultEnvGrayManager implements RegistryEvent { private static final int STATUS_ENABLE = 1; @@ -44,19 +46,26 @@ public class DbEnvGrayManager extends DefaultEnvGrayManager { private ConfigGrayInstanceMapper configGrayInstanceMapper; @Override - public void load() { + public void onRegistry(InstanceDefinition instanceDefinition) { + String instanceId = instanceDefinition.getInstanceId(); + ConfigGrayInstance grayInstance = configGrayInstanceMapper.getByColumn("instance_id", instanceId); + if (grayInstance != null && grayInstance.getStatus() == STATUS_ENABLE) { + log.info("实例[{}]开启灰度发布", grayInstance.getInstanceId()); + this.openGray(grayInstance.getInstanceId(), grayInstance.getServiceId()); + } + } + @Override + public void onRemove(String serviceId) { + + } + + @Override + public void load() { List list = configGrayMapper.list(new Query()); for (ConfigGray configGray : list) { this.setServiceGrayConfig(configGray); } - - Query query = new Query(); - query.eq("status", STATUS_ENABLE); - List grayInstanceList = configGrayInstanceMapper.list(query); - for (ConfigGrayInstance configGrayInstance : grayInstanceList) { - this.openGray(configGrayInstance.getInstanceId(), configGrayInstance.getServiceId()); - } } /** diff --git a/sop-test/src/test/java/com/gitee/sop/test/AlipayClientPostTest.java b/sop-test/src/test/java/com/gitee/sop/test/AlipayClientPostTest.java index 82d76fa1..08d062b2 100644 --- a/sop-test/src/test/java/com/gitee/sop/test/AlipayClientPostTest.java +++ b/sop-test/src/test/java/com/gitee/sop/test/AlipayClientPostTest.java @@ -1,7 +1,6 @@ package com.gitee.sop.test; import com.alibaba.fastjson.JSON; -import com.gitee.sop.test.alipay.AlipayApiException; import com.gitee.sop.test.alipay.AlipaySignature; import org.junit.Test; @@ -37,6 +36,8 @@ public class AlipayClientPostTest extends TestBase { @Test public void testGet() throws Exception { + // 接口实现见:com.gitee.sop.storyweb.controller.AlipayController.getStory + // 公共请求参数 Map params = new HashMap(); params.put("app_id", appId); @@ -71,123 +72,4 @@ public class AlipayClientPostTest extends TestBase { } - - // 忽略验证,不校验签名,只需传接口名、版本号、业务参数 - @Test - public void testIgnore() { - // 公共请求参数 - Map params = new HashMap(); - params.put("method", "story.get"); - params.put("version", "2.1"); - // 业务参数 - Map bizContent = new HashMap<>(); - bizContent.put("id", "222"); - bizContent.put("name", "忽略验证name"); - - params.put("biz_content", JSON.toJSONString(bizContent)); - - System.out.println("----------- 返回结果 -----------"); - String responseData = post(url, params);// 发送请求 - System.out.println(responseData); - } - - @Test - public void testStoryget() throws AlipayApiException { - // 公共请求参数 - Map params = new HashMap(); - params.put("app_id", appId); - params.put("method", "story.get"); - params.put("version", "2.2"); - params.put("format", "json"); - params.put("charset", "utf-8"); - params.put("sign_type", "RSA2"); - params.put("timestamp", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); - // 业务参数 - Map bizContent = new HashMap<>(); - bizContent.put("id", "222"); - bizContent.put("name", "忽略验证22"); - - params.put("biz_content", JSON.toJSONString(bizContent)); - - System.out.println("----------- 请求信息 -----------"); - System.out.println("请求参数:" + buildParamQuery(params)); - System.out.println("商户秘钥:" + privateKey); - String content = AlipaySignature.getSignContent(params); - System.out.println("待签名内容:" + content); - String sign = AlipaySignature.rsa256Sign(content, privateKey, "utf-8"); - System.out.println("签名(sign):" + sign); - - params.put("sign", sign); - - System.out.println("----------- 返回结果 -----------"); - String responseData = post(url, params);// 发送请求 - System.out.println(responseData); - } - - @Test - public void testGetStory2() throws AlipayApiException { - // 公共请求参数 - Map params = new HashMap(); - params.put("app_id", appId); - params.put("method", "getStory2"); - params.put("version", "1.0"); - params.put("format", "json"); - params.put("charset", "utf-8"); - params.put("sign_type", "RSA2"); - params.put("timestamp", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); - // 业务参数 - Map bizContent = new HashMap<>(); - bizContent.put("name", "Jim"); - bizContent.put("age", "2"); - - params.put("biz_content", JSON.toJSONString(bizContent)); - - System.out.println("----------- 请求信息 -----------"); - System.out.println("请求参数:" + buildParamQuery(params)); - System.out.println("商户秘钥:" + privateKey); - String content = AlipaySignature.getSignContent(params); - System.out.println("待签名内容:" + content); - String sign = AlipaySignature.rsa256Sign(content, privateKey, "utf-8"); - System.out.println("签名(sign):" + sign); - - params.put("sign", sign); - - System.out.println("----------- 返回结果 -----------"); - String responseData = get(url, params);// 发送请求 - System.out.println(responseData); - } - - @Test - public void testGetJson() throws AlipayApiException { - // 公共请求参数 - Map params = new HashMap(); - params.put("app_id", appId); - params.put("method", "getJson"); - params.put("version", "1.0"); - params.put("format", "json"); - params.put("charset", "utf-8"); - params.put("sign_type", "RSA2"); - params.put("timestamp", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); - // 业务参数 - Map bizContent = new HashMap<>(); - bizContent.put("name", "Jim"); - bizContent.put("age", "2"); - - params.put("biz_content", JSON.toJSONString(bizContent)); - - System.out.println("----------- 请求信息 -----------"); - System.out.println("请求参数:" + buildParamQuery(params)); - System.out.println("商户秘钥:" + privateKey); - String content = AlipaySignature.getSignContent(params); - System.out.println("待签名内容:" + content); - String sign = AlipaySignature.rsa256Sign(content, privateKey, "utf-8"); - System.out.println("签名(sign):" + sign); - - params.put("sign", sign); - - System.out.println("----------- 返回结果 -----------"); - String responseData = get(url, params);// 发送请求 - System.out.println(responseData); - } - }