小编Tuo*_*nen的帖子

丰富的域模型与贫血域模型

哪个是Web开发,贫血域模型或富域模型的更好实践?

贫血域模型意味着实体是映射到某些持久存储的愚蠢POJO.getter和setter不验证状态转换,但信任上面的层.服务层负责验证实体的合法状态,并在违反业务规则时发出错误.这就是我习惯使用Spring和Hibernate构建Web应用程序的方法.

富域模型意味着验证逻辑(业务规则)驻留在实体本身中,例如,如果尝试非法状态转换,则从setter抛出异常.

在给出更深入的洞察之后,富域模型更接近于OOP原则,其中贫血域模型与将结构传递给C函数一样程序化(实际上,setter和getter在这里只是一个样板,以纪念javabean契约) .那么为什么更多采用贫血领域模型,这两种方法的优缺点是什么?

我可以看到富域模型的一些问题.例如,如果实体的有效状态取决于某些其他实体的状态,但实体没有对所有实体的引用,那么我们如何从实体内部验证状态?我们可以从setter访问数据库,但这会将持久性机制泄露给业务逻辑,这确实是一个非常糟糕的设计.此外,当ORM从数据库加载已经验证的对象并设置其值时,将执行不必要的验证!借助驻留在服务层中的业务逻辑,随着需求的变化,更容易添加临时验证逻辑,并使域模型保持清洁基础架构代码.实际上在任何一种情况下都是业务逻辑IS与持久性相关联,并且在实践中,域模型在没有逻辑的情况下毫无价值,但是当逻辑驻留在服务中时,我们可以将不同的规则集应用于不同上下文中的相同实体.我认为这是服务层的目的吗?

此外,hibernate或其他持久性机制期望实体是POJO,并且只对获取和设置值感兴趣.当然,富域模型数据库应始终处于一致状态,但如果不是,会发生什么?富域模型对现代ORM框架有何影响?

当我最近读到贫血领域模型是反模式时,我问了这个问题.我感到困惑,并希望听到这样一个声明的理由.

java architecture spring entity domain-model

8
推荐指数
0
解决办法
826
查看次数

如何理解clojure的懒惰seq

我试图理解clojure的lazy-seq运算符,以及懒惰评估的概念.我知道这个概念背后的基本思想:表达式的评估会延迟到需要的值.

一般来说,这可以通过两种方式实现:

  • 在编译时使用宏或特殊形式;
  • 在运行时使用lambda函数

使用惰性求值技术,可以构造被评估为已消耗的无限数据结构.这些无限序列利用lambdas,闭包和递归.在clojure中,这些无限数据结构是使用lazy-seqcons形成的.

我想知道lazy-seq它是如何神奇的.我知道它实际上是一个宏.请考虑以下示例.

(defn rep [n]
  (lazy-seq (cons n (rep n))))
Run Code Online (Sandbox Code Playgroud)

这里,rep函数返回一个延迟评估的类型序列LazySeq,现在可以使用序列API对其进行转换和使用(从而进行求值).这个API提供的功能take,map,filterreduce.

在扩展形式中,我们可以看到lambda如何用于存储单元格的配方而不立即进行评估.

(defn rep [n]
  (new clojure.lang.LazySeq (fn* [] (cons n (rep n))))) 
Run Code Online (Sandbox Code Playgroud)
  • 序列API实际上如何使用LazySeq
  • 以下表达式实际发生了什么

(reduce + (take 3 (map inc (rep 5))))

  • 如何将中间操作map应用于序列,
  • 如何take限制序列
  • 终端操作如何reduce评估序列

另外,这些功能如何与a Vector或a一起使用LazySeq

此外, …

lisp recursion lambda clojure lazy-evaluation

8
推荐指数
1
解决办法
1125
查看次数

为什么微服务之间的共享库不好?

山姆·纽曼(Sam Newman)在他的《建筑微服务》一书中指出

服务之间过多耦合的弊端远不如代码重复所引起的问题

