golang好文
语言规范- [Close Channels Gracefully in Golang]: 如何优雅地关闭channel? http://www.tapirgames.com/blog/golang-channel-closing
- [Compile-time assertions in Go]: 编译时断言 http://commaok.xyz/post/compile-time-assertions/
- [Why are slices sometimes altered when passed by value in Go?]: Go不是按值传递么,怎么slice传入后被更改了呢?其实map也一样 https://www.calhoun.io/why-are-slices-sometimes-altered-when-passed-by-value-in-go/
- [Bit Hacking with Go]: Go的位操作 https://dev.to/vladimirvivien/bit-hacking-with-go
- [Go Range Loop Internal ...
领域驱动设计
应用层
聚合
聚合根
值对象
实体
领域模型
领域/子域
领域事件
领域服务
事件回溯
基础设施
工厂
仓库
上下文
CQRS
dci
https://www.cnblogs.com/Leo_wl/p/3866629.html#_label0
https://www.cnblogs.com/netfocus/archive/2011/10/10/2204949.html
https://blog.csdn.net/kkkkkxiaofei/article/details/62237121
https://www.jianshu.com/c/fe7dd7fc5372
聚合(根)、实体、值对象总结1. 聚合根、实体、值对象的区别?从标识的角度:
聚合根具有全局的唯一标识,而实体只有在聚合内部有唯一的本地标识,值对象没有唯一标识,不存在这个值对象或那个值对象的说法;
从是否只读的角度:
聚合根除了唯一标识外,其他所有状态信息都理论上可变;实体是可变的;值对象是只读的;
从生命周期的角度:
聚合根有独立的生命周期,实体的生命周期从属于其所属的聚合,实体完全由其所属的聚合根负责管 ...
CQRS模式
http://www.cqrs.nu/
https://www.cnblogs.com/yangecnu/p/Introduction-CQRS.html
CQRS模式在常用的三层架构中,通常都是通过数据访问层来修改或者查询数据,一般修改和查询使用的是相同的实体。在一些业务逻辑简单的系统中可能没有什么问题,但是随着系统逻辑变得复杂,用户增多,这种设计就会出现一些性能问题。虽然在DB上可以做一些读写分离的设计,但在业务上如果在读写方面混合在一起的话,仍然会出现一些问题。
本文介绍了命令查询职责分离模式(Command Query Responsibility Segregation,CQRS),该模式从业务上分离修改 (Command,增,删,改,会对系统状态进行修改)和查询(Query,查,不会对系统状态进行修改)的行为。从而使得逻辑更加清晰,便于对不同部分进行针对性的优化。文章首先简要介绍了传统的CRUD方式存在的问题,接着介绍了CQRS模式,最后以一个简单的在线日记系统演示了如何实现CQRS模式。要谈到读写操作,首先我们来看传统的CRUD的问题。
一. CRUD方式的问题 ...
DCI架构
https://www.artima.com/articles/dci_vision.html
https://www.jdon.com/37976
The DCI Architecture: A New Vision of Object-Oriented Programmingby Trygve Reenskaug and James O. CoplienMarch 20, 2009
Summary Object-oriented programming was supposed to unify the perspectives of the programmer and the end user in computer code: a boon both to usability and program comprehension. While objects capture structure well, they fail to capture system action. DCI is a vision to capture ...
六边形架构
https://www.jianshu.com/p/c2a361c2406c
六边形架构六边形架构又称“端口和适配器模式”,是Alistair Cockburn提出的一种具有对称性特征的架构风格。在这种架构中,系统通过适配器的方式与外部交互,将应用服务于领域服务封装在系统内部。
六边形架构还是一种分层架构,如上图所示,它被分为了三层:端口适配器、应用层与领域层。而端口又可以分为输入端口和输出端口。
输入端口 用于系统提供服务时暴露API接口,接受外部客户系统的输入,并客户系统的输入转化为程序内部所能理解的输入。系统作为服务提供者是对外的接入层可以看成是输入端口。
输出端口 为系统获取外部服务提供支持,如获取持久化状态、对结果进行持久化,或者发布领域状态的变更通知(如领域事件)。系统作为服务的消费者获取服务是对外的接口(数据库、缓存、消息队列、RPC调用)等都可以看成是输入端口。
应用层 定义系统可以完成的工作,很薄的一层。它并不处理业务逻辑通过协调领域对象或领域服务完成业务逻辑,并通过输入端口输出结果。也可以在这一层进行事物管理。
领域层 负责表示业务概念、规则与状态,属于 ...
Clean架构
Clean架构 外圈的层次可以依赖内层,反之不可以;内圈核心的实体代表业务,不可以依赖其所处的技术环境。
这是著名软件大师Bob大叔提出的一种架构,也是当前各种语言开发架构。干净架构提出了一种单向依赖关系,从而在逻辑上形成一种向上的抽象系统。
这种干净的架构图如下:
依赖规则Dependency Rule上图中同心圆代表各种不同领域的软件。一般来说,越深入代表你的软件层次越高。外圆是战术实现机制,内圆的是战略核心策略。
使此体系架构能够工作的关键是依赖规则。这条规则规定源代码只能向内依赖,在最里面的部分对外面一点都不知道,也就是内部不依赖外部,而外部依赖内部。这种依赖包含代码名称、类的函数、变量或任何其他命名软件实体。
同样,在外面圈中使用的数据格式不应被内圈中使用,特别是如果这些数据格式是由外面一圈的框架生成的。我们不希望任何外圆的东西会影响内圈层。
实体Entities实体封装的是企业业务规则,一个实体是一个带有方法的对象,或者是一系列数据结构和函数,只要这个实体能够被不同的应用程序使用即可。
如果你没有编写企业软件,只是编写简单的应用程序,这些实体就是应用的业务对象 ...
Uber开源Go语言编程规范
Uber开源Go语言编程规范
近日,Uber 开源了其公司内部使用的《 Go 语言编程规范》。该指南是为了使代码库更易于管理,同时让工程师有效地使用 Go 语言特性。文档中详细描述了在 Uber 编写 Go 代码的各种注意事项,包括具体的“Dos and Don’ts of writing Go code at Uber”,也就是 Go 代码应该怎样写、不该怎样写。今天我们就来简单了解一下国外大厂都是如何来写代码的。行文仓促,错误之处,多多指正。
https://www.infoq.cn/article/G6c95VyU5telNXXCC9yO
1. 介绍英文原文标题是 Uber Go Style Guide,这里的 Style 是指在管理我们代码的时候可以遵从的一些约定。
这篇编程指南的初衷是更好的管理我们的代码,包括去编写什么样的代码,以及不要编写什么样的代码。我们希望通过这份编程指南,代码可以具有更好的维护性,同时能够让我们的开发同学更高效地编写 Go 语言代码。
这份编程指南最初由 Prashant Varanasi 和 Simon Newton 编写,旨在让 ...
常见的五种软件架构
http://www.ruanyifeng.com/blog/2016/09/software-architecture.html
常见的五种软件架构软件架构(software architecture)就是软件的基本结构。
合适的架构是软件成功的最重要因素之一。大型软件公司通常有专门的架构师职位(architect),只有资深程序员才可以担任。
O'Reilly 出版过一本免费的小册子《Software Architecture Patterns》(PDF), 介绍了五种最常见的软件架构,是非常好的入门读物。我读后受益匪浅,下面就是我的笔记。
一、分层架构分层架构(layered architecture)是最常见的软件架构,也是事实上的标准架构。如果你不知道要用什么架构,那就用它。
这种架构将软件分成若干个水平层,每一层都有清晰的角色和分工,不需要知道其他层的细节。层与层之间通过接口通信。
虽然没有明确约定,软件一定要分成多少层,但是四层的结构最常见。
表现层(presentation):用户界面,负责视觉和用户互动
业务层(business):实现业务逻辑
持 ...
常见的十种软件架构模式
原文作者:Vijini Mallawaarachchi原文地址:10 Common Software Architectural Patterns in a nutshell
常见的十种软件架构模式有没有想过要设计多大的企业规模系统?在主要的软件开发开始之前,我们必须选择一个合适的体系结构,它将为我们提供所需的功能和质量属性。因此,在将它们应用到我们的设计之前,我们应该了解不同的体系结构。
什么是架构模式?根据维基百科中的定义:
架构模式是一个通用的、可重用的解决方案,用于在给定上下文中的软件体系结构中经常出现的问题。架构模式与软件设计模式类似,但具有更广泛的范围。
在本文中,将简要地解释以下10种常见的体系架构模式,以及它们的用法、优缺点。
分层模式
客户端-服务器模式
主从设备模式
管道-过滤器模式
代理模式
点对点模式
事件总线模式
模型-视图-控制器模式
黑板模式
解释器模式
一. 分层模式这种模式也称为多层体系架构模式。它可以用来构造可以分解为子任务组的程序,每个子任务都处于一个特定的抽象级别。每个层都为下一个提供更高层次服务。
一般信息系统中最常见的是如 ...
bind9实战
bind9实战前言不想每次都修改host文件来实现我的域名访问,所以我在想有没有一个更好的方式,可以让我实现域名映射。这个时候我想到了自己架设一个dns服务器。使用用开源dns系统bind9。
DNS资源记录类型
A : 此记录列出特定主机名的 IPv4地址。这是名称解析的重要记录。
AAAA : 名称至 IPv6 地址
CNAME 标准名称 此记录指定标准主机名的别名。
PTR : IPv4/IPv6 地址至名称
MX:邮件交换器,此记录列出了负责接收发到域中的电子邮件的主机。
NS:名称服务器,此记录指定负责给定区域的名称服务器。
dig结果显示中status参数
NOERROR : 查询成功
NXDOMAIN : DNS 服务器提示不存在这样的名称
SERVFAIL : DNS 服务器停机或 DNSSEC 响应验证失败
REFUSED : DNS 服务器拒绝回答 ( 也许是出于访问控制原因 )
安装其实安装非常简单,一条命令就搞定了
1sudo apt install bind9
管理命令启动:
1sudo systemctl start ...
如何安装设置Bind9 DNS服务器
如何安装设置Bind9 DNS服务器本指南是写给那些想学习如何配置和维护DNS服务器的人,例如为某个网络或者DNS zones(DNS域)提供 Domain Name(域名)服务
软件库BIND9 已经包含在 Ubuntu 核心库中,BIND9 并不需要启用其它附加库。
在我们开始之前,您应该熟悉 RootSudo。
安装 BIND9服务器
1$ sudo apt-get install bind9
有用的工具(测试用)
1$ sudo apt-get install bind9-host dnsutils
文档(可选)
1$ sudo apt-get install bind9-doc
BIND9 ScenariosBIND9 可以安装配置成许多类型。
最常用的配置有:
缓冲服务器这对于宽带连接的主机或小网络来说是有用的。通过缓冲 DNS 队列,您可以减少带宽的消耗,或者说有望减少您带宽的使用(甚至有望减少您宽带费用)。
主服务器BIND9 可以用于为已注册或虚拟的(仅用于受限网络中)域名提供 DNS 记录(指向域的记录组)。
从服务器从 ...
palybook详解
模块:https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html
Playbook介绍playbooks是一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的。
核心元素
Tasks:任务,由模板定义的操作列表
Variables:变量
Templates:模板,即使用模板语法的文件
Handlers:处理器 ,当某条件满足时,触发执行的操作
Roles:角色
hosts和users介绍
在playbook中的每一个play都可以选择在哪些服务器和以什么用户完成,hosts一行可以是一个主机组、主机、多个主机,中间以冒号分隔,可使用通配模式。其中remote_user表示执行的用户账号。
123---- ...
ansible入门
中文教程:https://ansible-tran.readthedocs.io/en/latest/index.html
模块:https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html
前言当下有许多的运维自动化工具( 配置管理 ),例如:Ansible、SaltStack、Puppet、Fabric 等。
Ansible 一种集成 IT 系统的配置管理、应用部署、执行特定任务的开源平台,是 AnsibleWorks 公司名下的项目,该公司由 Cobbler 及 Func 的作者于 2012 年创建成立。
Ansible 基于 Python 语言实现,由 Paramiko 和 PyYAML 两个关键模块构建。
Ansible 特点:
部署简单,只需在主控端部署 Ansible 环境,被控端无需做任何操作。
默认使用 SSH(Secure Shell)协议对设备进行管理。
主从集中化管理。
配置简单、功能强大、扩展性强。
支持 API 及自定义模块,可通过 Python 轻松扩展。
通过 P ...
Nginx配置文件nginx.conf详解
Nginx配置文件nginx.conf详解
http://nginx.org/en/books.html
nginx可以平滑升级
server继承main,location继承server,upstream既不会继承其他设置也不会被继承。在这四个部分当中,每个部分都包含若干指令,这些指令主要包含Nginx的主模块指令、事件模块指令、HTTP核心模块指令,同时每个部分还可以使用其他HTTP模块指令,例如Http SSL模块、HttpGzip Static模块和Http Addition模块等。
1.公共模块1234567891011121314151617#定义nginx运行的用户和用户组user www www;#nginx进程数,不知道怎么设置就设为auto,由系统自动分配worker_processes auto;#一个nginx进程打开的最多文件描述符数目,建议与ulimit -n的值一致worker_rlimit_nofile 65535;#根据worker的数量自动配置cpu绑定位图,这个参数是tengine配置worker_cpu_affinity auto;#全局错误 ...
Harbor搭建私有docker registry
https://github.com/goharbor/harbor
https://github.com/goharbor/harbor/blob/master/docs/user_guide.md
简单的说,Harbor 是一个企业级的 Docker Registry,可以实现 images 的私有存储和日志统计权限控制等功能,并支持创建多项目(Harbor 提出的概念),基于官方 Registry V2 实现。
Harbor提供的特性
基于角色控制 用户和仓库都是基于项目进行组织的, 而用户基于项目可以拥有不同的权限。
基于镜像的复制策略 镜像可以在多个Harbor实例之间进行复制。
支持LDAP Harbor的用户授权可以使用已经存在LDAP用户。
镜像删除 & 垃圾回收 Image可以被删除并且回收Image占用的空间。
友好UI 用户可以轻松的浏览、搜索镜像仓库以及对项目进行管理。
便于扩展 绝大部分的用户操作API, 方便用户对系统进行扩展。
轻松部署 Harbor提供了online、offline安装,除此之外还提供了virtualappliance安装 ...
Jenkins+Gogs搭建自动化部署平台
系统:ubuntu19.04
数据库:mysql5.7
git服务器:gogs
持续集成工具:jenkins
私有仓库:harbor
1.创建一个网络12345# 创建docker network create -d bridge --subnet=172.20.0.0/24 --gateway=172.20.0.1 deploy# 删除docker network rm deploy
2.搭建gogs服务器2.1 创建数据卷目录123sudo mkdir -p /var/jenkins/docker_mysql/datasudo mkdir -p /var/jenkins/docker_mysql/logsudo mkdir -p /var/jenkins/docker_gogs
2.2 编写docker-compose.yaml文件存放路径~/jenkins/gogs
gogs初始化数据库时填写mysql的IP地址(172.20.0.2)
12345678910111213141516171819202122232425262728293031323334353637 ...
docker网络模式
http://blog.daocloud.io/docker-bridge/
https://www.cnblogs.com/my_life/articles/8603435.html
https://www.jianshu.com/p/22a7032bb7bd
https://www.jb51.net/article/147664.htm
https://www.cnblogs.com/iiiiher/p/8052974.html
https://blog.csdn.net/qq_41830712/article/details/90721395(两个网桥通信)
docker network比较基础的几个命令
1234567docker network ls List networks 罗列容器网络列表docker network create Create a network 创建一个容器的网络docker network connect Connect a container to a network 让一个容器连接到指定的网 ...
docker-compose.yaml常用指令
https://docs.docker.com/compose/compose-file/
Compose和Docker兼容性:Compose 文件格式有3个版本,分别为1, 2.x 和 3.x。目前主流的为 3.x 其支持 docker 1.13.0 及其以上的版本
12345678910#系统变量$PWD : 当前目录#注意:YAML布尔值(true,false,yes,no,on,off)必须用引号括起来,以便解析器将它们解释为字符串。#字典时environment: SHOW: 'true' 数组时 environment: - SHOW=true
常用参数:
version # 指定 compose 文件的版本
services # 定义所有的 service 信息, services 下面的第一级别的 key 既是一个 service 的名称
build # 指定包含构建上下文的路径, 或作为一个对象,该对象具有 context 和指定的 dockerfile 文件以及 args 参数值
context # ...
docker部署gogs/gitea
数据库:mysql
git服务器:gogs/gitea
https://docs.gitea.io/zh-cn
https://gogs.io/
docker部署gogs/gitea创建数据卷目录1234mkdir -p /var/mysql/datamkdir -p /var/mysql/logmkdir -p /var/gogsmkdir -p /var/gitea
编写docker-compose.yamlgogs/gitea初始化数据库时填写mysql的IP地址(172.18.0.2)
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071version: '3'services: # mysql service mysql: container_name: mysql image: mysql:5.7 p ...
ubuntu错误解决方法
0x01错误:
1-bash: ./xxx.sh: /bin/bash^M: bad interpreter: No such file or directory
问题的原因是我在windows下编辑然后上传到linux系统里执行的。.sh文件的格式为dos格式。而linux只能执行格式为unix格式的脚本。
1.安装dos2unix
1apt install dos2unix
2.转换格式
1dos2unix xxx.sh
0x02ubuntu20.04.1 ssh登录
安装ssh
1sudo apt install openssh-server
修改配置文件
123456789101112vi /etc/ssh/sshd_config#Port 22#改为Port 22#PermitRootLogin prohibit-password#改为PermitRootLogin yes#在最后一行增加:KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-s ...