【问题标题】:How to define REST service contract for shared use between several similar services?如何定义多个类似服务之间共享使用的 REST 服务契约?
【发布时间】:2019-07-12 05:11:23
【问题描述】:

我正在用 Java 实现一系列 REST 微服务 - 我们称它们为“适配器”。

每个服务都从特定的源类型读取数据,并以相同的方式提供结果。主要思想是为所有这些提供相同的接口(服务合同),以获得可互换性。我想避免代码重复并重用服务的服务合同。

看来我正在重新发明轮子。对此有标准方法吗?

我尝试以 Java 接口的形式提取 Spring MVC Controller 类和随附的 DAO 类CustomObject 的服务契约:

public interface AdapterController {

    @RequestMapping(method = RequestMethod.GET, value = "/objects/{name}")
    CustomObject getObject(@PathVariable final String name);

}

然后将它们放到单独的Maven项目中,在原项目中设置为依赖,重写REST控制器类如下:

@RestController
public class DdAdapterController implements AdapterController {

    @Override
    public CustomObject getObject(String name) {
        return model.getByName(name);
    }

我也可以在客户端代码中重用 DAO 对象,但是接口类在客户端是无用的。

1) 总结:可以在不同的服务实现之间重用/共享服务契约吗?这样做的代价是什么?是否有共享服务合同的最佳实践?

2) 下一个问题是关于服务契约和消费客户端。可以在服务和客户端之间共享合同吗? Java/方法中有一些工具吗?

【问题讨论】:

    标签: java rest spring-boot dependencies


    【解决方案1】:
    1. 微服务应该松散耦合 = 最小依赖。

      微服务是一种 将应用程序构建为一组 服务是

      • 高度可维护和可测试
      • 松散耦合
      • 可独立部署
      • 围绕业务能力进行组织。

    https://microservices.io/

    合约可以用WADL定义

    1. 在客户端和服务器之间使用契约意味着在实现客户端时可以减少错误和误解。这就是合同的好处。

    【讨论】:

    • 感谢 WADL 链接! --- 可能是我不够清楚 - 我需要一种服务类型的几种不同实现。他们都应该有相同的服务合同,并且将由同一个团队维护/部署。讨论中的服务不会相互交互,它们应该只与消费服务交互。 --- 我完全同意,该合同有助于最大限度地减少错误。问题是检查服务/客户是否履行合同的正确方法是什么。
    【解决方案2】:

    这违背了微服务的心态,从长远来看,共享代码是个坏主意。

    如果您开始共享代码,您将慢慢构建一个分布式单体,其中多个服务相互依赖。

    很多人之前都谈到过这个:

    microservices-dont-create-shared-libraries

    The evils of too much coupling between services are far worse than the problems caused by code duplication

    Micro services: shared library vs code duplication

    构建微服务的关键是:

    • 一项服务应该擅长一件事
    • 保持较小
    • 有一个非常有据可查的 api
    • 当您需要删除微服务时,应该这样做,因为很少需要更新其他服务
    • 避免代码共享,将所有库视为第三方库甚至您自己的库

    【讨论】:

    • 感谢您的链接!我看不到共享接口——只是共享库的一个特例。检查服务合同的最佳方式 - 在外面检查。就像其他客户会做的那样。 There are a lot of tools in Java for that.
    猜你喜欢
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多