基于HttpClient的微服务间通信实现
1. 服务调用场景设计
构建两个Spring Boot应用模块,分别命名为ServiceProvider与ServiceConsumer。ServiceConsumer需通过HTTP协议调用ServiceProvider暴露的接口,并完成数据交互。
调用过程中需重点关注:
- HTTP请求状态码验证(优先确保200 OK响应)
- 服务端响应结果分类处理机制
- 网络超时与异常处理策略
2. 服务提供方实现
2.1 依赖配置
<properties>
<jsonLibVersion>1.2.75</jsonLibVersion>
<lombokVersion>1.18.18</lombokVersion>
</properties>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${jsonLibVersion}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombokVersion}</version>
</dependency>
2.2 配置参数
server.port=8010
2.3 数据传输对象
@Data
public class RequestData {
private String username;
private int age;
private String storagePath;
private String fileName;
private byte[] fileContent;
}
@Data
public class ResponseData {
private String operationResult;
private String errorMessage;
}
2.4 文件转换工具
实现文件与字节数组的双向转换方法
2.5 接口实现
@RestController
@RequestMapping("/api/data")
public class DataController {
private static final Logger logger = LoggerFactory.getLogger(DataController.class);
@PostMapping("/query")
public ResponseData query(@RequestBody RequestData request) {
// 日志记录与业务处理逻辑
return new ResponseData("success", null);
}
@PostMapping("/upload")
public ResponseEntity<ResponseData> upload(@RequestBody RequestData request) {
// 文件存储逻辑
return ResponseEntity.ok(new ResponseData("success", null));
}
@PostMapping("/batchUpload")
public ResponseEntity<ResponseData> batchUpload(@RequestBody List<RequestData> requests) {
// 批量文件处理逻辑
return ResponseEntity.ok(new ResponseData("success", null));
}
}
3. 服务消费方实现
3.1 依赖配置
<properties>
<jsonLibVersion>1.2.75</jsonLibVersion>
<lombokVersion>1.18.18</lombokVersion>
<httpClientVersion>4.5.13</httpClientVersion>
</properties>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>${httpClientVersion}</version>
</dependency>
3.2 配置参数
file.storage.path=C:/service/test/
url.base=http://localhost:8010/api
url.query=/data/query
url.upload=/data/upload
url.batchUpload=/data/batchUpload
3.3 工具类实现
@Data
public class HttpResult {
private int status;
private String message;
}
public class HttpClient {
private static final Logger logger = LoggerFactory.getLogger(HttpClient.class);
public static HttpResult sendRequest(String endpoint, Object payload) {
HttpResult result = new HttpResult();
try (CloseableHttpClient client = HttpClients.createDefault()) {
HttpPost post = new HttpPost(endpoint);
StringEntity entity = new StringEntity(JSON.toJSONString(payload), ContentType.APPLICATION_JSON);
post.setEntity(entity);
RequestConfig config = RequestConfig.custom()
.setConnectTimeout(300000)
.setSocketTimeout(600000)
.build();
post.setConfig(config);
HttpResponse response = client.execute(post);
result.setStatus(response.getStatusLine().getStatusCode());
if (result.getStatus() == 200) {
HttpEntity entity = response.getEntity();
if (entity != null) {
result.setMessage(EntityUtils.toString(entity));
}
}
} catch (Exception e) {
result.setStatus(0);
logger.error("请求失败: {}", endpoint, e);
}
return result;
}
}
3.4 调用实现
@RestController
@RequestMapping("/api/data")
public class DataController {
@Value("${file.storage.path}")
private String storagePath;
@Value("${url.base}")
private String baseUrl;
@Value("${url.query}")
private String queryUrl;
@Value("${url.upload}")
private String uploadUrl;
@Value("${url.batchUpload}")
private String batchUploadUrl;
private static final Logger logger = LoggerFactory.getLogger(DataController.class);
@GetMapping("/query")
public void queryData() {
RequestData request = new RequestData();
request.setUsername("test");
request.setAge(30);
HttpResult result = HttpClient.sendRequest(baseUrl + queryUrl, request);
if (result.getStatus() == 200) {
ResponseData res = JSON.parseObject(result.getMessage(), ResponseData.class);
logger.info("查询结果: {}", JSON.toJSONString(res));
}
}
@GetMapping("/upload")
public void uploadFile() {
RequestData request = new RequestData();
request.setUsername("test");
request.setAge(30);
request.setStoragePath(storagePath);
request.setFileName("test.txt");
request.setFileContent(FileUtil.fileToBytes(new File("test.txt")));
HttpResult result = HttpClient.sendRequest(baseUrl + uploadUrl, request);
if (result.getStatus() == 200) {
ResponseData res = JSON.parseObject(result.getMessage(), ResponseData.class);
logger.info("上传结果: {}", JSON.toJSONString(res));
}
}
@GetMapping("/batchUpload")
public void batchUploadFiles() {
List<RequestData> requests = new ArrayList<>();
// 添加多个请求对象
HttpResult result = HttpClient.sendRequest(baseUrl + batchUploadUrl, requests);
if (result.getStatus() == 200) {
ResponseData res = JSON.parseObject(result.getMessage(), ResponseData.class);
logger.info("批量上传结果: {}", JSON.toJSONString(res));
}
}
}