如何定义REST服务合同以在多个类似服务之间共享使用?

时间:2019-02-18 18:58:02

标签: java rest spring-boot dependencies

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

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

似乎我正在重新发明轮子。有标准的方法吗?

我试图为Spring MVC Controller类和随附的DAO类CustomObject提取Java接口形式的服务协定:

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 /方法中是否有一些工具可以做到这一点?

2 个答案:

答案 0 :(得分:1)

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

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

许多人早先谈到过:

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
  • 当您需要删除微服务时,只需很少的更新其他服务即可完成
  • 避免代码共享,并像第三方库一样对待所有库甚至是您自己的

答案 1 :(得分:0)

    微服务应该通过松散耦合=最小依赖关系来实现。
      

    微服务是   以应用程序的形式构成应用程序的建筑风格   的服务

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

https://microservices.io/

可以使用WADL定义合同

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