简单建筑
免责声明:我们的示例是基于我们的项目。 Eu simplifico/altero alguns detalhes de forma a simplificar o post e preservar a IP das empresas. Esse post é 100% Baseado apenas em minhas Opiniões e nãoreflete meus empregadores.
手术后的一个想法是@rponte讨论的。最近关于“Arquitetura Limpa”和“端口和适配器”的争论与亚马逊和 Twitter 上的 7 个项目有关。
简单建筑
Eu Pensei nesse termo“Arquitetura Simples”como uma brincadeira com o termo arquitetura limpa。这个提案的本质是自然的,它是一个与时间的发展有关的自然因素:
- YAGNI -你不需要它(Você não vai precisar disso)。
- KISS - Keep it Simple Stupid ou Keep it Super Simple(Mantenha simples estúpido ou mantenha super simples )。一个“中心”的想法,是一种新的能源和未来计划的计划,是解决未来问题的必要条件。
Eu seria hipócrita em dizer que isso é/foi uma escolha consciente。我们在 Amazon 和 Twitter 上的 8 家企业中都做出了明确的决定“essa será a arquitetura do nosso sistema”。 Os sistemas simplesmente eram escritos 和 vinham “à tona” nessa forma simples。为您提供便利和自然的环境,并为您的项目提供帮助。
这是重要的提示,它是所有系统中不存在的问题的完美形式,作为应用程序和所有问题的解决方案。 “没有什么灵丹妙药”(Não há bala de prata)是一个关于信用的原则,也是一个在许多不同的项目中一直存在的问题。
作为“Arquitetura Simples”的“camadas”
作为我们的 camadas da nossa arquitetura são o mais simples possível (com o perdão do trocadilho) e eu sei que isso pode incomodar muita gente。通常,作为依赖项,例如,控制器依赖于执行器类的指令,或者使用控制器的类,或者依赖于类的类的指令,以保存或恢复数据。
观察者的操作系统组件无图解:
控制器
API(应用程序编程接口)的控制器,一般接收RequestDTO代表 uma API RPC(远程过程调用)的要求,通常用作输入验证和日志记录之外的验证。
项目中存在多种不同的项目:
- Passamos o RequestDTO ditamente para o caso de uso 对象。使用简单的操作 (KISS e YAGNI),可以修改没有 API 模型的对象。 Muitas vezes,一切都好。
- Esse RequestDTO和 traduzido pra uma entidade de negócio do caso de uso se as entidades forem extremamente anêmicas。希望您能以简单易懂的方式解决不完整的问题,并为您提供更多关于谈判的信息。
- 翻译 o RequestDTO是 DTO(数据传输对象)之外的算法,它是使用 API 的专用输入。 Esse 是一个灵活的模型,可以通过 API 进行详细的设计,并通过 DTO 的结尾进行传输。可以灵活调整使用不同输入的方式,例如,使用 API 和工作程序。
为何?控制器可能会影响您获取数据、记录和验证信息。这是一个协调各种外部对象的协调方式,包括外部服务和银行存款或大控制器。没有一般情况,控制器没有任何问题:
- Reduzir o tamanho e Complexidade da classe。
- 促进统一责任和后果的分离。简单来说, RequestDTO是内部模型的一部分,API 和 DTO 的结果是内部模型的不同阶段。 Em 100% dos projetos queparticipei, toda vez que tentamos utilizar um uneco modelo interno e pra request a coisa desandou e depois tínhamos que fazer um refactoring pra desacoplar os modelos um do outro. Hoje em dia,eu já persisto em começarmos com modelos separados pra evitar essa dor。
事件/事件
作为 2 个组的课程:
- 使用类:Essas 类实现为应用程序的关联、持久性和依赖性。模型是灵活的,应用程序是可变的。总体来说,我们的课程包括多种不同模式的课程和支持课程的具体责任的实体。
- Entidades:São as entidades do nosso sistema。 Elas podem ser anêmicas sendo apenas simples estrutura de bados ou agrupar comportamento que alteram o valor do object.作为 entidades também nos ajudam 的封装模块和组件,可恢复应用程序。
为何?您可以在很长一段时间内重新使用多个 API 的类。没有任何想法可以与不同 API 中的特殊用途的类一起使用或使用。嗯,示例是“Manager”类,例如,ProductManager 可以实现创建/更新/删除/读取消息类,以便重新使用算法功能。 Agora 想象一下,您可以更新 3 个依赖项,或者删除 2 个依赖项,或者创建 3 个依赖项。此外,如果依赖项不同,则不能使用 8 个依赖项。无论如何,我认为不同的阶级有不同的用途,并且抽象的公共性是独立的,而不同国家的用途是不同的。
Ainda nessa camada a maior polêmica é, devo anotar nossas entidades com anotações de persistência ORM (对象关系映射)?该项目主要包括持久性实体和独立管理实体的实体,以及永久转换为外部实体的实体。 Porém,请记住,我必须分开并了解必要的事项。新的项目,我们将永远以 1:1 的方式在 domínio 的营地中持续进行。这是两个不同的原因,主要是为了实现新的算法和定义问题,或者是 KISS 和 YAGNI 的原则。这是一个新的项目,是一个 ORM 框架的核心。这是一项不同的任务。
外部依赖
Para cada serviço externo,onde externo senseifica uma chamada de rede,nós criamos uma classe。该类功能是外观和反腐败层的主要功能,也是外部依赖。 API 是一个简单的普通类 API,适用于所有的专有实体。
为何? Aqui queremos isola as dependentências daquele sistema externo em um único ponto。徽标是 API mudar,用于已弃用的 ou algo específico daquele sistema acontecer,apenas 1 classe do nosso código é afetada。
坚持之家
类似于 camada que interage com os serviços externos。我们的持久性是一个类,它是一个与 ORM 算法框架持久化相关的实体(se você já nao tiver feito isso no domínio)。
为何?我们将继续保持简单的状态。包容性的,我们可能会使用框架来实现主要的操作,例如Spring DATA。
横向配置和关注点
Colando 是我的主要工作人员和配置人员。通常,它代表了与所需要的对象和功能连接相关的依赖项的框架。
É nessa camada também que carregamos as variáveis deambiente que variam por região(US, JP, BR, etc...) e/ou stage (dev, pre-prod e prod).
外部配置是横向的。类截取算法comportamento entre camadas,例如。以控制器为例,拦截器是与控制器一起使用的。该功能可实现数据验证、验证、查马达记录等功能...请使用 tratada pelo 控制器进行 ANTES dachamada 操作。这些功能是通用的,并且可以轻松地与应用程序控制器一起使用。
为何?为了召开会议。当地的主要工作人员会在会议上对我们的情况进行注释。不过,作为配置类,所有这些对象都与感兴趣的逻辑学相关。徽标用户配置类可以通过注释来方便地进行控制和灵活性。
Eu já passei por alguns exemplos bem específicos onde as anotações atrapalharam mas dito isso, projetos que nos tínhamos não há muita differença entre usar as anotações ou não, logo, se estivesse começando um projeto novo eu faria o que é mais简单并继续作为企业的约定。
实验 1:ReviewsService
图中展示了一个关于电子商务产品的“建筑”,我想像一系列的提交系统(评论)。
免责声明:本声明仅供参考。 🤭
想象一下使用的实现方法:CreateReview。关于系统设计和讨论的主要内容是:
- Usuário invoca o serviço para criar uma nova 评论。
- 评论服务 invoca um serviço externo para obter detalhes adicionais da review.例如, apelido do usuário。
- 评论服务萨尔瓦评论没有银行德达多斯。
- Banco de bados notifica um serviço de moderação com uma nova review criada。
- 审查服务结果的中度服务。
- 评论服务可更新银行网站或结果。
Agora na hora da Implementação nós imaginamos as seguintes Class/camadas:
控制器
我们有 2 个控制器:
- CreateReview是实现 nossa API 的。控制器收到请求后,会将其视为验证必要性和转换RequestDTO和CreateReviewDTO 的方式,以供我们使用。改造和改造项目是可选的,或者什么项目是这样的?请与UpdateReview控制器/caso de uso保持一致。请参阅第 8 步。
- UpdateReview控制器实现了一个外部 API。您可以使用 API 来使用不同的应用程序。请参阅 Adapters/Integração abaixo部分的详细信息。
事件/事件
- CreateReviewUseCase可乐于我们的业务。 Adapter DetalheReviewsAdapter 的外部服务是类服务。有关 DTO 和适配器返回的信息,请参阅我们的新评论和评论。
- 审查e outras entidades de domínio(不代表无图表)。这是一个简化的 ORM 框架。
坚持
- ReviewDAO persiste a nossa entidade审查no banco de bados。与 AWS DynamoDB 相关的BD 课程的强化课程
持久性的基本组成部分,您可以通过解释/完成来解释:
- O DynamoDB através da funcionalidade de Streams (post em breve, prometo 😊) envia uma mensagem semper que uma nova review é criada.一个关于 AWS SQS 的信息( outro post futuro)。
- SQS 的使用方式是在结束时间提供适度的服务。 (Eu estou simplificando bastante aqui,dificilmente nós iríamos expor uma fila SQS,isso tem mais cara de um Tópico SNS com 多个订阅者)。
适配器/集成
- Depois de moderada,一份 nossa review é aprovada ou rejeitada。小型工人实现了现代化的监听器,以实现现代化的系统。 ModeracaoListener接收消息并转换为UpdateReviewDTO ,这需要更新UpdateReviewUseCase 类。
是否应该在 DTO 中做出决定?如果需要多个系统,则必须使用 API 类的侦听器依赖项( o RequestDTO )。
请注意解决“经典”问题的方法。云环境环境解决了与AWS Lambda相关的微服务问题。
使用时的简化和权衡
Como escrever um sistema que escala para milhares de requisições por segundo é muito Complexo, varias simplificações foram feitas:
- 装饰者的各种变化是在银行第一次更新时进行的。 Algo 是事件驱动的,可保证升级。示例是DetalhesReviewAdapter的示例,示例是装饰器的附加信息,是评论的 escrita nosso banco de bados 和 nos desacoplaria de esperar uma chamada síncrona ser feito a um serviceviço externo。
- 请勿使用任何辅助工具,以实现权力的最大化。正常情况下,您可能需要依赖其他物品。
- 今天,我们将就激光雷达的评论和相关内容进行讨论,以供参考。
- Não estou usando outros padrões como“事件源”。请考虑将状态保护作为 ações e dali tirar um snapshot do review resultante (Se estiver curiosa(o) dê uma olhada no padrão de Event Sourcing )。
在权衡方面,请注意:
- 我们知道主权国家的所有实体都来自银行。为啥? Na maioria dos projetos, or mapeamento quase 1-1. Se os dois começassem a divergir, eu faria o seguinte refactoring.
- Criar um novo DTO 特有的持久性。
- 管理一个 domínio 实体并复制新的 DTO 代码。
- 作为新 DTO 的持久化类。
- 您可以使用额外的 DTO 来使用它。因此,直接通过 DTO 进行控制器操作是必要的。
- O nosso Listener chama o caso de uso mas muitas vezes, nos queremos que todas as chamadas, mesmo quando feitas dentro do mesmo sistema passem pela API.您可以使用ModeracaoListener调用 API 来使用或使用银行。这是受保护者的保护,也是为了保护 API 的安全。
作为complexidades estão nas "bordas"
Você pode estar pensando。 “Essa“arquitetura”é simplória demais”或“Mas e os testes?”。 Pois bem, as soluções escritas nesse "padrão" são todas bem testadas, tanto do ponto de vista de unidade quanto de end-to-end。在统一的情况下,com 框架是现代的Mockito(Nem tão 现代 assim),并且可以模拟具体的类。您可以使用公共方法和公共方法来进行预防。
这是一个简单的概念,一个简单的想法。主要遇到的问题有以下 8 个:
- Serviço externo A retorna erro Y quando deveria retornar Z.
- 执行同时执行的命令
- 基础设施不升级或具体问题如下。
- 3 个系统之间的交互和协调可用于交易。
- 重复操作会导致重试。
是否存在一些问题?在系统设计中出现的一些重大问题是系统设计中出现的错误,或者是系统中的一些问题,最后是系统分配的问题。
结论
Nesse artigo eu apresentei uma proposta que vai de encontro a outros de arquitetura como “Ports and Adapters” or a “arquitetura limpa”.我不认为这是 100% 对比模型,而是工业界的成功范例,或者使用六角形和/或干净的建筑。 Porém tais necessidades devem emergir dos seus requisitos。
观看 Netflix 的视频。所有这些都需要连接套管针以快速输入/输出数据源,以确保六角形结构的同质性。
最后,es artigo não é uma receita do que você deve fazer。您可以决定体验和演示该软件发送的文本、内容和罗丹多,以便在未来的世界中取得成功,而不是继续阅读“建筑”。 Esses sistemas são bem testados and rodam todo dia para milhões de usuário simultâneos.
想要在系统中快速完成课程,就必须先完成课程。请注意,不要发表任何评论或推特。
文章来源:https://dev.to/hugaomarques/a-arquitetura-simples-lb