我只是不了解服务之间的共享代码是多么邪恶。作者是否表示如果需要共享库,则服务边界本身设计不良,还是真的意味着在出现常见业务逻辑依赖性时我应该复制代码?我看不出能解决什么。

假设我有两个服务共有的实体共享库。两个服务的公共域对象可能有异味,但是另一个服务是用于调整那些实体状态的GUI,另一个是用于其他服务轮询其状态的接口。相同的域,不同的功能。

现在,如果共享知识发生了变化,无论通用代码是外部依赖项还是跨服务重复,我都必须重建和部署这两个服务。通常,这取决于业务逻辑的同一条,涉及两种服务的所有情况。在这种情况下,我只会看到重复代码的危害,从而降低了系统的凝聚力。

当然,在共享库的情况下,与共享知识区分开可能会引起头痛,但是即使这样,也可以通过继承,组合和抽象的巧妙使用来解决。

那么,山姆所说的代码复制比通过共享库进行过多耦合要好吗?

architecture interface distributed-computing shared-libraries microservices

8
推荐指数
3
解决办法
4193
查看次数

React 创建模态窗口的最佳实践

如何使用 React 创建模态窗口?我所说的模态窗口是指覆盖页面内容的框架。我希望它使用网页上的按钮打开,能够通过单击外部区域来关闭它,并且它将包含一个用户将填写和提交的表单。

React 是否有一些用于此任务的生产就绪库,或者我应该使用 css 来实现它?另外,在容器/代表性组件模式的情况下,我应该将模态组件嵌套在模态打开组件的容器组件内还是模态打开组件本身内部?

html javascript css user-interface reactjs

7
推荐指数
1
解决办法
1万
查看次数

如何在组件外部访问react-redux存储

我有文件导出各种实用程序函数以跨组件使用,这些函数需要访问redux状态.如何将状态对象导入此文件?

javascript store reactjs redux

7
推荐指数
2
解决办法
4912
查看次数

Ansible,找不到角色错误

我尝试播放以下针对localhost的playbook来提供Vagrant机器

---
- hosts: all
  become: yes
  roles:
    - base
    - jenkins
Run Code Online (Sandbox Code Playgroud)

我从github克隆了必要的角色,他们居住在一条相对的道路上 roles/{role name}

执行以下命令:ansible-playbook -i "localhost," -c local playbook.yml输出此错误:

==> default: ERROR! the role 'geerlingguy.java' was not found in /home/vagrant/provisioning/roles:/home/vagrant/provisioning:/etc/ansible/roles:/home/vagrant/provisioning/roles
==> default:
==> default: The error appears to have been in '/home/vagrant/provisioning/roles/jenkins/meta/main.yml': line 3, column 5, but may
==> default: be elsewhere in the file depending on the exact syntax problem.
==> default:
==> default: The offending line appears to be:
==> default:
==> default: dependencies: …
Run Code Online (Sandbox Code Playgroud)

configuration provisioning vagrant ansible ansible-playbook

7
推荐指数
1
解决办法
1万
查看次数

实践中的微服务

我现在已经研究了微服务的概念,并了解它们是什么以及为什么它们是必要的.

快速复习

简而言之,monolith应用程序被分解为独立的可部署单元,每个单元通常公开它自己的Web API并拥有自己的数据库.每项服务都履行一项责任并做得很好.这些服务通过REST或SOAP等同步Web服务进行通信,或者使用JMS等异步消息传递来协同处理某些请求.我们的整体应用程序已成为一个分布式系统.通常,所有这些细粒度的API都可以通过API网关或代理提供,它充当单点入口外观,执行安全性和监视相关任务.

适应微服务的主要原因是高可用性,零停机更新和通过特定服务的水平扩展实现的高性能,以及系统中更松散的耦合,这意味着更容易维护.此外,IDE功能,构建和部署过程将显着加快,并且更容易更改框架甚至语言.

