线上Go项目的Docker镜像应该怎么构建?

2020-07-14
阅读 2 分钟
5.5k
Go开发的程序在编译成二进制文件后是可以在没有安装Go环境的系统里执行的,如果只把编译完的二进制文件直接放到镜像里就能节省很多镜像空间了。我给的回复是文章的侧重点是Kubernetes的实践所以镜像方面就没有占太多篇幅。

容器和虚拟机到底有啥区别?

2020-07-08
阅读 3 分钟
2.9k
Docker这几年的迅猛发展让容器重新流行起来,不过但很资料里介绍Docker时都说是 "新瓶装旧酒"。除了容器外虚拟机也是我们或多或少会接触到的虚拟化技术。虚拟机和容器都用于创建隔离的虚拟环境,但是这两种虚拟化技术有显著的不同,今天的文章就来聊一下它们之间的区别。

Kubernetes入门实践--部署运行Go项目

2020-07-02
阅读 5 分钟
6.1k
前面的几篇文章从概念层面介绍了Kubernetes是什么,它的内部架构是怎样的。并且也在电脑上安装了Minikube--拥有一个单节点的Kubernetes集群,让我们能够在自己的电脑上开始体验Kubernetes。今天的文章我准备和大家一起一步步地尝试做一个Go应用程序的Docker镜像,把它部署到Minikuebe上运行。今天的文章不需要什么基础,...

Minikube-运行在笔记本上的Kubernetes集群

2020-06-24
阅读 3 分钟
1.3k
Minikube是一个可以在本地电脑上运行Kubernetes的工具。Minikube会在笔记本电脑中的虚拟机上运行一个单节点的Kubernetes集群,让用户能对Kubernetes进行体验或者在之上进行Kubernetes的日常开发。

七张图了解Kubernetes内部的架构

2020-06-19
阅读 4 分钟
12.8k
用管弦乐编排比喻上面的服务编排是很恰当的,就像乐队指挥一样,Kubernetes协调地将许多微服务组合在一起构成了应用程序。 Kubernetes会自动且持续地监视集群并对其组成进行调整。

Go语言的原子操作和互斥锁的区别

2020-06-11
阅读 3 分钟
4.7k
这个系列的文章里介绍了很多并发编程里经常用到的技术,除了Context、计时器、互斥锁还有通道外还有一种技术--原子操作在一些同步算法中会被用到。今天的文章里我们会简单了解一下Go语言里对原子操作的支持,然后探讨一下原子操作和互斥锁的区别。

并发问题的解决思路以及Go语言调度器工作原理

2020-06-04
阅读 6 分钟
2.9k
上周的文章《Go并发编程里的数据竞争以及解决之道》最后留下了一个用并发解决的思考题,期间有几位同学留言说了自己的实现思路,也有两位直接私信发代码让我看的,非常感谢几位的积极参与。今天的文章我首先说一下上篇文章里的思考题的解决思路,我会给出完整可运行的代码。之后通过观察程序的运行结果里的现象简单介绍G...

并发编程的数据竞争问题以及解决之道

2020-05-28
阅读 5 分钟
2.8k
Go语言以容易进行并发编程而闻名,但是如果稍不注意,并发程序可能导致的数据竞争问题(data race)就会经常出现在你编写的并发程序的待解决Bug列表中-- 如果你不幸在代码中遇到这种错误,这将是最难调试的错误之一。

面试官让我用channel实现sync包里的同步锁,是不是故意为难我?

2020-05-21
阅读 5 分钟
5k
Go语言提供了channel和sync包两种并发控制的方法,每种方法都有他们适用的场景,并不是所有并发场景都适合应用channel的,有的时候用sync包里提供的同步原语更简单。今天这个话题纯属是为了通过用channel实现同步锁的功能来学习掌握channel拥有的强大能力,并不适合在实际中使用。而且面试中有时候就是会出一些奇奇怪怪...

详解Go语言的计时器

2020-05-14
阅读 9 分钟
15.4k
Go语言的标准库里提供两种类型的计时器Timer和Ticker。Timer经过指定的duration时间后被触发,往自己的时间channel发送当前时间,此后Timer不再计时。Ticker则是每隔duration时间都会把当前时间点发送给自己的时间channel,利用计时器的时间channel可以实现很多与计时相关的功能。

Go语言sync包的应用详解

