Go协程,OS线程和CPU管理
本片博文基于Go1.14.3版本
创建一个系统线程并且从一个线程切换到另一个线程会带来内存和性能上的损耗。Go旨在更好地发挥多核的性能,其从一开始设计就考虑了对并发地优化。
M-P-G模型为了解决线程间切换所造成的性能损耗。Go有自己的调度器(scheduler),可以在操作系统上分配协程(Goroutine)。
这个调度器有三个核心概念,源码中的描述如下:
12345The main concepts are:G - goroutine.M - worker thread, or machine.P - processor, a resource that is required to execute Go code. M must have an associated P to execute Go code[...].
下图展示了M-P-G模型:
每个协程G运行在一个系统线程M中,同时该线程M被分配一个逻辑CPUP上。让我们看一个简单的例子,这个例子介绍了Go M-P-G模型:
12345678910111213141516func main() { ...
博文格式化&Hexo主题高级自定义
有一段时间没怎么倒腾博客了,这几天收拾了一下博客,同时将最近阅读和记录的有趣的内容整理一番,分享给大家。主要包括在博客
写作时遇到的一些问题及解决方法,即我是如何构建自己的博客写作工作流的。同时也有一些在博文写作的中一些感悟。
hexo 及 Butterfly 主题升级首先,最近升级了 hexo 版本,升级到最新版本3.1.0,同时也更新了主题的版本。当然,升级完就出现问题🤪,定位错误是之前复制
的自定义配置文件butterfly.yml缺少一些必要的变量,同时该文件结构也发生了变化,导致没办法渲染成功。暗暗窃喜还好做了
版本管理,直接 merge,但是由于结构改动变化太大,merge过程很不轻松,最终还是手动将之前的配置迁移到新的自定义配置文件,
才解决问题。
这提醒我们版本管理并不能解决任何问题,只是当灾难降临,提供给我们多一种选择。作为软件的用户,升级前需要做好规划,
特别是很长时间没有更新的情况下。而作为主题开发者,需要提供给用户良好的平滑升级功能,当然有时这需要耗费很大经历。
使用开源项目,有时是需要代价和精力去维护的,而这又体现收费软件的价值所在。
图片管理Hexo搭建博 ...
the-clean-architecture
过去几年,我们已经看到了一系列关于系统架构的想法,包括:
六边形架构(接口与适配器)
洋葱架构(Onion Architecture)
Screaming Architecture
DCI
BCE
这些架构有很多共同的点(思想),尽管它们细节上有所不区别,它们都有相同的目标,那就是关注点分离(the speration of concerns),
它们都是通过将软件分层来实现这种分离,每个组件至少有一个用于业务规则的层和另一个用于接口的层。
这些架构中每一个都会产生这样的系统:
独立的框架:该架构不依赖于某些特性软件库的存,
可测试的(Testable):可以在不依赖UI、数据库、Web服务器或任何其他外部依赖的情况下进行测试
独立于UI:UI可以轻松的更改,而无需更改系统的其余部分。例如用控制台UI(终端)代替Web UI,而不需要更改业务规则。
独立于数据库:你可以切换底层数据库,你的业务业务规则不应该于数据库绑定
独立于任何外部依赖:你的业务规则根本不了解外部世界
本文顶部的图是尝试将所有这些体系结构集成到一个可行的想法中的尝试。
依赖性规则(The Depende ...
Golang源码分析可视化
A picture is worth a thousand words.
我们在阅读博客和文档的时候,通常倾向于阅读配有图形的这些文章。如果一篇技术类文章从头到尾都是文字,将十分影响读者的阅读体验,
也不便于读者理解。还有我们在进行一些项目源码分析时,边阅读代码,边绘制一些图形能够极大的提升效率,同时也能加强自己理解。
这片博文我将介绍我是如何绘制调用图和'类图'(不是面向对象语言中的类图)帮助自己更好地理解Golang项目的。
Golang目前还没有关于调用图和类图的官方标准,有一些工具能够静态分析能够生成项目调用图和类图,不过也不是很成熟。
而且自动生成的图形美观性很差,也不便于调整。不过这些工具定义了一些如何可视化Golang元素的规则,
我借鉴了这些规则,同时结合UML类图的语法定义,形成了一套规则。
go-callvisgo-callvis是用于可视化 Go 程序之间的调用拓扑和包关系的的开发工具。
这个库定义了一些规则,用于统一的表示Golang项目元素。
Golang 代码元素及规则规则目前参考 go-callvis
Package/Type大型项 ...
Helm:kubernetes包管理工具
最近给部门的小伙伴做了一个关于helm的入门介绍,收到了不错的反响,于将资料整理分享给博客的读者们。
本文第一部分介绍helm是做什么的以及能解决什么问题。第二部分介绍helm的核心概念及安装使用helm的教程,
第三部分介绍helm使用的核心即chart的开发,这一章节通过一个示例给大家演示基本的开发步骤。最后一部分,
简单说明如何搭建私有模板仓。在读完后,相信你会对Helm及生态有一个简单的了解。
什么是 helm如标题所示,官方给Helm的定义是 kubernetes 的包管理器。那么什么是包管理器呢?
什么是包管理工具
包管理器一组软件工具,它们以一致的方式自动安装、升级、配置和删除计算机操作系统的计算机程序 -维基百科helm 帮助用户管理 kubernetes 程序,helm chart 帮助用户定义、安装和升级最复杂的 Kubernetes 应用程序,Charts 很容易
创建,版本管理,共享和发布,所以停止 copy-and-paste,开始使用 helm -helm 官方
核心概念helm的官方文档中的描述更加详细,这里只列出一些重要的概念:
Helm ...
GO111MODEDULE变量以及Go Module的使用建议
我们可能在很多地方如 README 文件、Makefile 文件以及 Dockerfile 文件中看到GO111MODULE=on,
对于刚接触的Golang的开发者可能对此有很多疑惑。
1GO111MODULE=on go get -u golang.org/x/tools/gopls@latest
这片文章,我将详细介绍GO111MODULE变量的意义,以及什么时候需要使用到该变量,
同时也总结了一些在使用 Go Modules 时需要注意的细节,帮助你在下次遇到这个变量时不再疑惑。
从 GOPATH 到 GO111MODULE首先,对于 GOPATH,无论是资深开发者和新开发者都不会陌生。GO 在 2009 年发布时,并没有提供包管理器(Package manager),
go get会根据导入路径拉取所有的源代码,存储在$GOPATH/src目录中。这种方式使用master分支作为包的稳定版本。
可想而知,这种方式缺乏灵活性同时很容易造成版本管理混乱的状态。
Go Modules(旧版本被成为vgo-versiond Go)在 Go 1.11 被正式引入,与 GOPATH 方 ...
Golang什么时候该使用指针
Golang 什么时候使用指针(Pointer)?什么时候使用值(Value)?对于go开发者来说是一件头疼的事情,
而且这个问题似乎没有绝对的答案,那是否代表我们可以随意使用呢?答案当然是否定的。本文我将试图总结什么场景使用指针更合理。
在开始阅读前,建议读者先能够清晰理解 Golang 指针、类型和值等概念。
本文并不是标准更不是唯一答案,而是自己根据使用经验和社区的一些讨论而总结的实践
有下几种情形,我们是否需要考虑使用指针:
结构体定义的字段
方法中接受者
函数传参
函数和方法返回值
这里我先给出使用一般准则,后面详细介绍不同场景的细节。
方法通常使用指针作为接受者, 官方文档的建议是:如果犹豫,请使用指针;
Slices,maps,channels,strings,function value and interface value 这些类型内部通过指针实现,再定一个指针指向这些类型的变量是多余的;
当一个结构体很复杂或者需要修改结构体使用指针,其他情况使用值,因为滥用指针会出现一些不可预料的情况;
什么不需要使用指针
CodeReviewComments中建议传 ...
RESTful
接口设计
问题
资源校验,UI表单分布提交,校验,这里需要提供一些字段校验接口,比如校验
template name
kubernetes1.17安装glusterfs
本文介绍了如何使用在最新kubernetes版本上安装glusterfs。
官方源仓库master分支相关脚本无法部署成功,主要是由于kubernetes的版本发生了变化,
一些beta版本的资源升至稳定版本,所以一些模板yaml文件需要修改,这些修改很多在issus中能够发现,目前还未合并到主分支,仍然需要手动修改。
所以我Fork了源仓库,合并了这些这些修改。代码仓库地址为:gluster-kubernetes。
同时还将镜像源改为国内镜像源,镜像源使用国内daocloud.io/daocloud下的镜像。
安装前以下原因可能会导致安装失败,安装前请先检查。
glusterfs server和glusterfs client版本需要尽量保持一直,由于镜像中的glusterfs server版本较低,为7.1,
所以客户端不能够安装最新版本,centos7 yum版本回退操作如下:
12345678910# 获取事务IDyum history info glusterfs-fuse # 删除所有依赖yum history undo ${事务ID}# 安装7.1 ...
2019-summary
一年的时间,眨眼就过去了!
Make easier工程师的追求是让事情变得更简单!。将复杂度扔给工程师。
简单的设计
简单的
相信过程并坚持下去《Atomic Habits》里面,有一个很有趣的过程理论:
1% worse everyday for one year:0.99³⁶⁵ = 0.03
1% better everyday for one year:1.01³⁶⁵ = 37.78