使用通用对象层进行请求和响应的微服务之间的通信

Communication between Micro-services using Generic Object layer for Request and Responses

提问人:Mohit Sharma 提问时间:11/6/2023 更新时间:11/6/2023 访问量:27

问:

我正在设计一个基于 Spring boot 的分布式系统,它们之间的通信将由 REST API 调用处理。 现在我拥有的服务数量大于 8 个。我想设计一个所有服务通用的通信层或库。

  1. 我想使用通用请求,以便所有服务都可以理解并在通用对象层中返回响应。
  2. 泛型对象可以具有如下字段: a. 请求有效载荷;时间戳;一些业务用例的标识符。
  3. 响应可以附加到相同的 JSON 结构中 a. 请求有效载荷;时间戳;一些业务用例的标识符;具有微服务名称的
    响应数组 -- 微服务响应
  4. 每个微服务都可以添加响应,并且整个 JSON 对象可以进一步发送到任何服务,因此每个服务都可以读取和提取所需的数据。

因此,基本上,我们将有一个初始请求,并且该请求会不断附加各种微服务响应。

我试图避免微服务相互共享合同并变得紧密耦合。

我需要帮助来设计通用对象。那么我们是否有任何框架或库可以帮助做到这一点? 如果有人已经尝试过上述方法,经验如何?性能、可扩展性、维护性、可扩展性等。

由于请求/响应将采用 JSON 格式,因此请记住,松散耦合的合约也需要避免基于 JSON 的解析错误。

Java JSON spring-boot REST 微服务

评论


答:

0赞 Sepehr Asadiyan 11/6/2023 #1

如果我理解正确,我希望它对您有所帮助。 我强烈建议使用 Kafka。

对象通过 REST 调用。

public class Bucket<T extends GenericResponse> implements Serializable {

    private Request triggeredActionRequest;


    //you can find your response for each micro by searching
    //and you can move on if one micro failed to add response.
    private Map<MicroNameEnum, T> responses;

    public Request getTriggeredActionRequest() {
        return triggeredActionRequest;
    }

    public void setTriggeredActionRequest(Request triggeredActionRequest) {
        this.triggeredActionRequest = triggeredActionRequest;
    }

    public Map<MicroNameEnum, T> getResponses() {
        return responses;
    }

    public void setResponses(Map<MicroNameEnum, T> responses) {
        this.responses = responses;
    }
}

响应

public class GenericResponse implements Serializable {
    private String absoluteJson;

    //You can add any fields you want,
// and every microservice will be aware of them without requiring explicit casting.


    public String getAbsoluteJson() {
        return absoluteJson;
    }

    public void setAbsoluteJson(String absoluteJson) {
        this.absoluteJson = absoluteJson;
    }
}

枚举

public enum MicroNameEnum {
    MICRO1("MICRO1"),
    MICRO2("MICRO2"),
    MICRO3("MICRO2"),
    MICRO4("MICRO4"),
    MICRO5("MICRO5"),
    MICRO6("MICRO6"),
    MICRO7("MICRO7"),
    MICRO8("MICRO8");


    private final String value;

    MicroNameEnum(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}

此类仅存在于第一个微服务中。如果要在其他微服务中使用它(如果绝对 JSON 不足以满足您的需求),请创建一个通用项目并将其注入到微服务中。不要忘记使用 super()

public class MicroOneResponse extends GenericResponse implements Serializable {

    //this only exist in you micro one class.

    private Long idMicroOne;
    //any filed or data you want


    public Long getIdMicroOne() {
        return idMicroOne;
    }

    public void setIdMicroOne(Long idMicroOne) {
        this.idMicroOne = idMicroOne;
    }
}