提问人:Mohit Sharma 提问时间:11/6/2023 更新时间:11/6/2023 访问量:27
使用通用对象层进行请求和响应的微服务之间的通信
Communication between Micro-services using Generic Object layer for Request and Responses
问:
我正在设计一个基于 Spring boot 的分布式系统,它们之间的通信将由 REST API 调用处理。 现在我拥有的服务数量大于 8 个。我想设计一个所有服务通用的通信层或库。
- 我想使用通用请求,以便所有服务都可以理解并在通用对象层中返回响应。
- 泛型对象可以具有如下字段: a. 请求有效载荷;时间戳;一些业务用例的标识符。
- 响应可以附加到相同的 JSON 结构中
a. 请求有效载荷;时间戳;一些业务用例的标识符;具有微服务名称的
响应数组 -- 微服务响应 - 每个微服务都可以添加响应,并且整个 JSON 对象可以进一步发送到任何服务,因此每个服务都可以读取和提取所需的数据。
因此,基本上,我们将有一个初始请求,并且该请求会不断附加各种微服务响应。
我试图避免微服务相互共享合同并变得紧密耦合。
我需要帮助来设计通用对象。那么我们是否有任何框架或库可以帮助做到这一点? 如果有人已经尝试过上述方法,经验如何?性能、可扩展性、维护性、可扩展性等。
由于请求/响应将采用 JSON 格式,因此请记住,松散耦合的合约也需要避免基于 JSON 的解析错误。
答:
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;
}
}
评论