理解Go Modules
📅 2019-03-12
Go Modules是Go 1.11引入的,为了解决Go项目的依赖问题。从go 1.16开始,go modules开始成为Go默认的包依赖管理工具。
go moudle是一组go package的集合 #
一个Go Module实际上是由一组Go的Package的集合。 构建Go Module的过程需要先确定依赖的其他Go Module的版本、编译包、将编译的目标文件链接到一起。
...Go Modules是Go 1.11引入的,为了解决Go项目的依赖问题。从go 1.16开始,go modules开始成为Go默认的包依赖管理工具。
一个Go Module实际上是由一组Go的Package的集合。 构建Go Module的过程需要先确定依赖的其他Go Module的版本、编译包、将编译的目标文件链接到一起。
...Kubernetes集群内部是一套单独的网络,与外部网络相隔离,Kubernetes提供了NodePort、LoadBalancer、Ingress等方式用于将集群内部的Service暴露到集群外部, 但这些方式都更适用于将边缘服务暴露出去。例如,一个产品由很多微服务组成,这些微服务大多数都是内部服务,只有少数作为边缘服务需要暴露到集群外部供用户使用。 而开发人员是存在从Kubernetes外部访问和调试这些内部服务的需求的,尤其是针对测试环境的Kubernetes集群,这个需求更加必要。针对这个需求,有以下两种实现方式:
...操作系统的线程由内核的线程调度器负责调度,不同的编程语言对内核线程的封装不同,有以下三个模型:
N:1
模型: N个用户空间线程运行在1个内核空间线程上。优点是上下文切换快,缺点是无法有效利用多核特性。
在该模型下,线程管理由用户空间的线程库进行,因此上下文切换效率高,但如果某个用户线程执行阻塞系统调用(syscall),其他用户线程也将会阻塞。因为任一时间只能有一个内核空间线程访问内核,所以多个用户线程也就无法并行运行在多核系统上。
由于无法有效利用系统多核特性,所以现在几乎没有编程语言使用这个模型。1:1
模型: 1个用户空间线程运行在1个内核空间线程上。每次调度都要在用户态和内核态之间切换,因此该模型的缺点是上下文切换很慢,而且每创建一个用户线程就需要创建一个内核线程,因此可以创建的用户线程数量也会受限制。
在该模型下,一个用户线程执行阻塞系统调用时,能够允许其他用户线程继续执行,多个用户线程也可以并行的运行在多核系统上。使用此模型的编程语言有Java。M:N
模型: 多个用户空间线程运行在多个内核空间线程上。M:N
模型综合了N:1
和1:1
模型的优点,多路复用多个用户空间线程到一定数量的内核空间线程。这种模型的缺点是调度实现起来十分复杂。Go采用的这种模型,用户空间线程在Go中对应的是Goroutine。G-M-P
模型
#在Go中用户线程的调度和生命周期管理都是用户层面的,由Go语言自己实现,不依赖OS系统调用,减少系统资源消耗。 Go实现了一个自己的运行时调度器用于调度Goroutine(轻量级的用户空间线程)。
...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
为了打印枚举类型值具体的字符串标识,可以使用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 Gradle Plugin提供了Gradle构建工具对Spring Boot的支持,使用它不仅可以完成Spring Boot项目的打包(executable jar or distribution tar)、运行,还可以使用spring-boot-dependencies
提供的依赖管理功能。
Lombok其实和Spring Boot关系不太大,只是这个工具太好用了,这里也整理记录一下。 Lombok是一个Java库可以与Java IDE(ItelliJ IDEA、Eclipse)和构建工具(Gradle、Maven)集成,帮助开发人员消除臃肿的Java代码,尤其是对于Java POJO类,使用Lombok后将不再需要我们去编写getter、setter、equals、hashcode等方案,Lombok通过注解实现这一目标。
...Spring Boot 2.x中使用HikariCP作为默认的数据连接池。
HikariCP使用Javassist字节码操作库来实现动态代理,优化并精简了字节码,同时内部使用com.zaxxer.hikari.util.FastList
代替ArrayList、使用了更好的并发集合类com.zaxxer.hikari.util.ConcurrentBag
,“号称”是目前最快的数据库连接池。
Kubernetes 1.13已经发布。我们线上的版本升级都是按照比官方低一个版本的节奏。 因此可以开始考虑将团队线上环境的Kubernetes集群从1.11升级到1.12了。 本文记录了在测试环境中的演练过程。
当前Kubernetes 1.12的小版本是1.12.5。 在升级之前一定要多读几遍官方的升级须知Kubernetes 1.12 - Action Required Before Upgrading。
...kiali作为Istio的可观测工具,可以认为是Istio的UI,可以展现服务的网络拓扑、服务的容错情况(超时、重试、短路等)、分布式跟踪(通过Jaeger Tracing)等。 本文将结合Istio自带的Bookinfo应用体验一下Kiali。
...