时间仿佛定格在这一天了,一向最不留情面的爷爷,在寂静的夜晚,悄悄地离开了我们。虽然对于爷爷感情并不是很深,但或多或少在我心里有不曾抹去的对与我的爱,也许只是在我看来是那么的保守和不近人情,可能这只是您独有的关爱方式罢了。
不经想起上一次见面,是在上一次回家(2020 年劳动节假期),去探望了您,没想到这一见面竟然是天人永隔。您的连环追命问题,迫使我是连连败退,不敢轻易登上您的大门。听爸妈说,今年您身体不好,一直住在医院,原本计划等今年十一左右回家,然后再去看看您,这成了永远无法完成的计划😭。姐姐哭着告诉我想到的事情就要去做,不要等到了失去后才后悔莫及,是呀,人总是等到失去后才懂得珍惜,我只是感觉越是长大越是难以想到同时也能做到
爷爷在那个时代属于中等个头,身材在我看来不胖不瘦,家里有琳琅满目各式各样稀奇古怪的东西,有手动给木头打孔的转,刨木头的刨子,标记线的墨斗还有好多好多我不知道的工具一副活脱脱的木工装备,但实际上爷爷并不是木工,只知道爷爷是有单位的人,是有文化的知识分子,在县城有单位分房子,在我印象中有三件事我记忆深刻
第一件,小时候去您家玩,在桌子上看到了各式各样的桥梁图纸,不知道这些桥梁都修建在哪里,然后看到了有一个白色透明很高级的三角板,当然我也见到了不一样的东西,一种被称之为 “雷管” 的炸药,这些应该都是您当年工作中经常使用的一些工具吧,在现在来看应该属于土木工程系,后来上小学,那把三角尺成了小学生涯最长的使用工具。如果有时光机,我想听一听您那时候工作故事和那些作图技巧,还想去看看那些您曾经设计或建造的桥梁道路
第二件,有一年过春节,爸爸给我买了枪(那个时候,男孩子过年好像都少不了这个礼物),然后到您的住的地方,您说这个样式不好,一连就在您家前门店家那里换了 3 次,我现在也记不清那是一把什么样的枪,好像记得一按斑鸠就会有音乐,在那个时候很高级的样子,如果有时光机,我想把那是我的玩具收藏进我的百宝箱里
第三件,那时候我小学六年级还是刚上初中吧。那一年大姑,小姑带着弟弟,妹妹从上海回到老家,然后在我们在您的台球厅玩耍,我学会了小台球的游戏规则,没人的时候我们会一起玩耍,可我重来都没有赢过一场,看来我对这项运动没有任何天赋,如果有时光机,我想和您再打一场台球
从我的视角来看,随着慢慢的长大到工作,相见机会越来越少,有时候一年也没有见上一面。刚开始工作后偶尔会打电话给你,到后来几乎没有再打过电话给你,因为每次电话我都是扯着嗓子在那喊,你说你才能听清我在说什么,其次本身自己是一个内向的人,话也很少,平时也没啥话可说,就这样渐渐几乎是失去了联系,每次也都是听父母的口中知道您的近况
虽然在我的记忆里除了这些温暖的画面,还有不少您的负面形象,可现在这些都不重要了,毕竟这些也是你生命里的一部分。我没有经历过,我没有发言权,就让这些负面的内容随风而去吧。记着一个人的好好过记住一个人的坏,身在异地他乡的我不能及时的回到你身边为你送上最后的一程,深感惭愧😮💨
爷爷您一路走好,愿天堂里没有病痛
]]>话说,国内的网络环境真的是一言难尽,不得不说在技术、技术基础设施、技术思想等发展道路上任重道远
对于个人几个主要的站点,规划如下
后续会迁移本站点部分文章到具体的领域站点
OSS 是一种面向海量数据规模的分布式存储服务,具有稳定,可靠,安全,低成本的特点。主要用来存储各种非结构化的数据,比如视频,图像,日志,文本文件等。OSS 服务提供标准的 RESTful API 接口,并提供一些常用语言的 SDK 包,方便开发者进行快速开发和二次处理
市面上提供云服务的厂商有很多,这里以阿里云的 OSS 服务为主来,完成 OSS 相关的学习和实践
1 | <!-- https://mvnrepository.com/artifact/com.aliyun.oss/aliyun-sdk-oss --> |
1 | /** |
这里我们写一个上传接口
1 |
|
不废话了,直接看图就好了
MinIO 包含 MinIO Server, MinIO Client 以及方便开发基于不同编程语言使用的 MinIO SDK,这三部分组成,使用步骤也很简单,在服务器上安装 MinIO Server 应用,在项目中集成对应的 MinIO SDK,然后按照你的业务情况编写相应的实现即可,在开始前,我们先看看为什么我选择 MiniIO 作为自建的 OSS 服务
由于 MinIO Server 已经提供了 Docker 的安装镜像,那我们就以 Docker 安装为例,其他安装方式可参考官方教程 MinIO Quickstart Guide
关于 Docker 的安装这里不再赘述,Docker 相关详细的使用等知识,可参考我之前的文章 Docker(一)
1 | # 1. 拉取 minio docker 镜像 |
这里简单说一下命令的含义,应用命名为 minio ,运行服务在 9000 端口,同时将容器的相关路径文件映射到宿主机的
/opt/docker/minio
路径,开机自启
成功运行服务,可查看日志
1 | Endpoint: http://172.17.0.2:9000 http://127.0.0.1:9000 |
安装完成后,我们就可以通过 http://localhost:9000 访问 MinIO 服务,默认用户名和密码分别为: minioadmin, minioadmin
我们直接看图,输入账号密码后,可以看到 MinIO 的管理页面,我们就可以上传文件,是不是很方便。第一次上传必须先要创建一个 bucket 后,才可以上传,如下图操作结果
这里以 Java 语言为例,查看官方文档时,一定要查看英文文档,中文文档已年久失修落后很多,其他的语言实现请参考官方文档
1 | dependencies { |
由于我这里是 SpringBoot 项目,为了方便在应用的 application.yml
文件中配置了 MinIO 相关的参数
1 | minio: |
1 | /** |
1 |
|
创建 bucket 时,命名不可以使用下划线符号 “_”
通过网页管理页面修改登录账号及密码,提示 “Credentials of this user cannot be updated through MinIO Browser.” ,原因是安装应用时,并未显示的指定用户名和密码,可在运行启动时添加如下配置
1 | -e "MINIO_ROOT_USER=admin" \ |
通过网页管理页面共享图片或者是使用 SDK 上传图片得到的图片 URL 地址,有效期最长为7天
1 |
|
关于 MinIO 还有很多知识点,本片只是站在使用者角度,把一些使用过程和问题进行了汇总,谈不上深度
这是我第一次来开发小程序,虽然之前有开发 Android 客户端的经验,有一定的客户端经验,但是小程序却一直没有去实践,我主要是觉得小程序的使用体验真的很差。但随着现在人们的硬件设备越来越好,并且微信团队在应用底层也做了很多的扩展和优化,现在使用小程序开发轻量级的应用还是很方便且高效
关于账号的申请,这里不做讲解,请自行解决
不废话,直接看图
项目是一个基于云开发的方式,创建完成后会包含云相关的一些操作实例
1 | bill |
从上面我们可知初始化的项目,包含了一些示例,我们对其精简
整个步骤,如下截图
执行命令根据官方提供的方式和自身喜好选择,我这里使用的是
yarn
命令进行安装相关的依赖
这里以添加 Button 为例来查看是否生效
index.json
文件中,添加 vant 的 Button 组件1 | { |
index.wxml
文件中,添加 vant 的相关组件 1 | <van-button type="primary">主要按钮</van-button> |
对于引用的组件,是公共的,可以写在
app.json
文件中
回想起之前写文章主要是为了记录一些操作步骤和一些知识点,方便遇到类似问题,快速定位,解决问题。但随着文章的越写越多,包含的内容也越来越多,需要去了解的知识也越来越多,真的是有一种 “你知道的越多,你不知道的越多” 的感觉,这种感觉让我对待每个知识点都能有往深去深挖的动力,对每一个知识点用自己文字将它讲出来时有一种让我欲罢不能成就感,这或许就是上瘾吧
总结下第一个里程碑,主要是平时接触到领域算是一些入门级别的一些文章,以及一些比较粗浅的见闻,缺乏深层次的剖析和思考,这也是第二个里程碑首要做的事情,把每个接触到的知识点进行深挖,打通自己的技术栈。技术领域能不能走得远,很大程度上并不是你的技能宽度,而是深度,是在一个方向上的深耕,并且对于底层的技能也是要有足够的涉猎,只有这样就算是技术的花样任它怎么去变,你都能以不变应万变(透过现象找到本质);第二点是是对第一阶段内容完善补充;第三点就是打磨自己的语言表达能力,让文章更加的通俗易懂;第四点就是不能太拖拉,要保持高效的内容输出
这一阶段,对开源项目贡献评价最高的是 rap2-delos 项目了。努力在接下来的里程中,提高质量和参与度,争取早日在大型项目中做到 Committer
很感谢这一路走来,大伙对我的认可和期待以及赞赏,下一个里程碑我们见~
]]>Gradle 版本通过 https://github.com/spring-projects/spring-boot/blob/master/gradle/wrapper/gradle-wrapper.properties 文件可知,使用的 6.7.1-bin,那么本地也使用该版本编译,对于 Gradle 的安装可参考 Gradle(一)基础 文章
1 | # 这里使用 cnpmjs 来提高 clone 速度 |
使用 IDEA 打开项目,会自动创建索引以及,下载项目的依赖,由于依赖的 jar 比较多,建议使用 阿里云 镜像,关于 Gradle 怎么修改依赖镜像源,可参考 专治各种网络不服 文章,阿里云镜像能加速大部分的 jar,但有一部分在阿里云上并没有,你可以通过手动方式导入到本地
]]>对于单工程,和聚合工程的选择主要根据你所在项目团队的大小,项目分工,以及项目的复杂程度等来考虑。
单工程:适用于项目分工明确,项目庞大复杂,架构服务边界划分明确,配套的自动化等设施完善
聚合工程:适用于项目人员不是很多,项目功能一般,需要一个人集中化管理等
1 | // 项目使用插件,可从 https://plugins.gradle.org 库中寻找合适的插件 |
一个 SpringBoot 项目基本的 build.gradle 文件由 plugins,项目坐标,repositories,dependencies,test 基础内容组成。关于 plugins 使用常见有两种方式,核心的依赖,是没有版本号,它和你使用的 Gradle 关联,你无需过多关系这些核心插件的依赖版本
1 | // 旧方式 |
用于项目模块管理,由于这个单工程,这里只有一个模块
1 | rootProject.name = 'demo' |
可通过自定义 task 来出来
1 | // prod |
启动方式
方式一:图形化界面中,直接运行对应环境
方式二:在命令行中,使用命令来运行对应环境,比如 gradlew bootRunDev
方式三:当然你也可以在启动时指定你需要激活的环境
1 | # 这里激活的 test 环境,把 ${jar_name} 参数换成对应启动的应用文件 |
1 | testImplementation('org.springframework.boot:spring-boot-starter-test') { |
打包时需要,注意我们的 SpringBoot 应用它本质上是一个 bootJar(Fatjar) 应用,因此需要将应用打成一个 bootJar(Fatjar)。而对于什么是 bootJar 和 jar 的区别,可以查看之前在 SpringBoot(二) 启动分析JarLauncher 文章中对于 jar 规范 说明
打包方式
方式一:图形化操作
方式二:命名执行
1 | # 在项目的根目录执行,Windows 使用:gradlew;Linux/macOS:./gradlew |
1 | // gradle 脚本执行所需依赖,分别是对应的maven库和插件 |
1 | // 默认指的是创建 Android 项目生成的 app 模块,也是默认的应用启动模块 |
1 | // 表示这是一个应用程序模块,可直接运行 |
关于 module 中的 build.gradle 配置文件中的各项已在示例中加入了注释说明,其中一些配置,这里再简单的说明下
这里的 apply plugin
有两种模式:
前者可以直接运行,后着是依附别的应用程序运行
这里主要是生成安装文件的配置信息,一个 debug 类型,用于指定生成测试版安装文件配置,可忽略不写;另一个是 release,用于指定生成正式版安装文件的配置。
这个配置主要是解决应用发布在不同应用市场,而需要对不同应用市场做一些不同配置,比如包名,应用名,以及一些统计,而需要不同渠道统计 ID 等
packagingOptions 常见的设置项有 exclude、pickFirst、doNotStrip、merge
1 | packagingOptions { |
1 | packagingOptions { |
1 | packagingOptions{ |
1 | packagingOptions { |
应用由多个 module 构成,而不同地方引用的包,需要做到全局的统一时,可以创建一个 xxx.gradle
的文件(这里的 xxx,自行取一个表明含义的内容即可),然后在使用的地方时,统一调用定义的版本即可,使用步骤如下
xxx.gradle
文件(一般放在项目的根目录,和顶级 build.gradle 文件在同一层级),并添加如下内容,可根据自身需要调整 1 | ext { |
build.gradle
文件底部,表明添加对 xxx.gradle
的使用1 | apply from: "xxx.gradle" |
build.gradle
文件中,修改哪些固定写死的依赖版本1 | // 之前固定的版本 |
快速
的自动化
)Tencent Gradle 镜像同步有一定的延迟,需要注意
下载需要的版本即可,推荐最新版,这里以最新稳定版 6.7.1 为例,每个正式版本包含如下文件,我们选择 xxx-bin.zip
(二进制版,只包含了二进制文件(可执行文件),没有文档和源代码) 或 xxx-all.zip
(完整版,包含了各种二进制文件,源代码文件,和离线的文档)的文件即可,进行手动安装
1 | gradle-6.7.1 |
当然如果你使用的 macOS 系统,且也已经安装了 homebrew
包管理工具,那么同样你也可以使用 brew 命令来安装 Gradle,那么你将不需要再去手动配置 Gradle 的环境,它的安装默认路径在 /usr/local/bin/gradle
,安装完成后你就可以使用 gradle 的相关命令
1 | # gradle 安装 |
手动下载解压的文件进行安装,则需要配置 Gradle 的环境,这样方便我们在任何地方都可以调用 Gradle 的命令,对于 macOS 上手动安装配置 Gradle 环境的操作,可以参考 MacBook Pro 初始化 这篇文章 Gradle 配置
对于 Windows 系统,按照如下步骤进行添加环境变量,我这里 Windows 上为了和项目中 Gradle 版本有所区分,配置的是 6.7 版本
配置完成后,老规矩我们需要验证下我们的配置是否生效,在命令行中输入 gradle -v
命令,查看有 Gradle 相关的版本信息提示,我们的配置就已成功
GRADLE_HOME 这个环境变量,它主要是我们手动配置指定 GRADLE 使用的命令环境
GRADLE_USER_HOME 指配置 Gradle 的安装下载的路径。默认 /Users/<PC NAME>/.gradle
路径,如果你在系统环境中设置了 GRADLE_USER_HOME 的环境变量,那么下载的路径就变成了你自定义设置的路径
刚刚在上面我们配置时,使用了 gradlew
命令,那这个又是啥呢,这里简单解释下,gradlew 是 gradle wrapper 的简写,对于 Gradle 构建的项目,用于解决 Gradle 安装,部署以及统一项目的 Gradle 的构建版本等一系列问题。
Gradle 有两个基本的概念:project 和 task,Gradle 里面的所有东西基于这两个概念
一次构建可以有 1 到 n 个 project,而每个 project 有 1 到 n 个 task
Android 项目工程一开始就默认使用 Gradle 来构建,在 Android 领域里使用花样也是比较多,更好体现了 Gradle 的灵活性,对于后端 Spring 系列项目,现在也是越来越多的开始使用 Gradle 来构建了,在 Spring Boot 2.3.0.M1 版本官方已开始在生产环境开始使用 Gradle 代替 Maven 进行构建,测试,发布项目。这从侧面也印证了 Gradle 对于复杂庞大的系统更加友好和高效。
对于使用 Gradle 构建的 Android 项目也好,Java 项目也好,还是 SpringBoot 项目也罢,它们都有共同的特点。在结构上有下面的相同点
1 | project |
主路径
子路径
主路径
子路径
distributionBase 和 zipStoreBase 有两种取值
/Users/<PC NAME>/.gradle
对应 Gradle 的下载及解压目录这里还需要注意下
Gradle 的存放地址,比如:~/.gradle/wrapper/dists/gradle-6.7.1-bin/bwlcbys1h7rz3272sye1xwiv6
这里一个看起来无规则的文件夹,我们的 gradle 下载及解压必须放在这个文件夹内,而这个看似无规则的文件夹,实质是根据 distributionUrl 路径字符串计算 md5 值得来的
对于build.gradle
及 settings.gradle
文件在 Android 应用和 SpringBoot 应用是不一样,因此关于他两介绍请移步 Gradle(二)Android,Gradle(三)SpringBoot 文章进行查看
用于声明依赖关系的配置
配置名称 | 角色 | 是否可消费 | 是否可分解 | 描述 |
---|---|---|---|---|
api | 声明API依赖项 | N | N | 在这里,您可以声明依赖关系,这些依赖关系会在编译时和运行时以可传递方式导出到使用者 |
implementation | 声明实现依赖性 | N | N | 在这里,您可以声明纯属内部的依赖关系,而不是要向使用方公开(在运行时仍向使用方公开) |
compileOnly | 声明仅编译依赖项 | N | N | 在这里可以声明在编译时需要的依赖项,而在运行时则不需要。这通常包括在运行时找到时会被阴影化的依赖项 |
compileOnlyApi | 声明仅编译API依赖项 | N | N | 在这里,您可以声明模块和使用者在编译时需要的依赖项,而在运行时则不需要。这通常包括在运行时找到时会被阴影化的依赖项 |
runtimeOnly | 声明运行时依赖项 | N | N | 在这里可以声明仅在运行时才需要的依赖关系,而在编译时则不需要 |
testImplementation | 测试依赖 | N | N | 在这里声明用于编译测试的依赖项 |
testCompileOnly | 声明测试仅编译依赖项 | N | N | 在这里声明仅在测试编译时需要的依赖项,而不应泄漏到运行时。这通常包括在运行时找到时会被阴影化的依赖项 |
testRuntimeOnly | 声明测试运行时依赖项 | N | N | 在这里可以声明仅在测试运行时才需要的依赖项,而在测试编译时则不需要 |
核心需要掌握的是 api
,implementation
,compileOnly
,runtimeOnly
这4种依赖方式
对于你可能看到依赖方式,compile(api),provided(compileOnly),apk(runtimeOnly) 这些方式是比较旧的依赖方式,在 gradle plugin 3.0 开始已废弃,请使用新的依赖方式
通过这种方式依赖的弊端是每次都需要构建 module,但 module 比较多时构建非常耗时,建议控制 module 的依赖数量,避免构建耗时
1 | // module 需要在项目根目录下的 settings.gradle 中通过 include 引入 |
本地的 jar 或者 aar 需要放在 module 的 libs 文件夹下,通过这种方式依赖
1 | // 方式一:可以一次性依赖 libs 下的所有 jar |
1 | // 在 module 的 build.gradle 中添加目录指定 |
1 | // 依赖明确的版本,标明 group、name 和 version |
在项目中推荐使用 gradlew 命令来进行执行,这样本质是使用项目所依赖的 Gradle 版本进行执行。当然如果你本地配置了 Gradle 的环境变量,你可以将 gradlew
命令更改成 gradle
来执行
注意:
gradlew
./gradlew
gradle
相关的命令,则配置 GRADLE_HOME 即可故宫博物院出品,奥秘之家设计制作(曾推出线下实景地铁逃脱游戏,2018联合《唐人街探案 2》推出《侦探笔记》的互动解密游戏,以及配合电影开发Crimaster),到手快一年了还没有完全解锁线上的关卡,倒不是玩不下去,而是懒,刷 B 站多香,动啥脑子,哈哈哈。言归正传,本篇记录自己解锁线上关卡的步骤,持续更新
公司原装配置电脑磁盘性能太差,实在是不能满足我的日常骚操作,然后就自己买了一个 m.2 接口的 SSD 硬盘,毕竟电脑之前已经有系统了,而且也已经安装好了开发环境,如果现在在新的 SSD 上直接安装新的系统,那么需要将之前的开发环境再折腾一遍,实在是伤不起。那么有没有别的方式。你别说哦,还真的有,方法是用一些工具对现有系统进行 clone 到新的 SSD 磁盘上。这都很好办,比如:傲梅分区助手,DiskGenius 都有系统迁移功能,可参考文章下方的参考地址,内有视频教程
注意:要设置好设置默认系统启动引导为新的磁盘
一开始,我觉得这么简单的操作能有什么问题,迁移完系统,并设置好系统引导,然而我发现并不能按照预期使用 SSD 来启动,试了好几遍,调整了 BIOS 的启动选项,依旧不能解决。后来我将原系统的磁盘拆下来,只留 SSD 磁盘,开机就能按照预期启动了,正常后在把原系统磁盘再装回去,同时记得检查下系统引导,确保还依旧是使用 SSD 系统盘
对于 Base64 ,开发者或多或少都有听过,严格意义上讲 Base64 不是加密方式,它只是一种编码方式,本篇文章就来详细的聊一聊 Base64 这个熟悉又陌生的朋友
在软件开发中通常有两种情况我们需要考虑软件的开源协议或者使用协议
我这里还是引用比较经典 阮一峰 文章中所绘制关于如何选择开源协议的图
图中已经很清楚的表示了如何去选择 LGPL, Mozilla, GPL, BSD, MIT, Apache 这 6 种协议
这里我们通过表格的形式介绍下这 6 种协议,当然除了表中列出的这些协议之外还有很多协议,我们就挨个来简单对他们有一个了解和认识
你会发现每篇文章下面都有申明版权,这里使用的是 BY-NC-SA 4.0 的协议,他们的含义如下
使用此协议,您可以自由地
只要你遵守许可协议条款,许可人就无法收回你的这些权利
上面说了那么多,有些协议并没有展开来说可能并不适用你当前的所需要选择的协议,那么你可以根据实际情况去筛选,可通过 https://choosealicense.com, https://kaiyuanshe.cn/license-tool 这两个网站按照步骤去选择,最终确定协议即可
每次对于 NexT 的升级或多或少都会遇到些问题,这次也不例外,首先是对于不同版本的管理,由于一些历史原因有三个组织仓库分别对应不同的版本域,升级是需要注意下,本次我是从 7.8.0 版本升级到 8.0.x 版本,以后跟随官方,每月更新 NexT
yarn 的安装,请自行根据你的系统去安装,我这里 macOS 使用命令即可
brew install yarn
package-lock.json
,并在根目录执行 hexo clean && rm -rf node_modules/
yarn install
rm -rf themes/
1 | git clone https://github.com/next-theme/hexo-theme-next themes/next |
1 | yarn add hexo-theme-next |
之前为了使主题更新不受影响,在项目的根目录 source/_data
路径下有一个 next.yml
文件来进行对 NexT 的自定义设置,那么在 8.0 版本开始,在项目根目录 _config.{theme}.yml
文件来代替之前在 source/_data
路径下的 next.yml
文件
由于 NexT 需要 Hexo5.0+,在升级到 NexT 8.0.x 版本警告信息如下
1 | (node:17336) Warning: Accessing non-existent property 'lineno' of module exports inside circular dependency |
是由于 Hexo 项目嵌套依赖了 stylus
包,而对于 0.54.5
版本在 Node 14+ 版本存在问题,比如这里 hexo-renderer-stylus
包的依赖
1 | …… |
1 | brew uninstall node |
package.json
文件中,添加如下配置 1 | "resolutions": { |
🌀 pull-2538
🐞 issues-2534
🛠 solve-Accessing non-existent property
之前用了 hexo-douban 插件来进行对 books 和 movies 进行管理,在升级到 Node 14+版本上,当前的插件也停止工作了,异常日志如下
1 | INFO 0 books have been loaded in 1130 ms, because you are offline or your network is bad |
作者在🐞 issues-2534 做了回复,暂时没有替代方案,故在新版中,我停止了 hexo-douban
插件的使用,挖个坑,等自己有时间或者有人修复此问题再或者有替代插件后再重新启用
1 | # yarn |
_config.yml
配置文件中,douban 的相关的配置_config.{theme}.yml
配置文件中,menu
配置的站点入口设置在 NexT version 8.1.0 版本,由于安全问题,Valine被移除,暂时我并未迁移 Valine 的评论
博客已启用 utterances 评论支持,配置也比较简单,如下
1 | utterances: |
对于 NexT 的文章,有时需要进行加密访问,那么该怎么去处理呢,其实这一点在 NexT 的生态里已经有了这样的插件,我们可以直接在使用在我们的 NexT 里面,只需要简单的配置
1 | # npm |
加密优先级:文章信息头 > 按标签加密
1 | # 文章密码访问 hexo-blog-encrypt |
可以对一类(标签)来进行统一的密码设置
1 | # 文章密码访问 hexo-blog-encrypt |
在你需要加密的文章前面,根据需要添加对应的参数,这里仅是一个示例
1 | --- |
各参数说明
对于多语言,根据自身需要添加,默认,修改博客项目根目录 _connfig.yml
文件 language
属性即可
1 | language: |
_config.{theme}.yml
文件,language_switcher
设置为 truesource/_data
文件夹下,创建 languages.yml
文件1 | zh-CN: |
多语言配置
由于暂未支持 Hexo5.0+版本,先占坑
在 2020.11.13 正式推送了 macOS Big Sur version 11.0.1 版本,这一个版本是改动比较大的版本,这里关于它的新特性就不做介绍了,有兴趣的请查看官方网站介绍 Big Sur
Glance 是一个快速预览增强,可以对一些文件进行快速预览,大大提高我们的日常效率,但该应用在 Big Sur 版本中不兼容,由于作者已入职 Apple,且对项目做了归档,不在维护,因此该问题依旧没有解决,可以使用一个付费的应用iPreView来满足当前需要
Glance 在 Big Sur 系统中失效
在 AirPods 使用过程中,发现有时候耳机并不能正常工作。通常情况下,我会断开与 macOS 的连接,重新连接,如果还是不能正常工作,在 macOS 的系统蓝牙设置里面,移除连接的耳机设备,将耳机放入 AirPods 盒子里面,先盖上盒子,然后再打开盒子,此时并按住 AirPods 盒子背后的按钮,直到前面呼吸灯变成白色,然后再 macOS 的蓝牙里面找到新的设备,并连接配对。同时也可参考官方指引步骤 连接并使用 AirPods 和 AirPods Pro
换一个连接设备,检查耳机是否正常,如果是正常,那说明耳机没有问题,问题就出在 macOS 声音管理上面,打开系统设置
-> 声音
-> 输出模式
->设置为居中的平衡模式(既双耳工作)
本篇文章主要讲一讲在构建分布式微服务应用时,经常遇到的问题以及对于同类型组件选择,以及在开发过程中相关问题的思考,对于在整个应用开发过程中,开发人员应该怎么去配合等等,那第一个问题是面对我们的业务场景该如何去做技术选型,我们先看 Spring 官方经典的微服务架构图
微服务的核心组件由:网关,服务注册发现,服务配置,熔断限流等组成
注意这里微服务主要以 Alibaba
系相关的开源组件为基础构建,并非是 Spring Cloud Alibaba
项目的照搬,而是基于企业实际业务需求的抽象整合,只为提高效率、总结编程套路以及提升编程思想
这里我汇总到表格中,方便查看比较
Java 最早由 SUN(Sun Microsystems,发起于美国斯坦福大学,SUN 是 Stanford University Network 的缩写)发明,2006 年 SUN 公司将 Java 开源,此时的 JDK 即为 OpenJDK
OpenJDK 是 Java SE 的开源实现,由 SUN 和 Java 社区提供支持,2009 年 Oracle 收购了 SUN 公司,自此 Java 的维护方之一的 SUN 也就变成了 Oracle
大多数 JDK 都是在 OpenJDK 的基础上编写实现的,比如 IBM J9,Azul Zulu,Azul Zing 和 Oracle JDK。几乎所有的 JDK 都派生自 OpenJDK,他们之间不同的是授权许可证。常见的 OpenJDK 发行商
发行商 | 长期支持(TLS) | 许可证(license) | TCK 测试 | 未修改的上游构建 | 提供商业支持 |
---|---|---|---|---|---|
AdoptOpenJDK | Yes | Yes | No | Optional | Optional(IBM) |
Alibaba Dragonwell | Yes | Yes | Yes | No | No |
Amazon Corretto | Yes | Yes | Yes | No | Optional(on AWS) |
Azul Zulu | Yes | Yes | Yes | No | Optional |
BellSoft Liberica JDK | Yes | Yes | Yes | No | Optional |
IBM Java JDK | Yes | No | Yes | No | Yes |
ojdkbuild | Yes | Yes | No | Yes | No |
OpenLogic OpenJDK | Yes | Yes | No | No | Optional |
Oracle Java SE | Yes | No | Yes | No | Yes |
Oracle OpenJDK | No | Yes | Yes | Yes | No |
Red Hat OpenJDK | Yes | Yes | Yes | No | Yes |
SAP SAPMachine | Yes | Yes | Yes | No | No |
TLS:long-term support,长期支持(LTS)是一种产品生命周期管理策略,在该策略中,与标准版相比,计算机软件的稳定版本可以维持更长的时间。该术语通常保留给开源软件,它描述的软件版本比该软件的标准版本支持数月或数年的支持。
TCK:Technology Compatibility Kit,技术兼容性套件(TCK)是一套测试套件,至少名义上检查Java规范请求(JSR)的特定声称实施是否符合要求
显而易见 OracleJDK 是在 Oracle 收购 SUN 公司之后,基于 OpenJDK 源码构建的 JDK 被命名了 OracleJDK,两则之间没有重大的技术差异
有人会说了,这有啥好说的,我们在公司开发都是用 OracleJDK 的。曾经我也以为这两个区别不是很大,看公司的使用情况了,直到我使用了 CentOS 7 系统默认带的 OpenJDK 来编译 Gradle 项目,死活是编译不过,总是提醒我找不到 tools.jar
包。有图有真相
一开始,我把以为是环境配置的问题,但是经过一番折腾,卸载了自带的 OpenJDK,然后再用 yum install java
命令去安装 OpenJDK,发现并不是环境的问题,而是系统自带的这个 OpenJDK 是 JRE,所以并没有包含 tools.jar
文件。所以这个问题就是你系统 JDK 的问题了。建议卸载 JRE,重新安装 JDK
1 | # 可以先查找 JDK,下面命令是我查找 java-1.8 的相关应用 |
关于如何使用 Gradle 构建项目,以及使用 Gradle 配置符合企业敏捷开发需求,可查看我的 Gradle 系列的文章
之前在《SpringBoot(二) 启动分析JarLauncher》文章中进行对 SpringBoot 应用启动做了分析,提到了 jar 规范,做了简单的介绍,那么本篇在此基础上进一步的完善这个知识点
这里以 rc-microservices-alibaba 项目的
microservices-alibaba-gateway
模块的编译为例
jar(Java Archive)可以看做是特殊文件压缩的一种,通常用于聚合大量的 Java 类文件,相关的元数据和资源文件到一个文件,以便分发 Java 平台应用软件或库。jar 文件是一种归档文件,以 ZIP 格式构建,以 .jar
为文件扩展名。包含一个可选的 META-INF
目录,可以通过命令行 jar 工具或使用 Java 平台中的 java.util.jar
API 创建 jar 文件
可以看到,我们打包成 jar 的文件,仅仅是源码+资源文件,以及生成的 META_INF
文件
1 | microservices-alibaba-gateway-1.0-SNAPSHOT |
看名字就知道,这是 SpringBoot 的专属 jar。为什么会有这种 jar,原因是在 SpringBoot 出现之前,我们的 jar 应用想要运行,需要将应用放入到 Tomcat 中。而 SpringBoot 的出现改变了这层关系,是 SpringBoot 在打包成 bootJar 时,会内置 Tomcat,我们可以直接运行启动 jar 应用,可能有人会说,这怎么改变了,不都还是运行在 Tomcat 上么。没错它确实依然运行在 Tomcat 上,但是他们的加载方式改变了
我们可以看到,打成 bootJar 的文件,除了 META-INF
相关文件,并且包含了 BOOT-INF
的 lib 路径下存放项目所使用的所有第三方的 jar 包 ,同时在打包的根目录,生成了 SpringBoot 的 loader 相关的文件
1 | microservices-alibaba-gateway-1.0-SNAPSHOT |
个人推荐单工程的方式,毕竟聚合工程最终会随着业务的发展推进,需要拆分为单项目开发管理,那还不如一开始就拆分
这里的单工程是指,每一个模块都是一个项目,由一个仓库进行管理,特点及要求如下
相关的构架过程可参考 Gradle(三)SpringBoot 单工程 文章
这里的聚合工程是指,将整个系统开发的所有模块以及公共模块都放在一个项目工程中,也就是用同一个仓库来进行管理,特点如下
相关的构架过程可参考 Gradle(四)SpringBoot 聚合工程 文章
对于服务的拆分是没有统一的标准,除了通过实际的业务场景,团队能力,人员组织架构等多种因素综合考虑。都根据实际的需求进行调整,对于拆分主要从以下原则去思考
RocketMQ 由四部分组成:name servers, brokers, producers and consumers。它们中的每一个都可以在没有单个故障点的情况下进行水平扩展
用来保存 Broker 相关 Topic 等元信息并给 Producer,提供 Consumer 查找 Broker 信息。主要包括两个功能:
负责消息的存储和传递,消息查询,HA 保证等(消息存储中心,主要作用是接收来自 Producer 的消息并存储, Consumer 从这里取得消息)。Broker 服务器具有几个重要的子模块:
负责产生消息,生产者向消息服务器发送由业务应用程序系统生成的消息。支持分布式部署,分布式生产者通过多种负载平衡模式将消息发送到 Broker 集群。发送过程支持快速失败并且延迟低
负责消费消息,消费者从消息服务器拉取信息并将其输入用户应用程序。支持 “推和拉” 模型中的分布式部署。它还支持集群使用和消息广播。它提供了实时消息订阅机制,可以满足大多数消费者的需求
相关工具没安装可参考 Linux 常用应用安装
单机部署,主要是进行 RocketMQ 的简单使用,因此没有必要分配较大内存空间,RocketMQ NameServer 默认会占用 4G,因此在启动部署时会调整 JVM 的相关参数,指定分配内存空间
1 | # 程序存放位置,根据喜好 |
1 | # 进入 bin 目录 |
1 | # 使用 clusterList 命令来查看集群的状态 |
通过命令去操作 RocketMQ,其实是比较麻烦,没有图形化来的直观和方法。为此 RocketMQ 官方提供了一个运维管理界面 RokcetMQ-Console-Ng,用于对 RocketMQ 集群提供常用的运维功能
基于 SpringBoot 开发
1 | wget https://github.com/apache/rocketmq-externals/archive/rocketmq-console-1.0.0.tar.gz |
正常启动后,访问:http://localhost:8080 查看是否安装成功
如果你使用的 root 用户启动 rocketmq, rocketmq-console 应用,那么他们的日志分别在
截止 2020-11-10,官方的镜像依然还是 4.6 版本,难道又是阿里没人维护的 KPI 🙄
RocketMQ-Docker