我为什么不用DDD
Domain-driven design并不是一个新鲜的东西,从 2004 年Eric Evans提出这个理念以来,十几年间时不时就有一股DDD的热潮,近几年随着微服务的大行其道,DDD又成了宠儿。但终究逃不过雷声大雨点小。 领域驱动设计最根本的思路是一套自上而下的设计方法,即从要解决的问题领域或系统目标出发,由业务和架构专家一起,对复杂的业务场景和关联性进行分组归类,形成一个一个相对单一职责的子领域。子领域和子领域之间要有明确的界限。在子领域内部,再通过业务上的模型去归类对应的属性和行为。 从设计思想上看,我非常赞同自上而下的架构设计理念,也在不断践行。但今天在技术圈里流传的DDD早已超出了上述的定义,而变成了一套以充血模型为基础,围绕聚合根,并通过门面代理、分离查询、事件传播等手段的软件架构方法。通过这种构建,想达成三种目的: 统一语言:业务与技术统一 让行为回归到实体中去 降低传统service层的复杂度 我所不采纳的即是这样一种“术”,有三个主要原因。 行为是变化的,对象的表达却是几乎不变的,将变化的与不变的聚合在一起,违反了动静分离的原则。 软件实现的是策略,...
详解Spring 5 Server-Sent Events(三) WebFlux
SSE,全称Server-Sent Events,作为一种半双工的前后端通信方式,由于实现方式简单、轻量,在后端向前端的主动推送场景中具备很好的应用效果,笔者最近在一个项目中多有使用,过程中也是查阅了不少资料和文档,也有所感悟,在此将整体做一次综述。这是一篇系列文章,共分三篇,这是第三篇。 详解Spring 5 Server-Sent Events(一) 基本介绍 详解Spring 5 Server-Sent Events(二) WebMVC 详解Spring 5 Server-Sent Events(三) WebFlux 引言Spring WebFlux framework 5.2.0基于Reactive Streams api,使用事件循环计算模型来实现异步Java Web应用程序。这样的应用程序可以运行在非阻塞的web服务器上,如Netty 4.1和Undertow 1.4,以及Servlet 3.1+容器,如Tomcat8.5和Jetty 9.3。 概述在WebFlux中实现发送事件,需要以下几步: 创建一个controller类并用@RestController注...
详解Spring 5 Server-Sent Events(二) WebMVC
SSE,全称Server-Sent Events,作为一种半双工的前后端通信方式,由于实现方式简单、轻量,在后端向前端的主动推送场景中具备很好的应用效果,笔者最近在一个项目中多有使用,过程中也是查阅了不少资料和文档,也有所感悟,在此将整体做一次综述。这是一篇系列文章,共分三篇,这是第二篇。 详解Spring 5 Server-Sent Events(一) 基本介绍 详解Spring 5 Server-Sent Events(二) WebMVC 详解Spring 5 Server-Sent Events(三) WebFlux 引言Spring WebMVC Framework 5.2.0基于Servlet 3.1,需要中间件能支持Servlet 3.1 API,比如**Tomcat 8.5 **和 Jetty 9.3。 概述在WebMVC中实现发送事件,需要以下几步: 创建一个controller类并用@RestController注释标记它 创建一个接受Http GET请求的方法,该方法返回一个SseEmitter对象 在另一个线程中,获取这个SseEmitter实...
详解Spring 5 Server-Sent Events(一) 基本介绍
SSE,全称Server-Sent Events,作为一种半双工的前后端通信方式,由于实现方式简单、轻量,在后端向前端的主动推送场景中具备很好的应用效果,笔者最近在一个项目中多有使用,过程中也是查阅了不少资料和文档,也有所感悟,在此将整体做一次综述。这是一篇系列文章,共分三篇,这是第一篇。 详解Spring 5 Server-Sent Events(一) 基本介绍 详解Spring 5 Server-Sent Events(二) WebMVC 详解Spring 5 Server-Sent Events(三) WebFlux 引言在性能可接受的web应用程序中,没有简单、通用的方法来实现服务端到客户端的异步通信。 HTTP是B/S中的一种请求-响应协议。客户端(通常是浏览器)向服务端提交请求,服务端向客户端返回一个响应。服务端只能向发出请求的客户端发送响应。在HTTP协议中,客户端是消息交换的发起者。 在某些情况下,需要服务端成为消息交换的发起方。实现这一点的方法之一是允许服务端将消息推送到支持发布/订阅模式的客户端中。客户端从服务端订阅消息,服务端向许多订...
WebFlux下的全局异常处理
Spring 5支持的WebFlux对于全局异常的捕捉与以前的WebMVC框架有了不同,不能靠@ControllerAdvice或@RestControllerAdvice打天下了。目前国内的资料比较少,而且语焉不详,下面我将处理方式分享出来,文末有我的项目代码供参考。 核心要点是要继承AbstractErrorWebExceptionHandler这个WebFlux下的全局异常处理类,然后重写getRoutingFunction。 需要注意的是AbstractErrorWebExceptionHandler中的构造方法中未对messageWriters进行初始化,源码如下: private List<HttpMessageWriter<?>> messageWriters = Collections.emptyList(); messageWriters是用于最终生成response body的,所以我们必须在实现类中对它进行初始化: public GlobalErrorWebExceptionHandler(ErrorAttributes err...
WebFlux下访问H2控制台
在基于WebFlux和Netty的应用框架中,惯常通过/h2-console访问的H2控制台无法打开。这个时候,可以通过显式的去启动H2 Server来解决此问题。参考代码如下: @Component@Profile("test") // <-- up to youpublic class H2 { private org.h2.tools.Server webServer; private org.h2.tools.Server server; @EventListener(org.springframework.context.event.ContextRefreshedEvent.class) public void start() throws java.sql.SQLException { this.webServer = org.h2.tools.Server.createWebServer("-webPort", "8082", "...
Push code to 2 repos
GitHub和CodingNet上已经创建好空仓库tools,拟将本机的项目代码同时提交到两个仓库 git initgit add .git commit "init"git remote add github https://github.com/frontc/tools.gitgit remote set-url --add github https://e.coding.net/lefer/tools.gitgit push -f --set-upstream github master
基于layer jars构建docker镜像
经过一番折腾之后,还是觉得老老实实的写Dockerfile更香,Spring Boot 2.3.1对layer jars的支持与2.3.0有所变化,网上的资料大部分都是过时了的,正确步骤如下: pom里开启layer jars支持 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <layers> <enabled>true</enabled> </layers> </configuration> ...
使用spring-boot-maven-plugin构建docker镜像
Spring Boot 2.3发布后带来了新特性之一就是对构建镜像的便捷支持,声称不用写dockerfile就能方便的构建docker image,最近刚好在写一个项目于是折腾了一下,只能说还不太适合国内用户,最终还是老老实实的写了dockerfile需要挂上代理才能勉强可用,下文记录折腾的过程。 更新 2020年6月19日尝试了诸如gcr.io的国内镜像、docker tag更改image的名字为原版gcr.io/等其他几种办法之后,发现只有挂全局代理才可以走通。 Windows下可以使用Proxifier设置全局代理,Proxifier的使用比较简单,网上说的比较多,如这一篇。 全局代理设置好,一切都OK了,如果走代理下载镜像比较慢,可以先把镜像从国内镜像源里拉到本地。然后再改Tag的名字,这样能跳过下载镜像的环节。 docker pull registry.cn-hangzhou.aliyuncs.com/lefer/paketo-buildpacks:0.3# docker tag imageid tag:versiondocker tag 87c89aeacd...
ToMu设计文档
项目介绍ToMu 是 Together Music 的缩写。ToMu是基于网络开放的音乐资源基础上,让一对听众一起听歌的平台。ToMu的初衷是找回在随身听时代,两个人共用一副耳机一边散步一边听歌的感觉。 GitHub:**ToMu** 项目特性 无需登录,记住你的频率即可 一个频率只能两人在线 用户流程主流程 用户访问网站 用户创建一个频道 用户可以将频道链接或者频道号分享给其他人,其他人使用该频道号即可进入频道 用户在频道内可以添加歌曲 用户在频道内可以播放已经添加的歌曲 同一频道内的两个用户同时听到播放的歌曲 主要用例 界面草图 频道页 核心流程 接口定义访问ToMu API Doc 开发计划v0.1 实现单人创建频道,添加歌曲,播放歌曲 v0.2 实现另外用户进入频道,同步频道状态,同步播放歌曲 v0.3 … …
