RESTful应用程序 - 如何返回10个最后的REST调用

时间:2017-07-15 14:29:40

标签: java spring rest spring-mvc

开发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();
    }
}

可能它可能更具可读性,并且应该在最后实现漂亮的打印,但就目前而言,它可以正常工作。

3 个答案:

答案 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请求跟踪

Official Documentation