微服务与集群和容器化技术(如Docker)密切相关.每个微服务都可以打包为docker容器,以便在任何平台上运行它.集群的主要概念是服务发现,复制,负载平衡容错.Docker Swarm是一个集群工具,它协调这些容器化服务,将它们粘合在一起,并以声明方式处理所有这些任务,保持集群的所需状态.

理论上听起来既简单又简单,但我仍然不明白如何在实践中实现这一点,即使我非常了解Docker Swarm.让我们看一个具体的例子.

这是个问题

我正在使用Spring Boot构建一个简单的java应用程序,由MySQL数据库支持.我想构建一个系统,用户从服务A获取网页并提交表单.服务A将对数据进行一些操作并将其发送到服务B,后者将进一步操作数据,写入数据库,返回一些内容,最后将一些响应发送回用户.

现在的问题是,服务A不知道在哪里可以找到服务B,也不是服务B知道在哪里可以找到数据库(因为他们可以在集群中的任何节点部署),所以我不知道我应该如何配置Spring启动应用程序.我想到的第一件事是使用DNS,但我找不到如何在docker swarm中设置这样一个系统的教程.在Spring中为分布式云部署配置连接参数的正确方法是什么?我已经研究过Spring Cloud项目,但不明白它是否是这种困境的关键.

我也很困惑应该如何部署数据库.他们是否应该居住在集群中,与服务一起部署(可能借助于docker compose),还是以更传统的方式使用固定IP进行管理?

最后一个问题是关于负载平衡.如果每个服务应该有多个负载平衡器,或者只有一个主负载均衡器,我会感到困惑.负载均衡器是否具有映射到域名的静态IP,并且所有用户请求都以此负载均衡器为目标?如果负载均衡器出现故障怎么办呢?它是否会尽一切努力来扩展服务毫无意义?是否有必要使用Docker Swarm设置负载均衡器,因为它有自己的路由网格?哪个节点最终用户应该定位?

cloud spring docker microservices docker-swarm

7
推荐指数
1
解决办法
528
查看次数

Clojure调试

如何调试clojure?是否有像Eclipse调试器这样的类似工具,或者我是否必须使用REPL和print语句来追踪错误?

如果后者,我怀疑功能范式的好处是否优先于原始/缺乏工具?毕竟,使Java如此优秀的原因不是语言,而是帮助编码,重构和调试的出色工具.只有clojure显示模糊的Java堆栈跟踪而不是翻译的错误消息以发现问题的事实让我趾高气扬.

我不禁得到clojure生态系统不完整的印象,并且在生产中使用它会比收益更麻烦.想象一下,一个新手调试了其他人编写的clojure中的错误,没有适当的工具来介入代码.

我真的想学习这门语言,希望我的印象是错误的.语法方面,语言因其简单性和一致性而感觉舒适.

debugging functional-programming clojure

7
推荐指数
3
解决办法
811
查看次数

我什么时候需要与运行时范围的maven依赖

我试图了解runtimemaven中作用域依赖的特定需求.在哪种情况下我需要这个,哪个都没有compile,provided范围不会?

例如,compile当我必须直接在代码中调用库API(针对它进行编译)并将依赖项打包到工件或依赖项目工件中时,我会使用scope作为依赖项.

provided当我必须针对API进行编译时,我会使用范围,但不要打包它(除了它在运行时可用).

但我runtime什么时候需要范围?这是针对什么情况,当我不直接调用库API(而是使用反射),但是想要将它打包在工件中?为什么不只是使用compile范围?唯一的好处是编译时间更快,或者是否有其他特殊的runtime范围无法通过compile范围实现或避免?

java dependencies jar maven

7
推荐指数
3
解决办法
1541
查看次数

Dockerfile,如何从父目录复制文件

我有包含多个 docker 图像通用文件的文件夹。如何将COPY这些文件指向引用 Dockerfile 中父目录的图像?显然我不想将此文件夹复制到所有 Docker 项目中。

docker

7
推荐指数
1
解决办法
9799
查看次数