使用二进制搭建kubernetes三节点高可用集群

Kubernetes 是一个开源容器编排引擎,用于容器化应用的自动化部署、扩展和管理。该项目托管在 CNCF。你可以通过阅读 官方文档了解Kubernetes和其基础概念。

接下来这篇文章将介绍如何使用二进制部署Kubernetes v1.14.8。通过这种hard-way的方式来帮助你更好的了解Kubernetes。

Kubernetes Cluster搭建的过程,可以参考和我一步步部署 kubernetes 集群。我将其中的脚本整理好了,并通过VagrantVirtualBox在本地快速创建k8s集群。

Github地址如下: https://github.com/amuguelove/k8s-setup-tutorial/tree/v1.14.8

[阅读全文]

Docker最佳实践

了解了用于构建 Dockerfile 的基本方法后,我们在编写 Dockerfile 的时候并没有一些强制要求,导致很多构建的镜像不符合一些最佳实践,典型的就是镜像构建的层数非常多,对一些基本指令的区别不是很清楚。下面介绍 Dockerfile 在实际使用中的一些最佳的实践方式。

[阅读全文]

Docker的底层技术

Docker最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runCcontainerd

Docker 本质就是宿主机的一个进程,Docker 是通过 namespace 实现资源隔离,通过cgroup 实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作。

传统的虚拟机通过在宿主主机中运行 hypervisor 来模拟一整套完整的硬件环境提供给虚拟机的操作系统。虚拟机系统看到的环境是可限制的,也是彼此隔离的。 这种直接的做法实现了对资源最完整的封装,但很多时候往往意味着系统资源的浪费。 例如,以宿主机和虚拟机系统都为 Linux 系统为例,虚拟机中运行的应用其实可以利用宿主机系统中的运行环境。

[阅读全文]

代码整洁之道

最近因为一些契机,花了2到3天看完**《代码简洁之道》**这本书,英文名为:Clean Code

开篇就有有这么简单一句话:“阅读这本书有两种原因:第一,你是个程序员;第二,你想成为更好的程序员”。是的,没错,我想成为更好的程序员。所以我决定好好阅读下这本书。

回想2019年,确实是我最忙碌的一年,做过几个项目,其中部分涉及到架构,但是大部分时间都关注在如何实现业务代码,没有更好的关注到代码本身的细节。虽然经常了解到关于整洁代码相关的知识,在工作中也或多或少的用到,比如每天的code review以及TDD开发等等。但是确实不够系统,大多时间忙于完成业务,通过阅读本书,以及其中大量简洁代码的指南,受益匪浅。

[阅读全文]

使用JMH对Java Object Mapping框架做性能对比

JMH概述

JMH 是一个由 OpenJDK/Oracle 里面那群开发了 Java 编译器的大牛们所开发的 Micro Benchmark Framework 。何谓 Micro Benchmark 呢?简单地说就是在 method 层面上的 benchmark,精度可以精确到微秒级。可以看出 JMH 主要使用在当你已经找出了热点函数,而需要对热点函数进行进一步的优化时,就可以使用 JMH 对优化的效果进行定量的分析。

比较典型的使用场景还有:

  • 想定量地知道某个函数需要执行多长时间,以及执行时间和输入 n 的相关性
  • 一个函数有两种不同实现(例如实现 A 使用了 FixedThreadPool,实现 B 使用了 ForkJoinPool),不知道哪种实现性能更好

尽管 JMH 是一个相当不错的 Micro Benchmark Framework,但很无奈的是网上能够找到的文档比较少,而官方也没有提供比较详细的文档,对使用造成了一定的障碍。但是有个好消息是官方的 Code Sample 写得非常浅显易懂,推荐在需要详细了解 JMH 的用法时可以通读一遍——本文则会介绍 JMH 最典型的用法和部分常用选项。

我Fork了一份到github,可以提供大家参考一下,使用gradle构建。jmh-gradle-samples

[阅读全文]

Gradle发布Java Library到Maven中央仓库

最近打算将一些基础的Jar包上传到Maven中央仓库,方便在自己项目中引用。本文将结合Gradle的两个插件maven-publishsigning来讲解如何发布一个Jar包。

在开始之前,先对OSSRH做下了解是很必要的。

OSSRHSonatype Open Source Software Repository Hosting Service,为开源软件提供maven仓库托管服务。你可以在上面部署snapshotrelease等,最后你可以申请把你的release同步到Maven Central RepositoryMaven中央仓库)。

[阅读全文]

SpringBoot的自动装配原理分析

在Spring Boot应用中的自动装配是通过@EnableAutoConfiguration 注解进行开启的。@EnableAutoConfiguration 可以帮助 Spring Boot 应用将所有符合条件的 @Configuration 配置类的 bean 都加载到 Spring IoC 容器中。

我们看下@SpringBootApplication注解,默认是启动@EnableAutoConfiguration 的。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {

	@AliasFor(annotation = EnableAutoConfiguration.class)
	Class<?>[] exclude() default {};

	@AliasFor(annotation = EnableAutoConfiguration.class)
	String[] excludeName() default {};

	@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
	String[] scanBasePackages() default {};

	@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
	Class<?>[] scanBasePackageClasses() default {};

	@AliasFor(annotation = Configuration.class)
	boolean proxyBeanMethods() default true;

}
[阅读全文]

SpringBoot配置文件加载的路径和优先级

很多人对SpringBoot文件加载的位置和优先级有点疑惑,下面通过源码看下到底是如何加载的。

我们先来看下SpringBoot加载PropertySource的顺序是如何的呢?可以参考官网:https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/htmlsingle/#boot-features-external-config

配置加载的优先级从高到低,其中高优先级可以覆盖低优先级的配置。

[阅读全文]

JPA ID生成策略

JPA 为对象关系映射提供了了⼀一种基于 POJO 的持久化模型

  • 简化数据持久化代码的开发⼯工作
  • 为 Java 社区屏蔽不不同持久化 API 的差异

JPA定义了持久化的标准,而Hibernate是持久化的实现。Spring Data JPA就是在Hibernate的基础上封装实现的。

JPA提供了很多常用的注解,下面就来讲下关于主键的生成策略,主要的注解有:

@Id
@GeneratedValue(strategy, generator)
@SequenceGenerator(name, sequenceName)
[阅读全文]

Git协同工作流的选择

  • 与传统的代码版本管理工具相比,Git 有很多的优势,因而越来越成为程序员喜欢的版本管理工具。我觉得,Git 这个代码版本管理工具最大的优势有以下几个。
  • Git 是一个分布式的版本管理工具,而且可以是单机版的,所以,你在没有网络的时候同样可以提交(commit)代码。
  • Git 从一个分支向另一个分支合并代码的时候,会把要合并的分支上的所有提交一个一个应用到被合并的分支上,合并后也能看得到整个代码的变更记录。而其他的版本管理工具则不能。
  • Git 切换分支的时候通常很快。不像其他版本管理器,每个分支一份拷贝。
  • Git 有很多非常有用的命令,让你可以很方便地工作。
[阅读全文]