基于模板使用giter8创建项目

背景

进行分布式服务开发, 各服务均划分了各自的消息协议项目/应用服务项目, 这些项目骨架相同, 仅仅是项目名和包名有个别字的区别; 为此, 笔者经过调研后选择使用giter8来创建项目骨架模板, 后期项目均使用该模板生成项目.

安装giter8

阅读全文 »

使用nexus发布和获取依赖包

背景

开发分布式服务, 各服务会根据命名规范定义各自的消息协议, 某一服务A调用指定服务B时, 服务A需要依赖服务B的消息协议, 使用构建工具(maven/sbt/gradle)+nexus私服可以满足多服务并行开发时, 服务间消息协议构件(artifact)最新版本的发布和获取.

搭建nexus私服

详见参考文章.

仓库

仓库类型

  • group:组仓库,用于方便开发人员自己设定仓库, 该类型可以引用多个已有仓库.
  • hosted: 内部项目的发布仓库
    • maven-releases: 内部发布的正式版本, 即版本不带-SNAPSHOT标识.
    • maven-snapshots: 内部发布的快照版本, 发布上去的构件会自带实践戳, 当有客户端获取时, nexus会取最近生成的进行返回,版本带-SNAPSHOT标识
  • proxy: 从远程仓库中寻找数据的仓库, 例如: 中央库

配置多仓库

创建类型为group的仓库(命名为xxx-central), 同时把需要的远程仓库纳入其中, 目前纳入的仓库有maven-central, maven-releases, maven-snapshots

阅读全文 »

理解本真的AKKA架构风格

背景

传统编程模型认为写一个变量就是直接写了相应的内存地址,但是在现代计算机架构,简单点说CPU写的是cache lines而不是直接写内存,这些缓存大部分是L1一级缓存,也就是说CPU的一个核写的内容另外的核看不见,为了把变化广播给别的核(这样才能同样广播到别的线程),需要(做额外动作)把cache line的变化同步到其他核的cache.

JVM运行环境下,要做到上述的线程间共享,需要显式地给变量(memory locations)打上volatile 标记 或者使用Atomic原子包装数据结构,否则,一般变量值的变化不保证能实时同步给其它线程可见,要么就使用锁,你可能会问为什么不标记所有变量都是volatile的呢?因为在CPU的多个核之间同步cache lines是很昂贵的操作!会拖慢CPU内核速度并且导致cache coherence protocol (the protocol CPUs use to transfer cache lines between main memory and other CPUs) 瓶颈,结果就是明显的拖慢运行.

当你看源码时你以为的方法调用

阅读全文 »

打造一劳永逸的word常规模板

背景

word作为office的一部分,是微软提供的办公文档写作软件.除了文字编辑的功能之外,它还包含很多提高写作效率的自动化功能,目前已成为办公文档、专业论文写作等必不可少的利器.本文内容涵盖了word自动化列表、段落文字样式批量设置、图表名称和编号设置、目录设置、制表位等等功能,并一步步教大家打造一个word常规模板,阅读完本文后,大家可以自己配置专属的文本模板,并应用到以后的工作中,提高文档写作、格式调整等工作的效率.

样例和模板下载地址

阅读全文 »

git通用操作集锦

背景

Git目前已成为比较流行的版本管理工具, 该文档记录使用Git过程中碰到的相关问题和解决方案.

问题集锦

1. 将远程仓库回退到指定版本

1
2
3
4
# --hard 参数会抛弃当前工作区的修改 
# --soft 参数会会退到之前的版本, 但保留当前工作区的修改, 可以重新提交
git reset --hard <版本号>
git push origin <分支名> --force

阅读全文 »

git修改提交者用户名和邮箱

背景

开发过程中, 我们会经常混迹与不同的代码仓库,时常不同仓库会有作者信息验证。比如公司内建的gitlab一般会要求统一使用公司内部的域账号签名;github要求使用github账号签名等。因此,很容易犯在不同库中提交代码发现默认配置(全局)的author信息没有变更,结果push被拒绝或泄漏了姓名。

下面介绍几种常用的解决方式,当然最终还是需要养成切换代码库检查author信息的习惯,主动配置

1
2
3
4
5
6
7
// 设置全局
git config --global user.name "Author Name"
git config --global user.email "Author Email"

// 设置当前项目库配置
git config user.name "Author Name"
git config user.email "Author Email"
阅读全文 »

发布Scala构件至Maven中央库

背景

本文接上文发布构件至Maven中央库, 详细讲解SBT如何发构件至本地, 如何发布构件至Maven中央库.

样例项目

该项目的项目目录结构, build.sbt相关配置符合发布要求, 且已发布成功, 并会进行不定期更新, 首次发布的同学可参考对比.

阅读全文 »

Java日期详解

背景

在 Java 8 之前,我们最常见的时间与日期处理相关的类就是 Date、Calendar 以及 SimpleDateFormatter 等等。不过 java.util.Date 也是被诟病已久,它包含了日期、时间、毫秒数等众多繁杂的信息,其内部利用午夜 12 点来区分日期,利用 1970-01-01 来计算时间;并且其月份从 0 开始计数,而且用于获得年、月、日等信息的接口也是太不直观。除此之外,java.util.DateSimpleDateFormatter 都不是类型安全的,而 JSR-310 中的 LocalDateLocalTime 等则是不变类型,更加适合于并发编程。JSR 310 实际上有两个日期概念。第一个是 Instant,它大致对应于 java.util.Date 类,因为它代表了一个确定的时间点,即相对于标准 Java 纪元(1970年1月1日)的偏移量;但与 java.util.Date 类不同的是其精确到了纳秒级别。另一个则是 LocalDate、LocalTime 以及 LocalDateTime 这样代表了一般时区概念、易于理解的对象。

Java8中, java.time包下包含下面几个主要的类:

1
2
3
4
5
6
7
8
9
Instant:时间戳
Duration:持续时间,时间差
LocalDate:只包含日期,比如:2016-10-20
LocalTime:只包含时间,比如:23:12:10
LocalDateTime:包含日期和时间,比如:2016-10-20 23:14:21
Period:时间段
ZoneOffset:时区偏移量,比如:+8:00
ZonedDateTime:带时区的时间
Clock:时钟,比如获取目前美国纽约的时间
阅读全文 »

HTTP协议状态码

背景

当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。

HTTP状态码的英文为HTTP Status Code。

1xx 信息/临时响应

表示临时响应并需要请求者继续执行操作的状态代码。

这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。由于 HTTP/1.0 协议中没有定义任何 1xx 状态码,所以除非在某些试验条件下,服务器禁止向此类客户端发送 1xx 响应。

阅读全文 »

MySql问题集锦

背景

以前mysql的相关问题较散, 自此以后小问题均聚合到该文进行记录.

问题

5.7.5后, group by报错问题

问题描述

升级mysql后, 之前的sql语句报错, 报错信息如下:

阅读全文 »