Skip to content

Commit e825210

Browse files
committed
优化代码:
后端添加service context-path 查看client的灰度信息
1 parent da1bfb1 commit e825210

File tree

10 files changed

+287
-67
lines changed

10 files changed

+287
-67
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package cn.springcloud.gray.exceptions;
2+
3+
/**
4+
* @author saleson
5+
* @date 2019-11-25 21:53
6+
*/
7+
public class NotFoundException extends RuntimeException {
8+
9+
public NotFoundException() {
10+
}
11+
12+
public NotFoundException(String message) {
13+
super(message);
14+
}
15+
}

spring-cloud-gray-plugins/spring-cloud-gray-plugin-webmvc/src/main/java/cn/springcloud/gray/web/resources/GrayClientTrackResource.java

Lines changed: 0 additions & 37 deletions
This file was deleted.
Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import cn.springcloud.gray.GrayManager;
44
import cn.springcloud.gray.api.ApiRes;
55
import cn.springcloud.gray.model.GrayInstance;
6+
import cn.springcloud.gray.model.GrayTrackDefinition;
7+
import cn.springcloud.gray.request.track.GrayTrackHolder;
68
import org.springframework.beans.factory.annotation.Autowired;
79
import org.springframework.web.bind.annotation.GetMapping;
810
import org.springframework.web.bind.annotation.RequestMapping;
@@ -16,8 +18,14 @@
1618
* @date 2019-11-24 12:12
1719
*/
1820
@RestController
19-
@RequestMapping("/gray/service")
20-
public class GrayClientServiceResource {
21+
@RequestMapping("/gray/list")
22+
public class GrayListResource {
23+
24+
25+
@Autowired
26+
private GrayTrackHolder grayTrackHolder;
27+
28+
2129
@Autowired
2230
private GrayManager grayManager;
2331

@@ -26,11 +34,22 @@ public class GrayClientServiceResource {
2634
*
2735
* @return
2836
*/
29-
@GetMapping("/allInfos")
37+
@GetMapping("/service/allInfos")
3038
public ApiRes<Map<String, Collection<GrayInstance>>> getAllGrayServiceInfos() {
3139
return ApiRes.<Map<String, Collection<GrayInstance>>>builder()
3240
.data(grayManager.getMapByAllGrayServices())
3341
.build();
3442
}
3543

44+
/**
45+
* 返回维护的所有灰度追踪信息
46+
*
47+
* @return
48+
*/
49+
@GetMapping("/track/allDefinitions")
50+
public ApiRes<Collection<GrayTrackDefinition>> getAllGrayTracks() {
51+
return ApiRes.<Collection<GrayTrackDefinition>>builder()
52+
.data(grayTrackHolder.getTrackDefinitions())
53+
.build();
54+
}
3655
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package cn.springcloud.gray.server;
2+
3+
import cn.springcloud.gray.server.discovery.ServiceDiscovery;
4+
import cn.springcloud.gray.server.module.client.ClientRemoteModule;
5+
import cn.springcloud.gray.server.module.client.DefaultClientRemoteModule;
6+
import cn.springcloud.gray.server.module.gray.GrayServerModule;
7+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
8+
import org.springframework.context.annotation.Bean;
9+
import org.springframework.context.annotation.Configuration;
10+
11+
/**
12+
* @author saleson
13+
* @date 2019-11-25 22:45
14+
*/
15+
@Configuration
16+
public class ClientRemoteConfiguration {
17+
18+
19+
@Bean
20+
@ConditionalOnMissingBean
21+
public ClientRemoteModule clientRemoteModule(ServiceDiscovery serviceDiscovery, GrayServerModule grayServerModule) {
22+
return new DefaultClientRemoteModule(serviceDiscovery, grayServerModule);
23+
}
24+
25+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package cn.springcloud.gray.server.module.client;
2+
3+
import java.util.function.Consumer;
4+
import java.util.function.Function;
5+
6+
/**
7+
* @author saleson
8+
* @date 2019-11-25 20:38
9+
*/
10+
public interface ClientRemoteModule {
11+
12+
/**
13+
* 获取客户端的路径
14+
*
15+
* @return
16+
*/
17+
String getClientPath(String serviceId, String instanceId);
18+
19+
20+
/**
21+
* 调用客户端接口,并返回结果
22+
*
23+
* @param serviceId
24+
* @param instanceId
25+
* @param uri
26+
* @param function
27+
* @param <T>
28+
* @return
29+
*/
30+
<T> T callClient(String serviceId, String instanceId, String uri, Function<String, T> function);
31+
32+
33+
/**
34+
* 调用客户端接口
35+
*
36+
* @param serviceId
37+
* @param instanceId
38+
* @param uri
39+
* @param consumer
40+
*/
41+
void callClient(String serviceId, String instanceId, String uri, Consumer<String> consumer);
42+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package cn.springcloud.gray.server.module.client;
2+
3+
import cn.springcloud.gray.exceptions.NotFoundException;
4+
import cn.springcloud.gray.model.InstanceInfo;
5+
import cn.springcloud.gray.server.discovery.ServiceDiscovery;
6+
import cn.springcloud.gray.server.module.gray.GrayServerModule;
7+
import org.apache.commons.lang3.StringUtils;
8+
9+
import java.util.Objects;
10+
import java.util.function.Consumer;
11+
import java.util.function.Function;
12+
13+
/**
14+
* @author saleson
15+
* @date 2019-11-25 20:46
16+
*/
17+
public class DefaultClientRemoteModule implements ClientRemoteModule {
18+
19+
private ServiceDiscovery serviceDiscovery;
20+
private GrayServerModule grayServerModule;
21+
22+
public DefaultClientRemoteModule(ServiceDiscovery serviceDiscovery, GrayServerModule grayServerModule) {
23+
this.serviceDiscovery = serviceDiscovery;
24+
this.grayServerModule = grayServerModule;
25+
}
26+
27+
@Override
28+
public String getClientPath(String serviceId, String instanceId) {
29+
InstanceInfo instanceInfo = serviceDiscovery.getInstanceInfo(serviceId, instanceId);
30+
if (instanceInfo == null) {
31+
throw new NotFoundException();
32+
}
33+
if (StringUtils.isEmpty(instanceInfo.getHost()) || Objects.equals(instanceInfo.getPort(), 0)) {
34+
throw new IllegalArgumentException();
35+
}
36+
37+
String contextPath = grayServerModule.getServiceContextPath(serviceId);
38+
StringBuilder path = new StringBuilder("http://")
39+
.append(instanceInfo.getHost())
40+
.append(":")
41+
.append(instanceInfo.getPort())
42+
.append(contextPath);
43+
return path.toString();
44+
}
45+
46+
@Override
47+
public <T> T callClient(String serviceId, String instanceId, String uri, Function<String, T> function) {
48+
return function.apply(getClientPath(serviceId, instanceId) + uri);
49+
}
50+
51+
@Override
52+
public void callClient(String serviceId, String instanceId, String uri, Consumer<String> consumer) {
53+
consumer.accept(getClientPath(serviceId, instanceId) + uri);
54+
}
55+
56+
}

spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/gray/GrayServerModule.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import java.util.Collection;
1313
import java.util.List;
14+
import java.util.Objects;
1415

1516
public interface GrayServerModule {
1617

@@ -69,7 +70,10 @@ default void openGray(String instanceId) {
6970

7071
GrayService getGrayService(String id);
7172

72-
String getServiceContextPath(String serviceId);
73+
default String getServiceContextPath(String serviceId) {
74+
GrayService grayService = getGrayService(serviceId);
75+
return Objects.isNull(grayService) ? "" : grayService.getContextPath();
76+
}
7377

7478
List<GrayPolicy> listGrayPoliciesByInstanceId(String instanceId);
7579

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package cn.springcloud.gray.server.resources;
2+
3+
import cn.springcloud.gray.api.ApiRes;
4+
import cn.springcloud.gray.exceptions.NotFoundException;
5+
import org.apache.commons.lang3.StringUtils;
6+
import org.springframework.http.HttpStatus;
7+
import org.springframework.web.bind.annotation.ControllerAdvice;
8+
import org.springframework.web.bind.annotation.ExceptionHandler;
9+
import org.springframework.web.bind.annotation.ResponseBody;
10+
import org.springframework.web.bind.annotation.ResponseStatus;
11+
12+
/**
13+
* @author saleson
14+
* @date 2019-11-25 21:49
15+
*/
16+
@ControllerAdvice
17+
public class ExceptionTranslator {
18+
19+
20+
@ExceptionHandler(NotFoundException.class)
21+
@ResponseStatus(HttpStatus.NOT_FOUND)
22+
@ResponseBody
23+
public ApiRes<Void> processNotFoundException(NotFoundException ex) {
24+
return ApiRes.<Void>builder()
25+
.code(ApiRes.CODE_NOT_FOUND)
26+
.message(StringUtils.defaultIfEmpty(ex.getMessage(), HttpStatus.NOT_FOUND.getReasonPhrase()))
27+
.build();
28+
}
29+
30+
31+
@ExceptionHandler(NotFoundException.class)
32+
@ResponseStatus(HttpStatus.BAD_REQUEST)
33+
@ResponseBody
34+
public ApiRes<Void> processIllegalArgumentException(IllegalArgumentException ex) {
35+
return ApiRes.<Void>builder()
36+
.code(String.valueOf(HttpStatus.BAD_REQUEST))
37+
.message(StringUtils.defaultIfEmpty(ex.getMessage(), "instance host or port is empty"))
38+
.build();
39+
}
40+
41+
42+
@ExceptionHandler(Exception.class)
43+
@ResponseStatus(HttpStatus.BAD_REQUEST)
44+
@ResponseBody
45+
public ApiRes<Void> processException(Exception ex) {
46+
return ApiRes.<Void>builder()
47+
.code(String.valueOf(HttpStatus.BAD_REQUEST))
48+
.message(StringUtils.defaultIfEmpty(ex.getMessage(), "error"))
49+
.build();
50+
}
51+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package cn.springcloud.gray.server.resources.rest;
2+
3+
import cn.springcloud.gray.api.ApiRes;
4+
import cn.springcloud.gray.model.GrayInstance;
5+
import cn.springcloud.gray.model.GrayTrackDefinition;
6+
import cn.springcloud.gray.server.module.client.ClientRemoteModule;
7+
import com.fasterxml.jackson.core.type.TypeReference;
8+
import com.fasterxml.jackson.databind.ObjectMapper;
9+
import org.springframework.beans.factory.annotation.Autowired;
10+
import org.springframework.http.HttpMethod;
11+
import org.springframework.web.bind.annotation.GetMapping;
12+
import org.springframework.web.bind.annotation.RequestMapping;
13+
import org.springframework.web.bind.annotation.RequestParam;
14+
import org.springframework.web.client.RestTemplate;
15+
16+
import java.util.List;
17+
import java.util.Map;
18+
19+
/**
20+
* @author saleson
21+
* @date 2019-11-24 14:40
22+
*/
23+
@RequestMapping("/gray/client/grayList")
24+
public class ClientGrayListResource {
25+
26+
@Autowired
27+
private ClientRemoteModule clientRemoteModule;
28+
29+
@Autowired
30+
private RestTemplate restTemplate;
31+
32+
private ObjectMapper objectMapper = new ObjectMapper();
33+
34+
@GetMapping("/track/allDefinitions")
35+
public ApiRes<List<GrayTrackDefinition>> getAllGrayTracks(
36+
@RequestParam("serviceId") String serviceId,
37+
@RequestParam("instanceId") String instanceId) {
38+
return clientRemoteModule.callClient(serviceId, instanceId,
39+
"/gray/list/track/allDefinitions", url -> {
40+
return restTemplate.execute(url, HttpMethod.GET, null, res -> {
41+
return objectMapper.readValue(res.getBody(), new TypeReference<ApiRes<List<GrayTrackDefinition>>>() {
42+
});
43+
});
44+
});
45+
}
46+
47+
48+
@GetMapping("/service/allInfos")
49+
public ApiRes<Map<String, List<GrayInstance>>> getAllGrayServiceInfos(
50+
@RequestParam("serviceId") String serviceId,
51+
@RequestParam("instanceId") String instanceId) {
52+
return clientRemoteModule.callClient(serviceId, instanceId,
53+
"/gray/list/service/allInfos", url -> {
54+
return restTemplate.execute(url, HttpMethod.GET, null, res -> {
55+
return objectMapper.readValue(res.getBody(), new TypeReference<ApiRes<Map<String, List<GrayInstance>>>>() {
56+
});
57+
});
58+
});
59+
}
60+
61+
}

0 commit comments

Comments
 (0)