- 初始化仓库
1
2
3
4# 初始化一个 git 仓库并且建立工作目录
git init
# 初始化一个干净的仓库,使用 bare 选项不带有工作目录,使用 shared 选项,提供组可写的权限
git init --bare --shared - 克隆仓库
1
2# 在未指定协议的时候优先会采用 ssh
git clone [地址] - 暂存文件
将文件提交至暂存区(进入 staged 状态)1
2
3git add [路径]
# 只暂存所有已经跟踪的文件,这通常可以减少多余文件的提交
git add -u
ES 操作-索引管理
RocketMQ 服务端消息过滤
RocketMQ 日志设置
日志配置文件位置
RocketMQ 日志基于 slf4j 实现,支持 Logback、Log4j。如果需要指定日志的配置文件的位置有三种方式:
- 环境变量:
ROCKETMQ_CLIENT_LOG_CONFIGFILE=<custom-file>
- 启动参数:
rocketmq.client.log.configFile=<customer-file>
,作为 JVM 变量,启动时时需要增加 -D 标识,优先级也比环境变量更高 - 作为 Java 实现,日志位置信息是通过
System.getProperty()
或者System,getenv()
得到的,所以可以在程序入口System.setProperty(“rocketmq.client.log.configFile”, customer_file)
来配置
RocketMQ Producer 摘要
上一篇介绍完了 RocketMQ 消费者的默认实现,现在来瞅一瞅生产者的用法。
设置必要的属性
同样的,是 DefaultMQProducer,新建实例之后,在使用生产者发送消息之前,需要初始化几个属性:
InstanceName
实例名称
这是为了当一个 JVM 上启动了多个生产者时,区分不同的生产者实例,系统默认名称为 DEFAULTRetryTimesWhenSendFailed
重试次数
当消息投递失败时,有可能是因为网络原因,可以设置多投递几次减少丢消息的情况。
很多实用者在使用时,为了避免重复的消息设置不重试是不正确的做法:因为 RocketMQ 本身并不保证消息的不重复,作为客户端对消息进行幂等处理是必要的。而在次前提下,对发送失败的场景拒绝重发,不仅对避免重复消息没有任何意义,同时也增加了消息的丢失的可能。NamesrvAddr
需要 NameServer 的地址,写法和 Consumer 一致
RocketMQ Consumer 摘要
结束了对 RocketMQ 组件的初步理解以及配置的简单设定,可以对 RocketMQ 仔细研究一番了。先来看看 RocketMQ 的消费者实现,以及服务端是如何处理消费者客户端的请求,把消息送出去的。
RocketMQ 对于消费者客户端,支持推模型和拉模型。对于推模型,由消息服务端作为主动方,向客户端推送消息(尽管其本质是一个长轮询式的拉模型实现);而拉模型由客户端主动拉取消息。
RokcetMQ 配置项
RocketMQ 的配置分为两部分,一者是 JVM 的配合,另一者则是对 Broker 应用本身的参数配置。
在初次接触时候,除了 RocketMQ 本身的一些特性,同时也难免会被一些配置给迷惑或者踩坑,这里来看一下通常的配置点。
RocketMQ 配置探索
目前被广泛使用的 MQ 有很多,包括 ActiveMQ,Kafka,RabbitMQ,RocketMQ 等等,它们各有长短。而近期所在项目选择了 RocketMQ 作为消息中间件,此前并未系统地了解研究,所以趁此机会整理了一些笔记和想法。
实现 MyBatis 插件
MyBatis 作为一个目前很常用的持久化框架,有着丰富的拓展。这些拓展功能常常以插件的形式嵌入到 MyBatis 的运作流程之中,而如何制作实现一个插件?MyBatis 已经为大家设计好了,一个 Interceptor
接口,实现它就够了。
Interceptor
接口的拦截目标,是 MyBatis 运作流程中的几个核心组件:
Executor
:这是 MyBatis 执行器,控制着所有和数据库交互的操作,也影响着一级缓存。ParameterHandler
:参数处理器,在映射参数时候生效。ResultSetHandler
:结果集处理器,在处理结果集的时候会用到。StatementHandler
:Executor
下层的处理器,同样控制着 SQL 行为,也控制着二级缓存的生效。
Docker 挂载与数据存储
Docker 镜像是层层分离的,分为只读的底层和可读写的当前层。容器在运行时候如果有文件改动,会自动从含有该文件的底层拷贝并更新在当前层。如果容器在 commit 之前被销毁,那么有这个镜像重新生成的容器是不包含改动的内容的。