为 Spring WebFlux 提供 'ApplicationEventPublisher'

在 Spring 中提供了 ApplicationEventPublisher,用于发布事件,这在一些场景下十分有用,比如,当我创建一个货物,而另一个服务监听货物的创建并为其创建库存。所以在Spring MVC中很实用,我也常常用它来解耦,但是当我切换为 WebFlux 时,就尴尬了。因为 ApplicationEventPublisher 是同步操作,它并不支持响应式,即流操作。

所以,我在 WebFlux 中实现一个类似的发布订阅模式,以替代 ApplicationEventPublisher

WinGet Windows官方的包管理工具

WinGet 是官方推出的包管理工具,它目前支持以下命令

1
2
3
4
5
6
7
8
9
10
winget  install   安装给定的程序包
winget show 显示有关程序包的信息
winget source 管理程序包的来源
winget search 查找并显示程序包的基本信息
winget hash 哈希安装程序的帮助程序
winget validate 验证清单文件
winget settings 打开设置
winget features 显示实验性功能的状态
winget export 导出已安装程序包的列表
winget import 安装文件中的所有程序包

大部分命令都是很常见的,相对于Linux来说,WinGet的安装方式是下载exe mis等文件,直接运行安装,在体验上有些怪怪的。而且,从我个人使用来看,目前 WinGet 最适合的场景就是重装完系统,快速安装软件

R2DBC-传统数据库也能响应式编程

R2DBC 是 Reactive Relational Database Connectivity (关系型数据库的响应式连接) 的缩写,最近在项目中尝试 Webflux,被迫,使用 R2DBC 进行数据库操作(我还是更喜欢关系型数据库而不是文档型)。当然在实际使用后,发现这个框架虽然有些不足,但这才是我喜欢的DB框架

这里零散的记录下我遇到的一些问题,或者钟爱的一些特性,或者自己写的小工具

Spring Boot 2.4 新的配置文件处理方式

配置文件是 Spring Boot 的一个核心特性,自正式版发布以来,几乎未改动过,而在2.4中,Spring 官方调整了配置文件的处理逻辑

  • 外部配置文件优先于内部 Profile 配置
  • 重命名 spring.profilesspring.config.activate.on-profile
  • 新增 Profile 组

NPM 包代理

在国外,最简单的是安装,在国内,最难得就是安装,太难了

下面是一份我正在用的.yarnrc的配置

1
2
3
4
5
6
7
8
9
10
11
disable-self-update-check true
registry "https://registry.npm.taobao.org"
phantomjs_cdnurl "https://npm.taobao.org/dist/phantomjs/"
electron_mirror "https://npm.taobao.org/mirrors/electron/"
electron_builder_binaries_mirror "https://npm.taobao.org/mirrors/electron-builder-binaries/"
sass_binary_site "https://npm.taobao.org/mirrors/node-sass/"
profiler_binary_host_mirror "https://npm.taobao.org/mirrors/node-inspector/"
chromedriver_cdnurl "https://cdn.npm.taobao.org/dist/chromedriver"
operadriver_cdnurl "http://npm.taobao.org/mirrors/operadriver"
node_sqlite3_binary_host_mirror "http://npm.taobao.org/mirrors"
python_mirror "http://npm.taobao.org/mirrors/python"

Flutter 环境搭建注意事项

国内无法访问谷歌的服务,所以参考这篇 Using Flutter in China 官方的文档,进行配置

Flutter的中文社区为: https://flutter.cn

SDK下载

使用 https://storage.flutter-io.cn/ 代替 https://storage.googleapis.com/ ,下载对应的SDK,例如

或者使用迅雷下载,迅雷P2P加速可以绕过(迅雷11内测版下载)

Android Studio

Jetbrains 的下载工具已经支持下载 Android Studio, 可以通过它下载

Android SDK 现在似乎不被屏蔽了。。。

使用镜像

Flutter 依赖于 Dart 的依赖环境,在国内需要通过镜像访问。所以在在运行Fltter命令之前,需要设置两个环境变量:PUB_HOSTORD_URLFALTER_STORKER_BASE_URL

MacOS/Linux 用户

1
2
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn

Windows 用户

电脑 -> 属性 -> 高级系统设置 -> 高级 -> 环境变量 中修改

下载 Gradle

Gradle 没被墙,但是下载很慢,如果不手动下载,可能长时间卡在这一步

当你创建一个新项目时,会生成一些文件,其中有个${project}/android/gradle/wrapper/gradle-wrapper.properties

1
2
3
4
5
6
#Fri Jun 23 08:50:38 CEST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip

这个文件描述了 Gradle 下载的位置,以及它的分发地址(我这需要下载bin归档,不知道是我环境问题还是什么,即https://services.gradle.org/distributions/gradle-5.6.2-bin.zip)

存放的位置很奇怪,是${GRADLE_USER_HOME}/wrapper/dists/gradle-S{version}-all/${sha}/,比较简单的方法是先运行下,再去找这个目录,把已经下好的 gradle 归档文件直接丢进去,不需要减压或重命名

暂时就这些,如果还有以后补充

Hexo 5.0.0 正式发布

Node.js 上最快的静态站点生成器 Hexo 发布了 5.0.0 版本。作为 Hexo 核心团队成员,让我为大家介绍一下 Hexo 5.0.0 中的新特性,以及如何从 Hexo 4.x 版本升级到 Hexo 5.0.0。

Gradle 初探

第一次接触 Gradle 是在数年前做android开发的时候,然而后来我的工作都是 Maven 做web开发,所以 Gradle 也就忘得差不多了(其实本来就没学多少)

我相信每个看到这篇文章的人,都是用过 Maven 的, 想学习 Gradle,但在开始前,我们应该弄清楚为什么要学它,它能带来怎样的益处(相对于 Maven)?

Why

如果你问 Gradle 优于 Maven 么? 答案必定是不一定

在 Maven 中有完善的依赖管理以及成熟的构建流程,在绝大多数的项目中都能很好的运行。但也是那一套流程,使的 Maven 十分死板。而且 Maven 是只属于 Java 的项目构建工具

在 Gradle 中就灵活的多,你可以随意的定义流程,但一个大型的项目规范是十分重要的,即便是构建流程,也要有规范,也是要统一的,试问假如我要构建一个普通的Web应用,自己定的构建流程又怎么能比过这么长时间积累下来的 Maven 的流程的? 但我的项目是个缝合怪呢,有java有node,那么 Gradle 就能同时组织它们。 Gradle 是 Java 环境下的构建工具, 它不是 Java 项目构建工具, 就如 node 里的 Gulp

新网址!

netlify免费版的网络真的太差了(跟1年多前刚使用的时候比,差太多),所以原本打算迁移到github pages

看对比,github pages整体比netlify稳定的多,但github不支持重定向。而腾讯云的解析服务,重定向需要备案,所以dnocm只好保持不动,选择新增了一个部署

同时也尝试了coding,但在国外的ping不理想,所以干脆一次性部署了多个

假如,你在访问当前地址时,感觉卡,可以试试前往我的其他域名下