学习内容来自:https://www.kancloud.cn/uvohp5na133/golang/934105
Chrome浏览器生产力工具
- ctrl+数字用来窗口切换,或用ctrl+TAB
- j/k用来上下翻页,f:用来开启点击行为
vs code 和git相关操作
- clone之后或者连接远端仓库之后在vs code中创建新的分支(左下角的master分支)-》创建新分支 。分支的模型见廖雪峰的git教程
- 各自对代码进行fork,创建出自己的分支,在开发之后dev分支会领先master分支,当git merge之后HEAD指针重新指回master分支,就可以删除自己开发的分支了
- 为什么要设置html的空格为2,因为在双窗口进行开发的过程中,2个单位的缩进会更加节省空间。在复制的时候,第一行不要全部都选中。
- font-family:“微软雅黑”
- stage all changes添加到暂存区
- 然后进行提交,可以选分支
- 在github上点击提交的内容可以对比进行查看
- 新建的分支也会多出来一个分支
- vscode神级插件:remote development
- remote-ssh,打开一个新终端后输入密码
https://code.visualstudio.com/docs/remote
基本类型
- 值类型:直接存储值,内存通常在栈中分配。&获取变量的地址:int,float,bool,string,struct
- 引用类型:变量存储的是内存地址,这个地址存储最终的值。内存通常在堆上分配,通过GC回收,获取指针类型(引用类型)通过*取值符号:slice,map,chan都是引用类型
- new和make的区别:make用来创建引用类型,new用来创建值类型和用户自定义的类型。
- new和make都是用来分配内存。new分配类型的0值并返回其地址(指针),new(int)。
- make返回初始化之后的值,因此比new进行了更多的工作
- var用来定义变量,const用来定义常量,常量不能使用 “:=” 语法定义
- golang支持指针类型:
• 默认值 nil,没有 NULL 常量。
• 操作符 “&” (取地址符) 取变量地址,"*" (取值符)透过指针访问目标对象。
• 不支持指针运算,不支持 “->” 运算符,直接用 “.” 访问目标成员。
- struct自定义复杂结构的数据结构
- golang默认不支持UTF-8需要安装
- go get github.com/axgle/mahonia
str := "乱码的字符串变量"
str = ConvertToString(str, "gbk", "utf-8")
fmt.Println(str)
单元测试
go test 文件名 -v
go test -branch= 文件名 -v
- benchmark只能测试Test function,要注意了啊
- benchmark的详细用法就不再赘述了
ETCD
用于共享配置和服务发现的分布式、高可用一致性的key-value存储系统。提供配置共享和服务发现的系统比较多,其中最为熟知的就是Zookeeper,ETCD算是后起之秀。在项目实现,一致性协议、易理解、运维、安全等多个维度上ETCD比Zookeeper都占据优势。
- 高可用、强一致性的服务发现存储仓库,分布式k-v存储,可用配置共享和服务发现。
- 类似项目:Zookeeper和consul
- 开发语言Go
- 提供restful api使用简单
- 基于HTTP+JSON的API使用curl命令就可以轻松使用
- 可选SSL客户认证机制
- 每个实例每秒支持1000次写操作
- 算法:raft算法的强一致性,高可用的服务存储目录。
ETCD vs ZK (zookeeper)
一致性协议: ETCD使用[Raft]协议, ZK使用ZAB(类PAXOS协议),前者容易理解,方便工程实现;
运维方面:ETCD方便运维,ZK难以运维;
项目活跃度:ETCD社区与开发活跃,ZK已经快死了;
API:ETCD提供HTTP+JSON, gRPC接口,跨平台跨语言,ZK需要使用其客户端;
访问安全方面:ETCD支持HTTPS访问,ZK在这方面缺失;
ETCD的使用场景
-
配置管理
-
服务注册与发现
-
选主
-
应用调度
-
分布式队列
-
分布式锁
-
https://segmentfault.com/a/1190000018246150
NSQ
- NSQ是一个基于Go语言的分布式实时消息平台,基于MIT开源协议,NSQ可用于大规模系统中的实时消息服务,并且每天能够处理数亿级别的消息,其目标是在分布式的环境下运行去中心化服务。NSQ具有分布式、去中心化的结构的拓扑结构,该结构具有无单点故障、故障容错、高可用性保证消息的可靠性传递。
- NSQ容易配置和部署,具有最大的灵活性,支持众多消息协议。官方还提供了拆箱即用的Go、Python库。
- NSQ四个重要组成构件
- nsqd:负责接收、排队、转发消息到客户端的守护进程
- nsqlookupd:管理拓扑信息并提供最终一致性的发现服务的守护进程
- nsqadmin:web管理界面,可实时查看集群的统计数据和执行各种各样的管理任务
- utitles:常见的基础功能、数据流处理工具,如nsq_stat、nsq_tail、nsq_to_file、nsq_to_http、nsq_to_nsq、to_nsq
主要特点
- 具有分布式无单点故障的拓扑结构,支持水平扩展,在无中断的情况下无缝添加集群节点
- 低延迟的消息推送
- 具有组合式的负载均衡和多播形式的消息路由
- 既擅长处理面向流(高吞吐量)的工作负载,也擅长处理面向Job(地吞吐量)工作负载
- 消息数据既可以存储在内存中也可以存储在磁盘中
- 实现了生产者、消费者自动发现和消费者自动连接生产者
- 支持安全传输协议(TLS),从而保证了消息传递的安全性
- 具有与数据格式无关的消息结构,支持JSON、Protocol Buffers、MsgPacek等消息格式
- 非常易于部署(几乎没有依赖)和配置(所有参数都可以通过命令行进行配置)
- 使用了简单的TCP协议,具有多种语言的客户端功能库
- 具有用于信息统计、管理员操作和实现生产者等HTTP接口
- 为实时检测集成了统计数据收集器StatsD
- 具有强大的集群管理界面
为了达到高效的分布式消息服务,NSQ实现了合理、智能的权衡,从而使得能够完全适用于生产环境中
- 支持内存消息队列的大小设置,默认完全持久化(值为0),消息即可持久到磁盘也可以保存在内存中
- 保存消息至少传递一次,以确保消息可以最终成功发送
- 收到的消息是无序的,实现了松散的订阅
- 发现服务nsqlookupd具有最终一致性,消息能够找到所有Topic生产者。
-
单个nsqd被设计为一次能够处理多个流数据,NSQ中的数据流模型是由stream和consumer组成。Topic是一种独特的stream,channel是一个订阅了给定topic的consumer逻辑分组(类比于kafka中的partiton)
- -
从上图可以看出,单个nsqd可以有多个topic,每个topic可以有多个channel。chann能够接收topic所有消息的副本,从而实现了多播分发;从而channel上的每个消息被分发给他的订阅者,从而实现负载均衡。
- 当生产者发布消息的时候,消息会被多播拷贝到不同的channel中,channel起到了队列的作用
- 在consumer想单独获取某个topic消息时可以subscribe(订阅)一个单独命名的nsqd中还不存在的channe,nsqd会为这个consu创建其命名的channel
- channel会将消息进行排队,如果没有consumer读取消息,消息会在内存中排队,当量太大时就会保存到磁盘(参数可以自己配置)
- 一个chan一般会有多个consu连接。每个consum处于准备状态,每个消息被传递到一个随机的consumer
- Go语言中每个channel是表达队列的一种自然方式,因此NSQ的toic/channel核心就是存放消息指针的go-channel缓冲区。缓冲区的大小由mem-queue-siza配置参数确定。
consumer消息的消费者
- consumer通过TCP subscrible自己需要的channel
- 多个 consumersubscribe一个 channel,假设所有已连接的客户端处于准备接收消息的状态,每个消息将被传递到一个 随机 的 consumer。
- NSQ支持延时消息,consumer在配置的延时时间后才能接受相关消息
- channel在consumer退出后并不会退出。
详见:https://zhuanlan.zhihu.com/p/37081073
kafka
-
kafka是由scala语言开发,支持多个语言大额客户端
-
最开始由linkedin公司开发,之后成为apache的顶级项目
-
kafka是一个分布式分区化,可复制提交的日志服务
-
是一个松耦合, 可扩展,高可用的消息系统
-
无需停机即可扩展机器
-
持久化:通过持久化防止数据丢失
-
支持离线和在线场景
-
kafka中的概念
topic(话题):kafka中区分不同的名称类别。由producer指定
producer(生产者):将消息发送到特定topic的对象(过程)
consumer(消费者):订阅并处理特定的topic的对象过程
broker(kafka服务集群):已发布的消息保存在一组服务器中,称之为kafka集群。集群中每个服务器都是一代理(broker),消费者可以订阅一个或多个话题,并从broker拉取数据,从而消费这些已发布的消息
partition:topic上的物理分组,一个topic可以分为多个partition,每一个partition都是一个有序队列,partition中每一条消息都会被分配一个有序的id(offset)
message:消息,通信的基本单位,每一个producer可以向一个topic发布消息