我考虑了一组servives的SOA架构,以支持进出口咨询了,以前我们使用的数据库的集成,每个应用程序挑选出来它从一个共享的MS SQL数据库需要与它等合作业务.我们有各种与怪物数据库集成的应用程序,包括java,.net和microsoft访问,由于一切都是紧密耦合的,因此存在引用完整性.
我对如何支持服务之间的数据共享感到有点困惑.
让我们将产品服务放在批发商每个月提供的产品数据库之上.我们构建了一个域模型,并使用Hibernate或者它来实现数据库的实现,实现明智产品是一个大型对象图,给出了批发商提供的有关产品的信息.
现在假设Review服务,定价服务,送货服务和Stock Service将订阅ProductUpdated,ProductAdded,ProductDeleted.问题是每个服务只需要有关产品的部分或部分信息.运输可能只需要尺寸和重量.定价可能只需要产品ID,批发成本,批量折扣,迄今为止有效的价格.审核可能需要产品ID,产品名称,生产商.
是标准做法只是发布整个产品(适当的非订户特定合同,例如ProductUpdated,以及合适的架构 - 代表所有产品对象图),并让订户将他们需要的任何内容映射到他们的域模型(或者他们做什么他们想要,甚至可能没有域模型)...
或者当我写这篇文章时,我想的可能是:
产品服务发布ProductAdded消息(不包括产品详细信息只是产品ID和时间戳)
定价服务订阅ProductAdded并发布RequestPricingForProduct消息
产品服务发布ResultForPricingForProduct消息
嗯..似乎更好一点......但它的感觉就像我建基于什么其他服务我可以找出什么,他们会需要,也许在未来的XYZ服务需要的东西不同产品的服务合同.我会停在那里,因为我认为它变得越来越清楚,我感到困惑...或许上述方法将起作用,因为我应该揭露一种方式来返回任何应该是公共的正确的.
任何评论或方向都非常感谢.对不起,如果这出现了一半.
我们的一个产品实现了以下单向Web服务结构:
Server <--------------------- Middleware <---------------- Client
SOAP over JMS (queue) SOAP over HTTP
Run Code Online (Sandbox Code Playgroud)
在此模型中,客户端通过HTTP将SOAP消息发送到我们的中间件(Progress SonicMQ).消息被SonicMQ推送到JMS队列,我们的服务器从那里获取它们.但是,正如您所看到的,服务器不会向客户端发送响应(异步JMS).
我们希望为此模型实现响应通道.通常建议的解决方案是在中间件中创建临时replyTo-queue(动态),允许服务器向该队列发送响应.然后,客户端可以获取响应并关闭replyTo队列.这听起来很方便,但不幸的是我们的客户端通过纯HTTP而不是JMS运行,因此他们的客户端无法轻松设置replyTo队列.
在这种混合HTTP/JMS SOAP模型中实现响应通道的一种方法是配置中间件以在每个成功的SOAP接收上打开replyTo队列,将replyTo-queue和sender信息附加到SOAP消息并将消息推送到队列,服务器将获取它.在接收并处理消息之后,服务器可以向中间件中的指示的replyTo队列发送响应.最后,中间件将通过使用SOAP消息中的数据(在首次接收请求时在中间件过程中插入的数据)通过HTTP将响应(SOAP)发送回原始客户端.
虽然有可能,但这听起来有点像hacky.所以问题是:在我们的案例中实现这种请求/响应模型的任何更清晰的方法?服务器端已用Java实现.
解决方案:
Progress SonicMQ支持"内容回复发送"HTTP Acceptor,它允许轻松发送JMS回复.内容回复发送接受器以下列方式工作:
如果消费者(在我们的情况下是"服务器")失败并且没有发送回复导致超时,Sonic的HTTP Acceptor会向客户端发送HTTP消息,指示超时.这是SonicMQ中非常标准的功能.我想它也存在于其他产品中.
这允许在"服务器"端使用标准SOAP over JMS(参见skaffman的答案),避免在中间件中进行任何自定义编程.
我仍然在JMS模型中看到一些问题,但这肯定是一种改进.
更新2009-11-05:
在研究了这个问题之后,事实证明我对HTTP < - >中间件< - > JMS的怀疑是相关的.
这个模型中存在一些关键问题.具有中间件的同步异步模型简单不方便.要么两端都实现JMS连接(应该摇摆),要么两端都使用HTTP.混合它们只会导致头痛.在这两者中,SOAP-over-HTTP比SOAP-over-JMS更简单,更受支持.
再一次:如果你正在设计这种系统......不要.
我过去曾使用JMS来构建应用程序,它运行良好.现在我和想要使用Spec:SOAP over Java Message Service 1.0的Architects一起工作.
这个规格过于复杂.我没有看到很多实现(除了供应商推动规范).
这里有人在生产环境中使用此规范吗?使用此规范的主要好处是什么?
我需要创建一些DTO类来跨WCF传输业务对象.
由于这些只是没有功能的数据包,有什么理由我不能只使用字段,还是有一些很好的理由将它们作为属性正确地公开?
//fields
[DataContract]
class CustomerDTO
{
[DataMember] public int Id;
[DataMember] public string Name;
}
//or properties?
[DataContract]
class CustomerDTO
{
[DataMember] public int Id { get; set; }
[DataMember] public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud) 在此之前因为过于宽泛而关闭:Spring Integration论坛已关闭并引用Stack Overflow(SO).这不是SO的关注,但我很想得到答案......
Mule ESB项目在其网站上解释了它与Spring Integration的区别.但是,关于文档的dcterms.date 2012-07-19T18:43-03:00,文本可能已过时.
引用段落的要点是
这些要点仍然有效吗?是否存在更详细的(如果有的话)最新比较?
Mule ESB与Spring Integration
最近,Spring组件中添加了一个名为Spring Integration的新组件,它允许在Spring Framework中创建和管理类似ESB的功能和EIP.Spring Integration采用所谓的"以应用程序为中心"的集成方法.
Spring Integration旨在通过提供实现框架,为特定应用程序提供"只需一点"ESB风格的集成,而不是实现共享总线,允许集中管理,管理和配置组件和系统之间的所有集成和消息传递.常见的EIP,例如消息总线和简单路由.由于其范围有限,Spring Integration最适合于必须集成少量组件的情况,通常是内部组件,并且所讨论的基础架构由大量其他Spring组件组成.对于任何更复杂的事情,缺少公共总线,再加上可用于年轻项目的极少数支持的传输和变换器,使得Spring Integration不适合这项任务.
使用Mule ESB处理Spring环境中的集成的优点是Mule ESB不仅仅是一个ESB - 它是一个集成平台.尽管Spring Integration的范围仅限于Spring Portfolio环境中的小规模集成,但Mule的有意模块化架构允许团队快速为任何场景提供最轻微的集成解决方案,从简单的点对点集成到复杂的SOA,云和伙伴生态系统方案
目前我们有一个巨大的API,我们的后台,我们的前端,以及我们的公共API使用.
这引起了很多麻烦,因为在构建新端点时,我发现代码中有很多特定于应用程序的逻辑,我不一定要在我的端点中包含这些逻辑.例如,创建用户的代码可能包含发送欢迎电子邮件的代码,但由于后台端点不需要,因此我需要添加没有该逻辑的新端点.
我正在考虑使用大型重构来将我们的代码库分解为许多较小的高度特定的服务API,然后在这些API之上构建一组小型应用程序API.
因此,例如,创建新用户的应用程序端点可能会在重构后执行以下操作:
customerService.createCustomer();
paymentService.chargeCard();
emailService.sendWelcomeEmail();
Run Code Online (Sandbox Code Playgroud)
应用程序和服务API将是完全独立的代码库(可能是每个服务单独的代码库),它们也可以使用不同的语言构建.它们只会通过REST API调用进行交互.它们将位于同一个本地网络上,因此延迟不应该是一个大问题.
这是一个坏主意吗?我以前从未见过/曾经在将两者分开的代码库上工作,所以也许有更好的架构来实现我正在寻找的灵活性和可维护性?
建议,链接或评论都将不胜感激.
我一直在阅读服务/微服务之间的通信。
API网关对请求进行身份验证,然后将访问令牌(例如JSON Web令牌)安全地标识每个请求中的请求者到服务。服务可以在对其他服务的请求中包含访问令牌。
而且我正在将用户的访问令牌传递给下游服务,所以它看起来或多或少像这样:
但是,如果微服务之间的令牌已过期怎么办?
有很多方法可以解决此问题,这些方法似乎很合理:
验证用户的访问令牌并在API网关中创建短暂的JWT(内部令牌种类)
每个微服务都会验证JWT并生成自己的JWT以根据范围规则与其他微服务进行通信
因此,我们将拥有Auth服务来验证或请求令牌。
该任务是:
为了确保令牌在通过服务的过程中不会过期,我们可以在API网关层中进行检查:如果令牌在n(〜1)分钟内过期,则将其拒绝,因此用户必须使用刷新令牌获取一个新的访问令牌。这意味着令牌在完成请求所需的时间内始终有效。这种方法的优缺点是什么?
您认为用 MediatR 替换我的服务层或服务类是否合理?例如,我的服务类如下所示:
public interface IEntityService<TEntityDto> where TEntityDto : class, IDto
{
Task<TEntityDto> CreateAsync(TEntityDto entityDto);
Task<bool> DeleteAsync(int id);
Task<IEnumerable<TEntityDto>> GetAllAsync(SieveModel sieveModel);
Task<TEntityDto> GetByIdAsync(int id);
Task<TEntityDto> UpdateAsync(int id, TEntityDto entityDto);
}
Run Code Online (Sandbox Code Playgroud)
我想实现某种模块化设计,以便其他动态加载的模块或插件可以为我的主要核心应用程序编写自己的通知或命令处理程序。
目前,我的应用程序根本不是事件驱动的,并且我的动态加载的插件没有简单的方法来进行通信。
我可以将 MediatR 合并到我的控制器中,完全删除服务层,或者将它与我的服务层一起使用,只是发布通知,以便我的插件可以处理它们。
目前,我的逻辑主要是 CRUD,但在创建、更新、删除之前有很多自定义逻辑正在进行。
我的服务的可能替换看起来像:
public class CommandHandler : IRequestHandler<CreateCommand, Response>, IRequestHandler<UpdateCommand, Response>, IRequestHandler<DeleteCommand, bool>
{
private readonly DbContext _dbContext;
public CommandHandler(DbContext dbContext)
{
_dbContext = dbContext;
}
public Task<Response> Handle(CreateCommand request, CancellationToken cancellationToken)
{
//...
}
public Task<Response> Handle(UpdateCommand request, CancellationToken cancellationToken)
{
//...
}
public …Run Code Online (Sandbox Code Playgroud)