2020-05-05
阅读 5 分钟
12.3k
在并发编程中同步原语也就是我们通常说的锁的主要作用是保证多个线程或者 goroutine在访问同一片内存时不会出现混乱的问题。Go语言的sync包提供了常见的并发编程同步原语,上一期转载的文章《Golang 并发编程之同步原语》中也详述了 Mutex、RWMutex、WaitGroup、Once 和 Cond 这些同步原语的实现原理。今天的文章里让我...

学会使用context取消goroutine执行的方法

2020-04-27
阅读 4 分钟
18.9k
Go语言里每一个并发的执行单元叫做goroutine,当一个用Go语言编写的程序启动时,其main函数在一个单独的goroutine中运行。main函数返回时,所有的goroutine都会被直接打断,程序退出。除此之外如果想通过编程的方法让一个goroutine中断其他goroutine的执行,只能是通过在多个goroutine间通过context上下文对象同步取消信...

聊聊在Go语言里使用继承的翻车经历

2020-04-20
阅读 4 分钟
8.2k
Go不是面向对象的语言,但是使用组合、嵌套和接口可以支持代码的复用和多态。关于结构体嵌套:外层结构体类型通过匿名嵌套一个已命名的结构体类型后就可以获得匿名成员类型的所有导出成员,而且也获得了该类型导出的全部的方法。比如下面这个例子:

Go Web编程--使用bcrpyt哈希用户密码

2020-04-13
阅读 3 分钟
4.3k
上一期的文章《我们应该如何保护用户的密码》里我们介绍了bcrypt相较于MD5,SHA-1...SHA-256等哈希算法更适合用于做密码的哈希,原因就是bcrypt算法哈希字符串的速度远远慢于上面列举的那些算法。这样即使整个用户密码库被用户盗用后想要通过彩虹表和暴力破解的方法猜测出用户的密码代价会非常高昂。今天的文章里就主要...

我们应该如何保护用户的密码

2020-04-10
阅读 2 分钟
1.5k
最近几年的新闻中一直有互联网头部公司系统被攻击导致用户密码泄露的新闻。那密码被破解肯定和当初项目伊始时选择的密码哈希方案造成的历史包袱有关。我们不讨论这些互联网巨头应该采用什么方案防止用户密码被破解,我知道的方案人家养的那些技术大拿更知道了。我们就来说一下,如果我们有机会自己从零开始做一个系统时...

Go Web编程--解析JSON请求和生成JSON响应

2020-04-03
阅读 3 分钟
8.9k
现在无论是网站、App、小程序还是移动端H5页面应用,都是采用前端与后端单独部署,相互之间以API接口交互的形式构建而成的。因为在结合可读性、编码数据大小和开发者使用难度上都JSON格式是一个比较好的选择,所以接口的数据格式通常都采用JSON,即前端在发送POST,PUT,PATCH请求添加,更改数据时会把数据以JSON格式放...

Go Web编程--给自己写的服务器添加错误和访问日志

2020-03-28
阅读 5 分钟
2.7k
错误日志和访问日志是一个服务器必须支持的功能,我们教程里使用的服务器到目前为止还没有这两个功能。正好前两天也写了篇介绍logrus日志库的文章,那么今天的文章里就给我们自己写的服务器加上错误日志和访问日志的功能。在介绍添加访问日志的时候会介绍一种通过编写中间件获取HTTP响应的StausCode和Body的方法。

关于收集,标准化和集中化处理Golang日志的一些建议

2020-03-22
阅读 7 分钟
6.7k
依赖分布式系统的公司组织和团队经常使用Go语言编写其应用程序,以利用Go语言诸如通道和goroutine之类的并发功能。如果你负责研发或运维Go应用程序,则考虑周全的日志记录策略可以帮助你了解用户行为,定位错误并监控应用程序的性能。

使用Go语言创建WebSocket服务

2020-03-16
阅读 7 分钟
15.5k
今天介绍如何用Go语言创建WebSocket服务,文章的前两部分简要介绍了WebSocket协议以及用Go标准库如何创建WebSocket服务。第三部分实践环节我们使用了gorilla/websocket库帮助我们快速构建WebSocket服务,它帮封装了使用Go标准库实现WebSocket服务相关的基础逻辑,让我们能从繁琐的底层代码中解脱出来,根据业务需求快速...

