春季-如何将不同的“微服务”集成到交易中?
作者:互联网
我们正在构建一个新的基于Web的工业应用程序,最近几天困扰我们的一个问题是有关此体系结构上不同“微服务”之间的集成.
我在使用微服务时只花了一小笔钱,因为我们没有完全接受定义真正的微服务的概念.一个(也是我认为最大的区别)取决于这样一个事实,即我们在不同的模块上使用了相同的共享数据库(我称之为“微服务”).我们系统的某种逻辑视图可以绘制为:
╔══════════════╗
║ Client ║ ══╗
╚══════════════╝ ║ (2)
║
▼
╔══════════════╗ (1) ╔══════════════╗
║ Serv. Reg. ║ <==> ║ API Gatew. ║
╚══════════════╝ ╚══════════════╝
█ █ █████████████ (4)
█ █ ████
╔══════════════╗ ╔══════════════╗ ╔══════════════╗
║ Module A ║ ║ Module B ║ ║ Module C ║ <===== "Microservices"
╚══════════════╝ ╚══════════════╝ ╚══════════════╝
║║ (3) ║║ (3) ║║ (3)
║║ ║║ ║║
╔══════════════════════════════════════════════════╗
║ Database Server ║
╚══════════════════════════════════════════════════╝
我们已经弄清楚的一些事情:
>客户端(外部系统,前端应用程序)将使用发现/路由模式访问不同的后端模块.我们正在考虑将Netflix OSS Eureka和Zuul结合使用.服务(模块A,B,C)在服务注册模块上进行自身注册(4),并通过注册向API网关坐标(1)进行注册,以找到可完全满足请求的服务实例(2).
>所有不同的模块使用相同的数据库. (3)这更多是客户的请求,而不是架构决定.
我们(或我本人)遇到的问题是如何进行不同模块之间的通信.我已经阅读了很多不同的模式和反模式来执行此操作,并且几乎每个人都会通过RestTemplate或Feign或Ribbon这样的专门客户端来告知API集成.
由于某些原因,我倾向于不喜欢这种方法,主要是HTTP请求的同步和无状态性质. HTTP的无状态本质是我最大的问题,因为不同模块的服务层可以具有一些强大的绑定.例如,在模块A上启动的操作可能会对模块B和C产生影响,并且需要从“事务”的角度协调所有内容.我真的不认为HTTP是控制此的最佳方法!
我内心的Java EE部分大喊使用某种服务集成,例如EJB或RMI或最终不使用HTTP的任何东西.对我来说,将某个服务从模块A内的模块B连接起来,并确保它们一起参与交易会更加“自然”.
需要强调的另一件事是,数据库上最终的不一致之类的范例对于我们的客户来说还不够,因为它们正在处理某种严重的数据.因此,“我保证将尽我所能地处理数据”在这里不太适合.
提问时间:
与“微服务”打交道时,这种“服务集成”真的有用吗?还是“资源整合”胜过它?
例如,似乎Spring提供了Spring Integration来实现服务之间的消息传递,就像EJB这样的技术一样.这是整合这些服务的最佳方法吗?我想念什么吗?
PS:您可以将我的“微服务”称为“微石”,我们通常在这里使用它们的名字.
标签:spring-boot,spring-cloud,microservices,spring,spring-integration 来源: https://codeday.me/bug/20191024/1923535.html