Blog

Jenkins Shared Libraries教程(一): 开发框架搭建

2019-03-13
Jenkins

Jenkins Shared Libraries是一种扩展Jenkins Pipeline的技术,通过编写Shared Libraries可以实现自定义的Steps,将流水线逻辑中重复或共通的部分进行抽象和封装。 实践中每个DevOps团队都应该通过维护一个或多个Shared Libraries项目再结合第三方的Jenkins插件定制团队自己的Jenkins流水线。

...

理解Go Modules

2019-03-12
Go

Go Modules是Go 1.11引入的,为了解决Go项目的依赖问题。从go 1.16开始,go modules开始成为Go默认的包依赖管理工具。

go moudle是一组go package的集合 #

一个Go Module实际上是由一组Go的Package的集合。 构建Go Module的过程需要先确定依赖的其他Go Module的版本、编译包、将编译的目标文件链接到一起。

...

使用OpenVPN将Kubernetes集群网络暴露给本地开发网络

2019-03-08
Kubernetes, Openvpn

Kubernetes集群内部是一套单独的网络,与外部网络相隔离,Kubernetes提供了NodePort、LoadBalancer、Ingress等方式用于将集群内部的Service暴露到集群外部, 但这些方式都更适用于将边缘服务暴露出去。例如,一个产品由很多微服务组成,这些微服务大多数都是内部服务,只有少数作为边缘服务需要暴露到集群外部供用户使用。 而开发人员是存在从Kubernetes外部访问和调试这些内部服务的需求的,尤其是针对测试环境的Kubernetes集群,这个需求更加必要。针对这个需求,有以下两种实现方式:

...

Goroutine调度器学习笔记

2019-02-12
Go

三种多线程模型 #

操作系统的线程由内核的线程调度器负责调度,不同的编程语言对内核线程的封装不同,有以下三个模型:

  • N:1模型: N个用户空间线程运行在1个内核空间线程上。优点是上下文切换快,缺点是无法有效利用多核特性。 在该模型下,线程管理由用户空间的线程库进行,因此上下文切换效率高,但如果某个用户线程执行阻塞系统调用(syscall),其他用户线程也将会阻塞。因为任一时间只能有一个内核空间线程访问内核,所以多个用户线程也就无法并行运行在多核系统上。 由于无法有效利用系统多核特性,所以现在几乎没有编程语言使用这个模型。
  • 1:1模型: 1个用户空间线程运行在1个内核空间线程上。每次调度都要在用户态和内核态之间切换,因此该模型的缺点是上下文切换很慢,而且每创建一个用户线程就需要创建一个内核线程,因此可以创建的用户线程数量也会受限制。 在该模型下,一个用户线程执行阻塞系统调用时,能够允许其他用户线程继续执行,多个用户线程也可以并行的运行在多核系统上。使用此模型的编程语言有Java。
  • M:N模型: 多个用户空间线程运行在多个内核空间线程上。M:N模型综合了N:11:1模型的优点,多路复用多个用户空间线程到一定数量的内核空间线程。这种模型的缺点是调度实现起来十分复杂。Go采用的这种模型,用户空间线程在Go中对应的是Goroutine。

Goroutine调度器和G-M-P模型 #

在Go中用户线程的调度和生命周期管理都是用户层面的,由Go语言自己实现,不依赖OS系统调用,减少系统资源消耗。 Go实现了一个自己的运行时调度器用于调度Goroutine(轻量级的用户空间线程)。

...

Go语言使用常量和iota模拟枚举类型

2019-02-10
Go

模拟枚举类型 #

go语言中虽然没有Java, C++等一些高级语言提供的枚举类型特性,但可以使用常量和iota来模拟。 例如:

 1// BuildResult 构建结果
 2type BuildResult int
 3
 4const (
 5	// Success 成功
 6	Success BuildResult = iota
 7	// Fail 失败
 8	Fail
 9	// Abort 中断
10	Abort
11)
1var buildResult = Success
2println(buildResult) // 0

使用go generate和stringer生成String() string函数 #

为了打印枚举类型值具体的字符串标识,可以使用https://godoc.org/golang.org/x/tools/cmd/stringer工具并结合go generate为枚举类型生成func (t T) String() string函数。这样枚举类型就实现了fmt.Stringer接口。具体的实现方式是在枚举类型BuildResult的定义上加上注释//go:generate stringer -type=BuildResult

...

Spring Boot中使用Lombok

2019-02-03
Spring Boot

Lombok其实和Spring Boot关系不太大,只是这个工具太好用了,这里也整理记录一下。 Lombok是一个Java库可以与Java IDE(ItelliJ IDEA、Eclipse)和构建工具(Gradle、Maven)集成,帮助开发人员消除臃肿的Java代码,尤其是对于Java POJO类,使用Lombok后将不再需要我们去编写getter、setter、equals、hashcode等方案,Lombok通过注解实现这一目标。

...

Spring Boot中使用HikariCP连接池

2019-02-02
Spring Boot

Spring Boot 2.x中使用HikariCP作为默认的数据连接池。 HikariCP使用Javassist字节码操作库来实现动态代理,优化并精简了字节码,同时内部使用com.zaxxer.hikari.util.FastList代替ArrayList、使用了更好的并发集合类com.zaxxer.hikari.util.ConcurrentBag,“号称”是目前最快的数据库连接池。

...

© 2024 青蛙小白