mirror of
https://gitee.com/durcframework/SOP.git
synced 2025-08-11 21:57:56 +08:00
4.2.7
This commit is contained in:
@@ -1,5 +1,9 @@
|
|||||||
# changelog
|
# changelog
|
||||||
|
|
||||||
|
## 4.2.7
|
||||||
|
|
||||||
|
- 修复两个微服务相同path问题
|
||||||
|
|
||||||
## 4.2.6
|
## 4.2.6
|
||||||
|
|
||||||
- 优化网关超时处理
|
- 优化网关超时处理
|
||||||
|
2
pom.xml
2
pom.xml
@@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<!-- Project revision -->
|
<!-- Project revision -->
|
||||||
<revision>4.2.6-SNAPSHOT</revision>
|
<revision>4.2.7-SNAPSHOT</revision>
|
||||||
<java.version>1.8</java.version>
|
<java.version>1.8</java.version>
|
||||||
|
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
@@ -19,4 +19,6 @@ public interface TargetRoute {
|
|||||||
*/
|
*/
|
||||||
RouteDefinition getRouteDefinition();
|
RouteDefinition getRouteDefinition();
|
||||||
|
|
||||||
|
String getFullPath();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -61,7 +61,7 @@ public class ServerWebExchangeUtil {
|
|||||||
.mutate();
|
.mutate();
|
||||||
ServerHttpRequest newRequest = builder
|
ServerHttpRequest newRequest = builder
|
||||||
.header(ParamNames.HEADER_VERSION_NAME, forwardInfo.getVersion())
|
.header(ParamNames.HEADER_VERSION_NAME, forwardInfo.getVersion())
|
||||||
.path(forwardInfo.getPath()).build();
|
.path(forwardInfo.getFullPath()).build();
|
||||||
return exchange.mutate().request(newRequest).build();
|
return exchange.mutate().request(newRequest).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -6,6 +6,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
|
import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
|
||||||
|
import org.springframework.cloud.gateway.filter.factory.RewritePathGatewayFilterFactory;
|
||||||
import org.springframework.cloud.gateway.route.Route;
|
import org.springframework.cloud.gateway.route.Route;
|
||||||
import org.springframework.cloud.gateway.route.RouteLocator;
|
import org.springframework.cloud.gateway.route.RouteLocator;
|
||||||
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
|
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
|
||||||
@@ -48,15 +49,20 @@ public class GatewayRouteRepository implements RouteRepository<GatewayTargetRout
|
|||||||
|
|
||||||
public void refresh() {
|
public void refresh() {
|
||||||
RouteLocatorBuilder.Builder builder = routeLocatorBuilder.routes();
|
RouteLocatorBuilder.Builder builder = routeLocatorBuilder.routes();
|
||||||
List<RouteDefinition> routeDefinitionList = routes.values()
|
routes.values().forEach(gatewayTargetRoute -> {
|
||||||
.stream()
|
RouteDefinition routeDefinition = gatewayTargetRoute.getRouteDefinition();
|
||||||
.map(GatewayTargetRoute::getRouteDefinition)
|
RewritePathGatewayFilterFactory rewritePathGatewayFilterFactory = new RewritePathGatewayFilterFactory();
|
||||||
.collect(Collectors.toList());
|
RewritePathGatewayFilterFactory.Config config = new RewritePathGatewayFilterFactory.Config();
|
||||||
routeDefinitionList.forEach(routeDefinition -> builder.route(routeDefinition.getId(),
|
config.setRegexp(gatewayTargetRoute.getFullPath());
|
||||||
|
config.setReplacement(routeDefinition.getPath());
|
||||||
|
builder.route(routeDefinition.getId(),
|
||||||
r -> r.path(routeDefinition.getPath())
|
r -> r.path(routeDefinition.getPath())
|
||||||
.uri(routeDefinition.getUri())));
|
// path匹配
|
||||||
|
.filters(gatewayFilterSpec -> gatewayFilterSpec.filter(rewritePathGatewayFilterFactory.apply(config)))
|
||||||
|
.uri(routeDefinition.getUri())
|
||||||
|
);
|
||||||
|
});
|
||||||
this.routeLocator = builder.build();
|
this.routeLocator = builder.build();
|
||||||
|
|
||||||
// 触发
|
// 触发
|
||||||
applicationContext.publishEvent(new RefreshRoutesEvent(new Object()));
|
applicationContext.publishEvent(new RefreshRoutesEvent(new Object()));
|
||||||
}
|
}
|
||||||
|
@@ -3,6 +3,7 @@ package com.gitee.sop.gatewaycommon.gateway.route;
|
|||||||
import com.gitee.sop.gatewaycommon.bean.RouteDefinition;
|
import com.gitee.sop.gatewaycommon.bean.RouteDefinition;
|
||||||
import com.gitee.sop.gatewaycommon.bean.ServiceDefinition;
|
import com.gitee.sop.gatewaycommon.bean.ServiceDefinition;
|
||||||
import com.gitee.sop.gatewaycommon.bean.TargetRoute;
|
import com.gitee.sop.gatewaycommon.bean.TargetRoute;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author tanghc
|
* @author tanghc
|
||||||
@@ -18,6 +19,13 @@ public class GatewayTargetRoute implements TargetRoute {
|
|||||||
this.routeDefinition = routeDefinition;
|
this.routeDefinition = routeDefinition;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFullPath() {
|
||||||
|
String serviceId = serviceDefinition.getServiceId();
|
||||||
|
String path = StringUtils.trimLeadingCharacter(routeDefinition.getPath(), '/');
|
||||||
|
return "/" + serviceId + "/" + path;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ServiceDefinition getServiceDefinition() {
|
public ServiceDefinition getServiceDefinition() {
|
||||||
return serviceDefinition;
|
return serviceDefinition;
|
||||||
|
@@ -19,6 +19,10 @@ public class ForwardInfo {
|
|||||||
this.targetRoute = targetRoute;
|
this.targetRoute = targetRoute;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getFullPath() {
|
||||||
|
return targetRoute.getFullPath();
|
||||||
|
}
|
||||||
|
|
||||||
public String getPath() {
|
public String getPath() {
|
||||||
return targetRoute.getRouteDefinition().getPath();
|
return targetRoute.getRouteDefinition().getPath();
|
||||||
}
|
}
|
||||||
@@ -41,6 +45,11 @@ public class ForwardInfo {
|
|||||||
super(targetRoute);
|
super(targetRoute);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFullPath() {
|
||||||
|
return getPath();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getPath() {
|
public String getPath() {
|
||||||
return VALIDATE_ERROR_PATH;
|
return VALIDATE_ERROR_PATH;
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
package com.gitee.app.controller;
|
package com.gitee.app.controller;
|
||||||
|
|
||||||
import com.gitee.app.model.Goods;
|
import com.gitee.app.model.Goods;
|
||||||
|
import com.gitee.app.model.StoryParam;
|
||||||
import com.gitee.sop.servercommon.annotation.Open;
|
import com.gitee.sop.servercommon.annotation.Open;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
@@ -56,4 +57,12 @@ public class HomeController {
|
|||||||
return goods;
|
return goods;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Open("springmvc.path.same")
|
||||||
|
@RequestMapping("iam_same_path")
|
||||||
|
@ResponseBody
|
||||||
|
public Object iam_same_path(StoryParam param) {
|
||||||
|
param.setName(param.getName() + " mvc..");
|
||||||
|
return param;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,23 @@
|
|||||||
|
package com.gitee.app.model;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.hibernate.validator.constraints.Length;
|
||||||
|
|
||||||
|
import javax.validation.constraints.Max;
|
||||||
|
import javax.validation.constraints.NotBlank;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class StoryParam {
|
||||||
|
@ApiModelProperty(value = "故事ID", example = "111")
|
||||||
|
private int id;
|
||||||
|
|
||||||
|
@NotBlank(message = "name不能为空")
|
||||||
|
@Length(max = 20, message = "name长度不能超过20")
|
||||||
|
@ApiModelProperty(value = "故事名称", required = true, example = "白雪公主", position = 3)
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "备注 (第二)", example = "xx", position = 2)
|
||||||
|
@Length(max = 64, message = "长度不能超过64")
|
||||||
|
private String remark;
|
||||||
|
}
|
@@ -0,0 +1,22 @@
|
|||||||
|
package com.gitee.sop.storyweb.controller;
|
||||||
|
|
||||||
|
import com.gitee.sop.servercommon.annotation.Open;
|
||||||
|
import com.gitee.sop.storyweb.controller.param.StoryParam;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 模拟超时设置
|
||||||
|
*
|
||||||
|
* @author tanghc
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
public class Example1010_SamePathController {
|
||||||
|
|
||||||
|
@Open("story.path.same")
|
||||||
|
@RequestMapping("iam_same_path")
|
||||||
|
public Object iam_same_path(StoryParam param) {
|
||||||
|
param.setName(param.getName() + " story..");
|
||||||
|
return param;
|
||||||
|
}
|
||||||
|
}
|
96
sop-test/src/test/java/com/gitee/sop/test/SamePathTest.java
Normal file
96
sop-test/src/test/java/com/gitee/sop/test/SamePathTest.java
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
package com.gitee.sop.test;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import com.gitee.sop.test.alipay.AlipaySignature;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 超时测试
|
||||||
|
*/
|
||||||
|
public class SamePathTest extends TestBase {
|
||||||
|
|
||||||
|
String url = "http://localhost:8081";
|
||||||
|
String appId = "2019032617262200001";
|
||||||
|
// 平台提供的私钥
|
||||||
|
String privateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCXJv1pQFqWNA/++OYEV7WYXwexZK/J8LY1OWlP9X0T6wHFOvxNKRvMkJ5544SbgsJpVcvRDPrcxmhPbi/sAhdO4x2PiPKIz9Yni2OtYCCeaiE056B+e1O2jXoLeXbfi9fPivJZkxH/tb4xfLkH3bA8ZAQnQsoXA0SguykMRZntF0TndUfvDrLqwhlR8r5iRdZLB6F8o8qXH6UPDfNEnf/K8wX5T4EB1b8x8QJ7Ua4GcIUqeUxGHdQpzNbJdaQvoi06lgccmL+PHzminkFYON7alj1CjDN833j7QMHdPtS9l7B67fOU/p2LAAkPMtoVBfxQt9aFj7B8rEhGCz02iJIBAgMBAAECggEARqOuIpY0v6WtJBfmR3lGIOOokLrhfJrGTLF8CiZMQha+SRJ7/wOLPlsH9SbjPlopyViTXCuYwbzn2tdABigkBHYXxpDV6CJZjzmRZ+FY3S/0POlTFElGojYUJ3CooWiVfyUMhdg5vSuOq0oCny53woFrf32zPHYGiKdvU5Djku1onbDU0Lw8w+5tguuEZ76kZ/lUcccGy5978FFmYpzY/65RHCpvLiLqYyWTtaNT1aQ/9pw4jX9HO9NfdJ9gYFK8r/2f36ZE4hxluAfeOXQfRC/WhPmiw/ReUhxPznG/WgKaa/OaRtAx3inbQ+JuCND7uuKeRe4osP2jLPHPP6AUwQKBgQDUNu3BkLoKaimjGOjCTAwtp71g1oo+k5/uEInAo7lyEwpV0EuUMwLA/HCqUgR4K9pyYV+Oyb8d6f0+Hz0BMD92I2pqlXrD7xV2WzDvyXM3s63NvorRooKcyfd9i6ccMjAyTR2qfLkxv0hlbBbsPHz4BbU63xhTJp3Ghi0/ey/1HQKBgQC2VsgqC6ykfSidZUNLmQZe3J0p/Qf9VLkfrQ+xaHapOs6AzDU2H2osuysqXTLJHsGfrwVaTs00ER2z8ljTJPBUtNtOLrwNRlvgdnzyVAKHfOgDBGwJgiwpeE9voB1oAV/mXqSaUWNnuwlOIhvQEBwekqNyWvhLqC7nCAIhj3yvNQKBgQCqYbeec56LAhWP903Zwcj9VvG7sESqXUhIkUqoOkuIBTWFFIm54QLTA1tJxDQGb98heoCIWf5x/A3xNI98RsqNBX5JON6qNWjb7/dobitti3t99v/ptDp9u8JTMC7penoryLKK0Ty3bkan95Kn9SC42YxaSghzqkt+uvfVQgiNGQKBgGxU6P2aDAt6VNwWosHSe+d2WWXt8IZBhO9d6dn0f7ORvcjmCqNKTNGgrkewMZEuVcliueJquR47IROdY8qmwqcBAN7Vg2K7r7CPlTKAWTRYMJxCT1Hi5gwJb+CZF3+IeYqsJk2NF2s0w5WJTE70k1BSvQsfIzAIDz2yE1oPHvwVAoGAA6e+xQkVH4fMEph55RJIZ5goI4Y76BSvt2N5OKZKd4HtaV+eIhM3SDsVYRLIm9ZquJHMiZQGyUGnsvrKL6AAVNK7eQZCRDk9KQz+0GKOGqku0nOZjUbAu6A2/vtXAaAuFSFx1rUQVVjFulLexkXR3KcztL1Qu2k5pB6Si0K/uwQ=";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGet() throws Exception {
|
||||||
|
|
||||||
|
// 公共请求参数
|
||||||
|
Map<String, String> params = new HashMap<String, String>();
|
||||||
|
params.put("app_id", appId);
|
||||||
|
params.put("method", "story.path.same");
|
||||||
|
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()));
|
||||||
|
params.put("version", "1.0");
|
||||||
|
|
||||||
|
// 业务参数
|
||||||
|
Map<String, Object> bizContent = new HashMap<>();
|
||||||
|
bizContent.put("id", "1");
|
||||||
|
bizContent.put("name", "葫芦娃");
|
||||||
|
|
||||||
|
params.put("biz_content", JSON.toJSONString(bizContent));
|
||||||
|
String content = AlipaySignature.getSignContent(params);
|
||||||
|
String sign = AlipaySignature.rsa256Sign(content, privateKey, "utf-8");
|
||||||
|
params.put("sign", sign);
|
||||||
|
|
||||||
|
System.out.println("----------- 请求信息 -----------");
|
||||||
|
System.out.println("请求参数:" + buildParamQuery(params));
|
||||||
|
System.out.println("商户秘钥:" + privateKey);
|
||||||
|
System.out.println("待签名内容:" + content);
|
||||||
|
System.out.println("签名(sign):" + sign);
|
||||||
|
System.out.println("URL参数:" + buildUrlQuery(params));
|
||||||
|
|
||||||
|
System.out.println("----------- 返回结果 -----------");
|
||||||
|
String responseData = get(url, params);// 发送请求
|
||||||
|
System.out.println(responseData);
|
||||||
|
Assert.assertTrue(responseData.contains("葫芦娃 story.."));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGet2() throws Exception {
|
||||||
|
|
||||||
|
// 公共请求参数
|
||||||
|
Map<String, String> params = new HashMap<String, String>();
|
||||||
|
params.put("app_id", appId);
|
||||||
|
params.put("method", "springmvc.path.same");
|
||||||
|
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()));
|
||||||
|
params.put("version", "1.0");
|
||||||
|
|
||||||
|
// 业务参数
|
||||||
|
Map<String, Object> bizContent = new HashMap<>();
|
||||||
|
bizContent.put("id", "1");
|
||||||
|
bizContent.put("name", "葫芦娃");
|
||||||
|
|
||||||
|
params.put("biz_content", JSON.toJSONString(bizContent));
|
||||||
|
String content = AlipaySignature.getSignContent(params);
|
||||||
|
String sign = AlipaySignature.rsa256Sign(content, privateKey, "utf-8");
|
||||||
|
params.put("sign", sign);
|
||||||
|
|
||||||
|
System.out.println("----------- 请求信息 -----------");
|
||||||
|
System.out.println("请求参数:" + buildParamQuery(params));
|
||||||
|
System.out.println("商户秘钥:" + privateKey);
|
||||||
|
System.out.println("待签名内容:" + content);
|
||||||
|
System.out.println("签名(sign):" + sign);
|
||||||
|
System.out.println("URL参数:" + buildUrlQuery(params));
|
||||||
|
|
||||||
|
System.out.println("----------- 返回结果 -----------");
|
||||||
|
String responseData = get(url, params);// 发送请求
|
||||||
|
System.out.println(responseData);
|
||||||
|
Assert.assertTrue(responseData.contains("葫芦娃 mvc.."));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user