类似的问题被问过几次,但由于每个用例都可能不同,我认为值得针对我面临的特定案例再次提问。因此,我们正在使用 .netCore 开发微服务。我们将这些服务称为ServiceA、ServiceB、ServiceC。
如果ServiceA调用 ServiceC,则ServiceC以 JSON 内容进行响应,该内容可以序列化为ResponseC对象。
这意味着,ServiceA和ServiceC都应该知道ResponseC类。在这一点上,我看到了两种可能性。ResponseC类可以在共享库中,并且ServiceA和ServiceC都应该引用这个共享库。但是,我读过诸如不在微服务之间共享库之类的语句。这导致了另一种可能的解决方案。让我们在两个微服务中引入ResponseC类,但不知何故,由于代码重复,我发现这有点不利于可维护性。
无论ServiceA和ServiceB与之通信ServiceC。在与ServiceC通信时,我们打算制定一些有关读取和连接超时以及最大重试次数的策略。这些值是可配置的,重试逻辑中还有一些通用部分,以便能够从配置文件中读取相关值并包装 http 调用。问题与前一个案例几乎相同,因为我要么将这些类放入共享库中,要么基本上在ServiceA和ServiceB 中引入相同的类. 这些类非常简单和通用,所以目前我无法想象这些类会经常变化。
所以问题是,在这些情况下,复制代码并拥有独立的微服务或引入一个共享库使这些服务依赖哪个更好?
我正在阅读有关在何处放置Transactional(接口与实现)的信息:
Spring团队的建议是您仅使用@Transactional注释对具体的类进行注释,而不是对接口进行注释。您当然可以在接口(或接口方法)上放置@Transactional批注,但这仅在您使用基于接口的代理时才可以按预期使用。注解未继承的事实意味着,如果您使用的是基于类的代理,则基于类的代理基础结构将无法识别事务设置,并且该对象也不会包装在事务性代理中(这肯定是不好的) 。因此,请听取Spring团队的建议,仅使用@Transactional批注对具体类(以及具体类的方法)进行批注。
所以问题是,到底什么是基于接口的代理,如何查看它是否被使用?是一些配置还是实例化/使用实例的方式?