Skip to content

Commit d07141a

Browse files
committed
refactor(excel): 使用 spring interface 重构网络请求
1 parent 74cedc8 commit d07141a

File tree

3 files changed

+78
-46
lines changed

3 files changed

+78
-46
lines changed
Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
11
package com.pig4cloud.pig.common.excel;
22

3+
import com.pig4cloud.pig.common.core.constant.SecurityConstants;
4+
import com.pig4cloud.pig.common.core.constant.ServiceNameConstants;
5+
import com.pig4cloud.pig.common.core.util.SpringContextHolder;
6+
import com.pig4cloud.pig.common.excel.provider.RemoteDictApiService;
37
import com.pig4cloud.pig.common.excel.provider.RemoteDictDataProvider;
48
import com.pig4cloud.plugin.excel.handler.DictDataProvider;
59
import org.springframework.boot.autoconfigure.AutoConfiguration;
610
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
11+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
12+
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
713
import org.springframework.context.annotation.Bean;
8-
import org.springframework.web.client.RestTemplate;
14+
import org.springframework.web.client.RestClient;
15+
import org.springframework.web.client.support.RestClientAdapter;
16+
import org.springframework.web.service.invoker.HttpServiceProxyFactory;
17+
18+
import java.util.Optional;
919

1020
/**
1121
* excel 自动装配类
@@ -17,24 +27,55 @@
1727
public class ExcelAutoConfiguration {
1828

1929
/**
20-
* REST 模板
21-
* @return {@link RestTemplate }
30+
* REST 客户端构建器(支持负载均衡)
31+
* @return {@link RestClient.Builder }
32+
*/
33+
@Bean
34+
@LoadBalanced
35+
@ConditionalOnProperty(value = "spring.cloud.nacos.discovery.enabled", havingValue = "true", matchIfMissing = true)
36+
RestClient.Builder restClientBuilder() {
37+
return RestClient.builder();
38+
}
39+
40+
/**
41+
* 远程 dict API 服务
42+
* @return {@link RemoteDictApiService }
2243
*/
2344
@Bean
2445
@ConditionalOnMissingBean
25-
public RestTemplate restTemplate() {
26-
return new RestTemplate();
46+
public RemoteDictApiService remoteDictApiService(Optional<RestClient.Builder> restClientBuilderOptional) {
47+
RestClient client = restClientBuilderOptional.orElseGet(RestClient::builder)
48+
.baseUrl(getBaseUrl())
49+
.defaultHeader(SecurityConstants.FROM, SecurityConstants.FROM_IN)
50+
.build();
51+
HttpServiceProxyFactory factory = HttpServiceProxyFactory.builderFor(RestClientAdapter.create(client)).build();
52+
return factory.createClient(RemoteDictApiService.class);
2753
}
2854

2955
/**
3056
* dict 数据提供程序
31-
* @param restTemplate REST 模板
57+
* @param remoteDictApiService 远程 dict API 服务
3258
* @return {@link DictDataProvider }
3359
*/
3460
@Bean
3561
@ConditionalOnMissingBean
36-
public DictDataProvider dictDataProvider(RestTemplate restTemplate) {
37-
return new RemoteDictDataProvider(restTemplate);
62+
public DictDataProvider dictDataProvider(RemoteDictApiService remoteDictApiService) {
63+
return new RemoteDictDataProvider(remoteDictApiService);
64+
}
65+
66+
/**
67+
* 获取Base URL
68+
* @return {@link String }
69+
*/
70+
private String getBaseUrl() {
71+
// 根据当前架构模式,组装URL
72+
if (SpringContextHolder.isMicro()) {
73+
return String.format("http://%s", ServiceNameConstants.UPMS_SERVICE);
74+
}
75+
else {
76+
return String.format("http://%s", SpringContextHolder.getEnvironment()
77+
.resolvePlaceholders("127.0.0.1:${server.port}${server.servlet.context-path}"));
78+
}
3879
}
3980

4081
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.pig4cloud.pig.common.excel.provider;
2+
3+
import com.pig4cloud.pig.common.core.util.R;
4+
import org.springframework.web.bind.annotation.PathVariable;
5+
import org.springframework.web.service.annotation.GetExchange;
6+
7+
import java.util.List;
8+
import java.util.Map;
9+
10+
/**
11+
* 字典接口, 基于 RestClient GetExchange 实现
12+
*
13+
* @author lengleng
14+
* @date 2024/9/7
15+
*/
16+
public interface RemoteDictApiService {
17+
18+
/**
19+
* 按类型获取 dict
20+
* @param type 类型
21+
* @return {@link R }<{@link List }<{@link Map }<{@link String }, {@link Object }>>>
22+
*/
23+
@GetExchange("/dict/remote/type/{type}")
24+
R<List<Map<String, Object>>> getDictByType(@PathVariable String type);
25+
26+
}

pig-common/pig-common-excel/src/main/java/com/pig4cloud/pig/common/excel/provider/RemoteDictDataProvider.java

Lines changed: 3 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,11 @@
22

33
import cn.hutool.core.collection.CollUtil;
44
import cn.hutool.core.map.MapUtil;
5-
import com.pig4cloud.pig.common.core.constant.SecurityConstants;
6-
import com.pig4cloud.pig.common.core.constant.ServiceNameConstants;
75
import com.pig4cloud.pig.common.core.util.R;
8-
import com.pig4cloud.pig.common.core.util.SpringContextHolder;
96
import com.pig4cloud.plugin.excel.handler.DictDataProvider;
107
import com.pig4cloud.plugin.excel.vo.DictEnum;
118
import lombok.RequiredArgsConstructor;
12-
import org.springframework.http.HttpEntity;
13-
import org.springframework.http.HttpHeaders;
14-
import org.springframework.http.HttpMethod;
15-
import org.springframework.http.ResponseEntity;
16-
import org.springframework.web.client.RestTemplate;
179

18-
import java.util.ArrayList;
1910
import java.util.List;
2011
import java.util.Map;
2112

@@ -28,7 +19,7 @@
2819
@RequiredArgsConstructor
2920
public class RemoteDictDataProvider implements DictDataProvider {
3021

31-
private final RestTemplate restTemplate;
22+
private final RemoteDictApiService remoteDictApiService;
3223

3324
/**
3425
* 获取 dict
@@ -37,18 +28,8 @@ public class RemoteDictDataProvider implements DictDataProvider {
3728
*/
3829
@Override
3930
public DictEnum[] getDict(String type) {
40-
// 获取服务URL
41-
String serviceUrl = getServiceUrl(type);
42-
// 创建请求实体
43-
HttpHeaders headers = new HttpHeaders();
44-
headers.add(SecurityConstants.FROM, SecurityConstants.FROM_IN);
45-
HttpEntity<Void> requestEntity = new HttpEntity<>(headers);
46-
// 发送HTTP请求并获取响应
47-
ResponseEntity<Map> response = restTemplate.exchange(serviceUrl, HttpMethod.GET, requestEntity, Map.class,
48-
type);
49-
50-
// 解析响应数据
51-
List<Map<String, Object>> dictDataList = MapUtil.get(response.getBody(), R.Fields.data, ArrayList.class);
31+
R<List<Map<String, Object>>> dictDataListR = remoteDictApiService.getDictByType(type);
32+
List<Map<String, Object>> dictDataList = dictDataListR.getData();
5233
if (CollUtil.isEmpty(dictDataList)) {
5334
return new DictEnum[0];
5435
}
@@ -64,20 +45,4 @@ public DictEnum[] getDict(String type) {
6445
return dictEnumBuilder.build();
6546
}
6647

67-
/**
68-
* 获取服务 URL
69-
* @param param 参数
70-
* @return {@link String }
71-
*/
72-
private String getServiceUrl(String param) {
73-
// 根据当前架构模式,组装URL
74-
if (SpringContextHolder.isMicro()) {
75-
return String.format("http://%s/dict/remote/type/%s", ServiceNameConstants.UPMS_SERVICE, param);
76-
}
77-
else {
78-
return String.format("http://%s/dict/remote/type/%s", SpringContextHolder.getEnvironment()
79-
.resolvePlaceholders("127.0.0.1:${server.port}${server.servlet.context-path}"), param);
80-
}
81-
}
82-
8348
}

0 commit comments

Comments
 (0)