什么是WebSocket,它与HTTP有何不同?

2020-03-15
阅读 3 分钟
8.9k
HTTP和WebSocket都是客户端-服务器通信中使用的通信协议。文章用几个例子解释了两者的不同以及分别适用在什么应用场景。有些容易混淆的概念(比如说HTTP长连接)和待补充的概念我用斜体字注解到了文章中。

Go Web编程--SecureCookie实现客户端Session管理

2020-03-12
阅读 5 分钟
2.4k
在Web应用开发中Session是在用户和服务器之间进行交换的非持久化交互信息。当用户登录时,可以在用户和服务器之间生成Session,然后来回交换数据,并在用户登出时销毁Session。gorilla/sessions软件包提供了易于使用的Go语言Session实现。该软件包提供了两种不同的实现。第一个是文件系统存储,它将每个会话存储在服务器...

Go Web 编程--如何确保Cookie数据的安全传输

2020-03-08
阅读 4 分钟
3.8k
Cookie(也叫Web Cookie或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie使基于无状态的HTTP协议记录稳定的状态信息成为了可能。

使用Go语言创建静态文件服务器

2020-03-06
阅读 3 分钟
9.3k
上篇关于Go模板库应用的文章最后我们留下一个问题,页面模板是通过CDN引用的BootStrap的css,js文件。到目前位置我们的服务器还无法伺服客户端的静态文件请求把服务器磁盘上的文件响应给客户端。使用和配置过Nginx服务器的一定知道Nginx天然支持静态资源的访问,那么我们是不是也要借助Nginx才能实现处理静态文件请求呢...

Go Web 编程--超详细的模板库应用指南

2020-03-04
阅读 7 分钟
4k
如果你有过Web编程的经验,那么或多或少都听说过或者使用过模板。简而言之,模板是可用于创建动态内容的文本文件。例如,你有一个网站导航栏的模板,其中动态内容的一部分可能是根据当前用户是否登录显示登录还是退出按钮。

深入理解Golang之context

2020-03-01
阅读 13 分钟
3.2k
context是Go并发编程中常用到一种编程模式。本文将从为什么需要context,深入了解context的实现原理,以了解如何使用context。

Golang 连接池的几种实现案例

2020-02-29
阅读 12 分钟
3.2k
因为TCP的三只握手等等原因,建立一个连接是一件成本比较高的行为。所以在一个需要多次与特定实体交互的程序中,就需要维持一个连接池,里面有可以复用的连接可供重复使用。

编写Dockerfile的最佳实践

2020-02-27
阅读 3 分钟
4.1k
虽然 Dockerfile 简化了镜像构建的过程,并且把这个过程可以进行版本控制,但是很多人构建镜像的时候,都有一种冲动——把可能用到的东西都打包到镜像中。这种不正当的 Dockerfile 使用也会导致很多问题:

Go Web编程--深入学习解析HTTP请求

2020-02-25
阅读 10 分钟
3.1k
之前这个系列的文章一直在讲用Go语言怎么编写HTTP服务器来提供服务,如何给服务器配置路由来匹配请求到对应的处理程序,如何添加中间件把一些通用的处理任务从具体的Handler中解耦出来,以及如何更规范地在项目中应用数据库。不过一直漏掉了一个环节是服务器接收到请求后如何解析请求拿到想要的数据,Go语言使用net/http...

Docker的镜像基本原理和概念

2020-02-22
阅读 11 分钟
5.5k
这篇文章主要讲讲 docker 中镜像有关的知识,将涉及到下面几个方面: docker images 命令的使用 docker 和 registry 交互的过程,pull 命令到底做了什么 docker storage driver aufs 的格式和实际的组织结构 Dockerfile 原语和 docker 镜像之间的关系 作者:cizixs时间:2016-04006原文链接: [链接] 简介 docker 镜像代...

Go语言之父详述切片与数组的不同

2020-02-19
阅读 12 分钟
3.3k
切片是Go 语言核心的数据结构,然而刚接触 Go 的程序员经常在切片的工作方式和行为表现上被绊倒。比如,明明说切片是引用类型但在函数内对其做的更改有时候却保留不下来,有时候却可以。究其原因是因为我们很多人用其他语言的思维来尝试猜测 Go 语言中切片的行为,切片这个内置类型在 Go 语言底层有其单独的类型定义,而...