Golang设计模式

学习内容来自: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四个重要组成构件
  1. nsqd:负责接收、排队、转发消息到客户端的守护进程
  2. nsqlookupd:管理拓扑信息并提供最终一致性的发现服务的守护进程
  3. nsqadmin:web管理界面,可实时查看集群的统计数据和执行各种各样的管理任务
  4. 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发布消息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值