开发RESTful应用程序。其中一个应用程序任务是返回10个针对应用程序的最后面向业务的REST调用,其中包含请求信息和时间。这样做的最佳方式是什么?我读到了拦截器和滤波器。但我不确定这是不是一个好主意......任何其他想法或信息如何实现这个?
编辑: 我用过Actuator。 我的回答后的解决方案:
@Service
public class ActuatorTraceService {
private JsonParser jsonParser = new JsonParser();
private List<String> listWithInformationFromTrace = new ArrayList<>();
private JSONArray jsonArrayFromString;
private JSONArray listWithoutRequestAndTracePath;
public void takeInformationFromActuatorTrace() {
jsonArrayFromString = new JSONArray("[{}]");
String urlAddressForTrace = "http://localhost:8080/trace";
jsonArrayFromString = new JSONArray(jsonParser.takeJsonAsAStringFromUrl(urlAddressForTrace));
}
public String createPathForCheck(int i) {
String pathForCheck = jsonArrayFromString
.getJSONObject(i)
.getJSONObject("info")
.get("path")
.toString();
return pathForCheck;
}
public void createListWithoutRequestAndTracePath() {
listWithInformationFromTrace.clear();
takeInformationFromActuatorTrace();
listWithoutRequestAndTracePath = new JSONArray();
for (int i = 0; i < jsonArrayFromString.length(); i++) {
if (!createPathForCheck(i).equals("/request") &&
!createPathForCheck(i).equals("/trace")) {
listWithoutRequestAndTracePath.put(jsonArrayFromString.get(i));
}
}
}
public List<String> createListWithInformationsFromTrace(){
createListWithoutRequestAndTracePath();
for (int i=0; i<listWithoutRequestAndTracePath.length(); i++){
String timestampAndRequestInformation = takeTimestampFromTrace(i) + "\n" + takeRequestInformationFromTrace(i) + "\n";
listWithInformationFromTrace.add(timestampAndRequestInformation);
}
return listWithInformationFromTrace;
}
public String takeRequestInformationFromTrace(int i) {
return listWithoutRequestAndTracePath
.getJSONObject(i)
.getJSONObject("info")
.getJSONObject("headers")
.get("request")
.toString()
+ "\n";
}
public String takeTimestampFromTrace(int i) {
return jsonArrayFromString.getJSONObject(i).get("timestamp").toString() + "\n";
}
public String printLastTenRequestInformationFromTrace() {
StringBuilder stringToPrint = new StringBuilder();
createListWithInformationsFromTrace();
if (listWithInformationFromTrace.size() > 10) {
for (int i = 0; i < StaticValues.NUMBER_POSITION_TO_PRINT; i++) {
stringToPrint.append(listWithInformationFromTrace.get(i));
}
} else {
for (int i = 0; i < listWithInformationFromTrace.size(); i++) {
stringToPrint.append(listWithInformationFromTrace.get(i));
}
}
return stringToPrint.toString();
}
}
可能它可能更具可读性,并且应该在最后实现漂亮的打印,但就目前而言,它可以正常工作。
答案 0 :(得分:1)
有很多方法可以做到。如果您需要持久化信息(在服务器重启后应使用所有历史信息),请将其存储在:
1)为休息请求信息创建单独的表并使用此表
2)使用Logstash here is example
3)使用一些内存数据库存储休息呼叫信息
它们中的哪一个依赖于您的要求,我更喜欢Logstash,因为您不仅可以将其用于特定的休息调用,还可以将其重用于日志逻辑的其他部分。
另一个变体如果您不想保留所有历史信息,并且您可以在服务器重启后使用新信息,那么您可以将其保存在内存中(如果您需要记忆),您可以在本地收集但是它是糟糕的变种 - 你应该保留大量的冗余信息,然后你做一些寻找前10名的信息。这不是推荐,它只是可能的变种,非常糟糕的变种。
要获取有关休息通话的信息,您可以:使用Interceptors ,过滤器,Logging aspect in RESTful web service using spring aop (log requests/responses) AOP。
答案 1 :(得分:0)
实现这一目标的最简单方法如下: 1.使用记录器将呼叫存储在业务休息呼叫的代码中 2.使用滚动/循环缓冲区缓冲区存储调用 3.创建一个REST api请求/响应,它从滚动/循环缓冲区发送数据。
答案 2 :(得分:0)
如果您可以使用 Spring Boot ,则可以使用 Actuator
轻松获取HTTP请求跟踪