0%

前言

当初学习 go 语言的原因之一就是看中了 go 可以直接编译成机器码运行,并且支持跨操作系统的交叉编译,这对开发跨操作系统软件提供了极大的便利,这篇文章目的就是记录下 go 是如何交叉编译的。

交叉编译

go 语言里交叉编译支持非常多的操作系统,可以通过go tool dist list命令来查看支持的操作系统列表。

阅读全文 »

前言

公司的 CI/CD 平台研发要告一个段落了,在此记录一下如何使用 k8s 的客户端工具 kubectl 来进行更新操作的。

更新 Deployment

要知道 kubectl 是不支持 update 操作的,假设有如下Deployment.yaml需要进行部署:

阅读全文 »

前言

go 自带的flag包可以很容易的实现一个命令行程序的参数解析,但是flag包默认只支持几个基本类型的参数解析,如果需要传递slice或者map类型时就要自定义了,这里记录一下。

原理

通过flag.Var()方法传递一个Value接口,即可自定义命令行参数的解析,flag.Value接口:

1
2
3
4
type Value interface {
String() string
Set(string) error
}
阅读全文 »

前言

众所周知 HTTPS 是保证 HTTP 通讯安全的协议,网站启用 HTTPS 可以避免很多安全性的问题, 而且 Chrome 浏览器 从 68 版本开始直接将 HTTP 网站标记为不安全了。

所以把网站升级成 HTTPS 自然是大势所趋,不过启用 HTTPS 有个最重要的问题是 HTTPS 证书要花钱!如果每年额外花钱去购买 HTTPS 证书,那也是一笔很大的开销。那么有没有免费的HTTPS证书可以用呢,查了下资料有个叫Let’s Encrypt的项目就提供了免费签发 HTTPS 证书的服务,这里记录下如何使用Let’s Encrypt来签发证书。

阅读全文 »

前言

websocket 作为现代浏览器的长连接标准,可以很好的解决浏览器与服务器实时通讯的问题,那么在 websocket 出现之前是怎么解决这个问题的呢?首先来回顾一下在此之前浏览器和服务器的”长连接”之路。

回顾

在 websocket 协议出来之前,主要是有三种方向去实现类似 websocket 的功能的。

Flash

flash 支持 socket 通讯功能,基于 flash 可以很简单的实现与服务器建立通讯。

  • 优点:开发简单、兼容性高
  • 缺点:需要浏览器启用 flash 功能,并且逐渐被浏览器淘汰

AJAX Polling

浏览器使用 ajax 去轮询服务器,服务器有内容就返回,轮询也分为短轮询和长轮询。

阅读全文 »

命令格式

1
mvn dependency:get -Dartifact=groupId:artifactId:version:jar:sources

示例

  • 下载jar包

    1
    mvn dependency:get -Dartifact=junit:junit:4.12:jar
  • 下载源码

    1
    mvn dependency:get -Dartifact=junit:junit:4.12:jar:sources

前言

在公司内部使用 Jenkins 做 CI/CD 时,经常会碰到项目构建失败的情况,一般情况下通过 Jenkins 的构建控制台输出都可以了解到大概发生的问题,但是有些特殊情况开发需要在 Jenkins 服务器上排查问题,这个时候就只能找运维去调试了,为了开发人员的体验就调研了下 web terminal,能够在构建失败时提供容器终端给开发进行问题的排查。

效果展示


支持颜色高亮,支持tab键补全,支持复制粘贴,体验基本上与平常的 terminal 一致。

阅读全文 »

前言

k8s本身就支持服务滚动升级,但是如果程序没有正确的处理退出信号时,就会导致部分请求直接被中断从而影响用户体验。

滚动升级步骤

每个pod代表一个集群中的节点,在 k8s 做rolling-update的时候默认会向旧的pod发送一个SIGTERM信号,如果应用没有对SIGTERM信号做处理的话,会立即强制退出程序,这样的话会导致有些请求还没处理完,前端应用请求错误。

先来回顾下 k8s 的滚动升级步骤:

  1. 启动一个新的 pod
  2. 等待新的 pod 进入 Ready 状态
  3. 创建 Endpoint,将新的 pod 纳入负载均衡
  4. 移除与老 pod 相关的 Endpoint,并且将老 pod 状态设置为 Terminating,此时将不会有新的请求到达老 pod
  5. 给老 pod 发送 SIGTERM 信号,并且等待 terminationGracePeriodSeconds 这么长的时间。(默认为 30 秒)
  6. 超过 terminationGracePeriodSeconds 等待时间直接强制 kill 进程并关闭旧的 pod

这里要注意,SIGTERM信号如果进程没有处理的话也其实也就会导致进程被强杀,如果处理了但是超过terminationGracePeriodSeconds配置的时间也一样会被强杀,所以这个时间可以根据具体的情况去设置。

阅读全文 »

win10 右键菜单只能打开 Powershell,然而不知道是 Powershell 难用还是我不会用,各种莫名其妙的问题,这个时候想想还是cmd真香,所以在网上找了个办法把 cmd 加到右键菜单里已方便使用。

步骤

新建一个文档,赋值粘贴以下代码,并且将文档保存为.reg 格式的文件。

阅读全文 »

前言

最近在使用getDeclaredMethods方法获取类中的方法时碰到一个奇怪的问题,先来看看getDeclaredMethods方法的注释:

Returns an array containing Method objects reflecting all the declared methods of the class or interface represented by this Class object, including public, protected, default (package) access, and private methods, but excluding inherited methods.

谷歌翻译:

返回一个包含 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有声明方法,包括 public,protected,default(包)访问和私有方法,但不包括继承的方法

注意加粗的字体,可以看到 JDK 注释里明确的说明了getDeclaredMethods方法不会返回继承的方法,我要的功能就是取当前类上的方法(不包含父类的),但是事情并没有这么简单,下面一起来看看是为什么。

阅读全文 »