Go语言中文网 为您找到相关结果 178

golang 源码学习之WaitGroup

数据结构 //sync/waitgroup.go type WaitGroup struct { noCopy noCopy // 不可复制,只能指针传递 // 对齐的8byte存储状态, 另外4byte存储信号。状态的高32位counter计数器,低32位waiter计数器 // counter未执行完的goroutine。waiter正在等待的goroutine。那么WaitGroup可以放多少goroutine呢?2^32 state1 [3]uint32 } Add //sync/waitgroup.go func (wg *WaitGroup) Add(delta int) { // statep状态(包含counter和waiter计数器),semap信号 statep, sem...阅读全文

博文 2019-10-27 23:32:52 aside section._1OhGeD

ETCD探索-MVCC

ETCD探索-MVCC MVCC MVCC模块ETCD的存储模块,是ETCD核心模块。 作为一个开源项目,其代码的封装是值得我们学习的。MVCC作为底层模块,对上层提供统一的方法,而这些方法都定义在kv.go这个文件中,很像一个头文件(.h)。我们可以只看kv.go以及配合kv_test.go就可以知道mvcc包是怎么用的。 kv.go type KV interface { ReadView WriteView // Read creates a read transaction. Read(trace *traceutil.Trace) TxnRead // Write creates a write transaction. Write(trace *traceutil.Trace) ...阅读全文

博文 2020-02-19 17:32:41 HammerMax

百亿级日志系统架构设计及优化

本文将从海量日志系统在优化、部署、监控方向如何更适应业务的需求入手,重点从多种日志系统的架构设计对比;后续调优过程:横向扩展与纵向扩展,分集群,数据分治,重写数据链路等实际现象与问题展开。 日志系统架构基准 有过项目开发经验的朋友都知道:从平台的最初搭建到实现核心业务,都需要有日志平台为各种业务保驾护航。 图片.png 如上图所示,对于一个简单的日志应用场景,通常会准备 master/slave 两个应用。我们只需运行一个 Shell 脚本,便可查看是否存在错误信息。 随着业务复杂度的增加,应用场景也会变得复杂。虽然监控系统能够显示某台机器或者某个应用的错误。 然而在实际的生产环境中,由于实施了隔离,一旦在上图下侧的红框内某个应用出现了 Bug,则无法访问到其对应的日志,也就谈不上将日志取出...阅读全文

golang分布式存储 读书笔记(3)——数据冗余之RS码

对象存储的数据冗余 如果数据只存储一份,存储设备坏了数据就丢失了,所以需要做数据冗余。 常见的数据冗余策略就是多副本冗余,该策略实现简单,但是代价比较高。书中介绍的冗余策略是使用Reed-Solomon纠删码实现的。 RS纠删码中有数据片和校验片的概念,假如说选择4个数据片,那么就会将数据分成4个分片对象。每个分片的大小是原始对象的25%,如果选择2个校验片,那么会同时生成2个和数据片大小一样的校验片,所以一个文件最后会得到6个分片。 神奇的是,6个分片里面,只要有任意4个分片没有损坏,都可以还原出原始文件。 评价一个数据冗余策略的好坏,主要是衡量该策略对存储空间的要求和其抗数据损坏的能力。 对存储空间的要求是指我们采用的冗余策略相比于不使用冗余要额外支付的存储空间,用百分比表示。 抗数据损...阅读全文

博文 2019-02-11 19:34:41 StormZhu

Go夜读-IPFS预习资料

IPFS就其本身,没有用到多少新技术,大多数都是已有技术和思路,但并不能说就没有创新,类似比特币。取名为IPFS,星际文件系统,有点科幻意味,不过思路是,以后组建星际互联网,如果基于用HTTP的基于资源定位符寻址,延时等都不可接受,而基于内容寻址,一定程度上能解决这个问题,缓解光速屏障。 分布式哈希表 思路:KadDHT的节点寻址与内容寻址同构,在KAD基于异或来计算逻辑距离的基础上,节点倾向于连接与自己距离更近的节点,存储与自己距离更近的内容Key值,并在此之上加入了延时等具体物理距离的考量(Coral DHT)。引入S-KadDHT加入了一定的抗女巫攻击能力,因为生成一个公私钥需要计算难度值。 Git IPFS的基础数据结构与组织方式受Git影响很深,首先Git是一套基于内容寻址的文件系...阅读全文

博文 2019-09-16 11:02:52 xcshuan

程序员应该如何保护用户的密码

最近几年的新闻中一直有互联网头部公司系统被攻击导致用户密码泄露的新闻。那密码被破解肯定和当初项目伊始时选择的密码哈希方案造成的历史包袱有关。我们不讨论这些互联网巨头应该采用什么方案防止用户密码被破解,我知道的方案人家养的那些技术大拿更知道了。我们就来说一下,如果我们有机会自己从零开始做一个系统时,应该选择什么样的哈希算法有效防止用户的密码不被破解。 既然想保护用户密码不被破解,就先了解下破解密码的手段吧。 攻击密码的主要方法 我们需要防御的两种主要的密码攻击方式是: 字典攻击 暴力攻击 它们的工作方式非常简单:使用预先生成的密码哈希列表并进行简单的比较,以找到创建所需哈希的字符串。对于未加盐的密码,可以下载大量预先生成的密码列表。然后只需要简单查找即可。这种列表称被为彩虹表。 如果密码使用了...阅读全文

博文 2020-04-11 10:32:43 KevinYan_a990

4. golang的整数和浮点数以及bool类型

一, 整数 整数,就是存放整数值的,如0, -1, 800等 整数的类型: 类型 有无符号 占用存储空间 值范围 备注 int8 有 1字节 -2^7 ~ 2^-1 int16 有 2字节 -2^15 ~ 2^15 -1 int32 有 4字节 -2^31 ~ 2^31 -1 int64 有 8字节 -2^63 ~ 2^63 -1 uint8 无 1字节 0 ~ 2^8 - 1 uint16 无 2字节 0 ~ 2^16 - 1 uint32 无 4字节 0 ~ 2^32 - 1 uint64 无 8字节 0 ~ 2^64 - 1 int 有 32位系统4个字节 64位系统8个字节 参考int32和int64 uint 无 32位系统uint32 64系统uint64 参考uint32和ui...阅读全文

博文 2020-01-22 17:32:44 瓦灯_c6f0

2018-08-19 说一说现在的Decentralized Storage的传输

golang是特别不适合拿来做应用层可靠协议开发的语言。所有的可靠协议都依赖于连接状态,在讲究并发的场景下,所有的状态都依赖于事件,所有的事件都依赖于内核文件描述符,问题是,在可靠场景下,我们常常需要将一个端口用作一块网卡,一块网卡可以有65536个描述符并发处理事件,一个端口却只有一个描述符,这一个描述符需要模拟出65536个描述符的事件处理效能,这本来就是令人头大的问题。golang本身的协程机制----固然golang和大多数的协程实现不尽一致----导致每一个事件的处理都应短暂,且事件之间应是无状态的,如果对于可靠协议各阶段的业务与事件理解不到位,极其容易实现出资源有余,而协议效能低下的情况。为什么要有上面一段呢?因为目前的Sia,IPFS,Storj,Swarm都是golang实现...阅读全文

Libra介绍

前沿 从技术上来说,Libra属于区块链2.0 的联盟链,在实现上,整体参考了以太坊的设计,当然,自己实现了一套类似于solidity 的智能合约语言,Move;共识上,使用的是BFT 共识算法蔟,称之为LibraBFT。当然,这里是联盟链,因此,自身也实现了一套联盟准入机制。 1、交易模型 transaction { Sender address:交易发起方的账户地址, Sender public key:交易发起方公钥, Program:{ script: Move 交易脚本字节码(Move 类似与以太坊的 solidity,作为libra的只能合约语言), inputs: 所调用合约方法的入参,作为点对点交易,方法入参包括交易接受方address,以及转账额度 }, Gas price...阅读全文

博文 2019-06-20 17:32:53 萝卜头4lbt

Gitee + 区块链:基于 IPFS 的去中心化代码托管环境探索

Gitee 团队一直在探索去中心化的存储技术,甚至是建立于区块链上的完全去中心化的存储,以为开发者提供更安全、稳定的代码托管环境,为此我们一直在跟踪和研究两大核心技术问题,一是去中心化的底层存储技术,二是适用的高效共识算法。一、去中心化的底层存储协议在底层存储协议方面, Gitee 团队深入研究了 IPFS 协议,同时在探索 IPFS 协议作为底层存储技术在实现去中心化代码托管的落地可行性和优缺点。IPFS(InterPlanetary File System – 星际文件系统)是一个基于内容哈希寻址的点对点的超媒体分发协议,2014 年开始由 Protocol labs在开源社区下推动发展,目前已经提供了基于 Golang 的开源实现(详情请访问:https://github.com/ip...阅读全文

博文 2019-10-31 17:32:53 aside section._1OhGeD

阿里云虚拟主机使用教程

课程介绍 阿里云虚拟主机市场占用率第一,20年专业品质保证;产品特点:预装网站运行环境,赠送正版数据库,可通过图形化控制面板管理,主要用于搭建网站。 独享系列虚机特点:客户独享整台服务器资源,无资源争抢更稳定,不限流量更快速、独立IP更易推广,适合企业建站客户; 共享系列虚机特点:多客户共享服务器硬件资源,价格优惠,简单易用,适合于开发者、个人站长建站; 产品详情:https://wanwang.aliyun.com/hosting/ 课时列表 • 课时1:购买虚拟主机和初始化密码信息 • 课时2:FTP 上传与解压缩文件 • 课时3:绑定并解析域名 • 课时4:切换语言环境 • 课时5:虚拟主机临时域名的使用 开始学习http:...阅读全文

Swarmkit笔记(7)——exec.Executor interface

exec.Executor interface定义(位于agent/exec/executor.go): // Executor provides controllers for tasks. type Executor interface { // Describe returns the underlying node description. Describe(ctx context.Context) (*api.NodeDescription, error) // Configure uses the node object state to propagate node // state to the underlying executor. Configure(ctx conte...阅读全文

博文 2017-06-25 14:07:18 肖楠

每周阅读(3/11/2019)

Hand-crafting a Sidecar Proxy like Istio 如何实现 sidecar 模式?文中用 golang 实现了一个示例: 用 sidecar 容器代理流量和转发 用 init 容器修改 iptable 实现流量拦截 Istio v1.10 sidecar 资源 1.10 有一个对于提高 pilot 和代理性能的新增资源配置 - Sidecar。 apiVersion: networking.istio.io/v1alpha3 kind: Sidecar metadata: name: default namespace: prod-us1 spec: ingress: - port: number: 9080 protocol: HTTP name: some...阅读全文

博文 2019-03-17 18:34:42 Jeff

3. golang的变量整体介绍以及分类

[toc] 任何高级语言,变量都是程序最基本的组成单位. golang中的变量相当于给内存中一个数据的存储空间打一个记号,以后利用这个记号就可以很容易的找到这个存储空间里存放的数据. 一, 变量的基础知识 变量表示内存中一个存储空间 该存储空间的名称就是变量名 申请变量就是申请一个内存的存储空间 申请变量也就是申请内存的存储空间,申请的时候应该指名该存储空间的名称(变量名)以及该存储空间是用来存放什么数据类型(变量的数据类型)的,因为不同的数据类型需要的内存大小不一样,比如申请一个8位的整数的存储空间只需要一个字节,而申请一个64位的整数的存储空间需要8个字节. 申请的存储空间的名称就是变量名,申请存储空间用来存放的数据类型就是变量的数据类型 二,变量的分类 基本数据类型: 数值型 整数类:...阅读全文

博文 2020-01-22 17:32:45 瓦灯_c6f0

go-graphql 自定义 Scalar

学习笔记,写这篇笔记时才刚入门golang,希望各路大神多多指点。 场景 假设有一个 Role 模型 type Role struct { Id int Name string Status RoleStatus } 其中RoleStatus类型表示角色的状态: type RoleStatus int const ( RDefault RoleStatus = iota RPublish RBlock RDeleted ) 所以数据库在存储角色状态时是Int型,而使用graphql开发接口想以string类型输出状态 的名称,此时就可以利用自定义Scalar功能。 下面这个map用于存储状态名称值和RoleStatus之间的映射: type RSMapType map[interface{}...阅读全文

博文 2019-07-13 17:32:40 SasukeBo

时序数据库 InfluxDB(四)

相关文章:时序数据库 InfluxDB(一)时序数据库 InfluxDB(二)时序数据库 InfluxDB(三)时序数据库 InfluxDB(四)时序数据库 InfluxDB(五)时序数据库 InfluxDB(六) 存储引擎 InfluxDB 数据的写入如下图所示: 所有数据先写入到 WAL( Write Ahead Log )预写日志文件,并同步到 Cache 缓存中,当 Cache 缓存的数据达到了一定的大小,或者达到一定的时间间隔之后,数据会被写入到 TSM 文件中。 为了更高效的存储大量数据,存储引擎会将数据进行压缩处理,压缩的输入和输出都是 TSM 文件,因此为了以原子方式替换以及删除 TSM 文件,存储引擎由 FileStore 负责调节对所有 TSM 文件的访问权限。 Comp...阅读全文

闭包的思想

思考一个问题: 如何能够在运行的时候控制或者改变一个函数对于输入的行为? 比如在一个函数外部修改一个变量就能改变这个函数的行为? 于是一个称之为闭包的东西出现了。 闭包:函数和引用的外部变量一起构成一个闭包。 ✳注意:如果没有上述目的,不要引用函数外部的变量。把它作为参数传入你的函数。否则你很有可能因此引入意想不到的bug。 如何实现闭包? 下面是golang的实现 以下引自https://hitzhangjie.github.io/jekyll/update/2018/05/19/golang-function-closure%E5%AE%9E%E7%8E%B0%E6%9C%BA%E5%88%B6.html 假如闭包定义后立即被调用 因为只会被使用一次,所以应该力图避免闭包对象的内存分配操...阅读全文

博文 2019-07-12 18:32:40 doob_9117

【Golang小知识】new与make的区别

定义 func new(Type) *Type func make(t Type, size ...IntegerType) Type 其中Type代表某一个数据类型。 区别 1.返回值 从定义中可以看出,new返回的是指向Type的指针。make直接返回的是Type类型值。 2.入参 new只有一个Type参数,Type可以是任意类型数据。make可以有多个参数,其中第一个参数与new的参数相同,但是只能是slice,map,或者chan中的一种。对于不同类型,size参数说明如下: 对于slice,第一个size表示长度,第二个size表示容量,且容量不能小于长度。如果省略第二个size,默认容量等于长度。 对于map,会根据size大小分配资源,以足够存储size个元素。如果省略siz...阅读全文

博文 2019-11-17 17:32:41 moonbamboo

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

在Web应用开发中Session是在用户和服务器之间进行交换的非持久化交互信息。当用户登录时,可以在用户和服务器之间生成Session,然后来回交换数据,并在用户登出时销毁Session。gorilla/sessions软件包提供了易于使用的Go语言Session实现。该软件包提供了两种不同的实现。第一个是文件系统存储,它将每个会话存储在服务器的文件系统中。另一个是Cookie存储,它使用我们上篇文章讲的SecureCookie在客户端上存储会话。同时还提供了用户自定义Session存储实现的选项,我们可以根据应用的需求自己实现Session存储。因为我们的教程是学会使用为目的就不大费周章的去实现MySQL或者Redis版本的Session存储了,我们直接使用软件包提供的Cookie实现来完...阅读全文

博文 2020-03-12 09:32:42 Kevin

DAY1 GOLANG(一)变量

先定义再赋值第一种 var i int (var +变量名+变量类型)第二种 (类型推导) var num =10.11第三种 (快速定义并赋值) 省略var,但是必须加 " : " , name : = "tom"等价于 var name string / name = “tom”多变量赋值及赋值var n1,n2,n3 int 或var n1, n2, n3 = "a" , 20 , 988全局变量:在函数外定义的变量 数据值可以再同一类型范围内不断变化加号的使用:数值型则相加,字符型则拼接 浮点(float32 float64):float64 保存精度高字符型:使用比byte来保存单个字符:结构体(struct):相当于类(class)管道(channel):用于多并发切片(slic...阅读全文

博文 2019-10-25 20:32:45 aside section._1OhGeD

【Go语言踩坑系列(二)】字符串

声明 本系列文章并不会停留在Go语言的语法层面,更关注语言特性、学习和使用中出现的问题以及引起的一些思考。 要点 本文关注Go语言字符串相关的语言特性、以及相关的[]byte、[]rune数据类型。 从字符编码说起 ASCII 计算机是为人类服务的,我们自然有表示我们人类所有语言与符号的需求。由于计算机底层实现全部为二进制,为了用计算机表示并存储人类文明所有的符号,我们需要构造一个“符号” => “唯一编码”的映射表,且这个编码能够用二进制来表示。这样就实现了用计算机来表示人类的文字与符号。最早的映射表叫做ASCII码表,如:a => 97。这个相信大家都很熟悉了,它是由美国人发明的,自然首先需要满足容纳所有英文字符的需求,所以并没有考虑其他国家的语言与符号要如何用计算机来表示。但是随着计算...阅读全文

作为云计算 2.0 时代的里程碑,云数据库PolarDB 还需要做什么?

随着用户、业务和数据的增长,由于I/O瓶颈(存储和网络)导致的备份、性能、迁移、升级、只读实例、磁盘容量、Binlog延迟等相关问题渐渐显现;过多数据库存储引擎的类型导致的工程效率以及运维成本显著上升,最好有一种通用的产品技术架构能兼顾不同用户场景的需求。针对以上关系型数据库在云托管环境逐渐暴露出一些问题,阿里云将在9月下旬推出自研通用云数据库PolarDB,是国内首个能从根本解决两大痛点的关键里程碑产品。 阿里云PolarDB是国内首个自主研发的通用云数据库,它拥有商业数据库一样的性能,但价格仅为前者的1/10,进一步降低用户的上云成本,大幅度提升OLTP性能,满足用户在业务连续性、在线业务扩展能力、数据安全上的需求,将彻底颠覆商业数据库的暴利时代。 在产品架构上放弃了通用分布...阅读全文

Go 编程: 从 K8S 资源定义到 YAML 配置框架的实现

文地址:Go 编程: 从 K8S 资源定义到 YAML 配置框架的实现 在 Go 语言中,实现 YAML 配置定义与解析是非常简单的, 以最新YAML 包 gopkg.in/yaml.v3 为例: import "gopkg.in/yaml.v3" type StructA struct { A string `yaml:"a"` } type StructB struct { StructA `yaml:",inline"` B string `yaml:"b"` } var b StructB err := yaml.Unmarshal([]byte(data), &b) 非常直白,貌似不值一谈。再看看现实, YAML 文件用途之广泛,特别是在Kubernetes 平台上的应用,简直就是...阅读全文

golang并发编程-20190624

进程 进程是操作系统进行资源分配的一个基本单元,由于描述程序执行的过程。 所有的进程都有父进程,所有的进程共同组成了一个树状结构 内核启动进程是所有进程的祖先,他自己作为自己的父进程 进程标识 内核对每个进程的属性和行为进行详细记录 pid就是这个唯一标识,pid为1的就是上面说的内核启动进程 image.png ppid就是当前进程的父进程 pid := os.Getpid() ppid := os.Getppid() 通过以上方法可以获取到对应的pid和ppid 进程空间 一个用户进程总会生存与用户的空间中 image.pn...阅读全文

kubernetes垃圾回收器GarbageCollector源码分析(一)

kubernetes版本:1.13.2 背景 由于operator创建的redis集群,在kubernetes apiserver重启后,redis集群被异常删除(包括redis exporter statefulset、redis statefulset)。删除后operator将其重建,重新组建集群,实例IP发生变更(中间件容器化,我们开发了固定IP,当statefulset删除后,IP会被回收),导致创建集群失败,最终集群不可用。 经多次复现,apiserver重启后,通过查询redis operator日志,并没有发现主动去删除redis集群(redis statefulset)、监控实例(redis exporter)。进一步去查看kube-controller-manager的日...阅读全文

排序(二)

归并排序 归并排序使用分治思想,分支算法一般都是用递归来实现的。 归并排序是一个稳定的排序算法,在merge过程中可以保证值相同的元素在合并前后顺序不变; 归并排序的时间复杂度是O(nlogn),他的执行效率和排序的原始数组的有序成都是无关的,任何情况的时间复杂度都是O(nlogn) 但是归并排序在合并的时候需要借助额外的存储空间,空间复杂度为O(n),所以不是原地排序算法; 快速排序 如果快排的partition函数不使用额外内存空间来进行,则可以做到原地排序; 快排是不稳定的; 虽然快速排序最坏情况的时间复杂度是O(n2),但是平均时间复杂度为O(nlogn),而且最坏情况的概率很小,可以通过合理地选择pivot来避免这种情况; 代码实现(Golang) type Sort struct...阅读全文

博文 2019-12-23 01:32:53 元气蛋蛋

图解kubernetes Kubelet驱逐管理关键实现

驱逐管理是kubelet自我保护的一种机制,当资源缺乏的时候,通过阈值和策略主动驱逐部分的Pod从而保持系统的资源水位在一个合理的范围内,本身的策略官方文档上已经写的很详细,今天只是看下其在代码上的一些设计 1. 设计臆测 1.1 驱逐总体流程 驱逐总体流程主要是通过获取当前使用资源的统计信息和当前活跃的Pod容器列表,然后结合资源阈值来决策是否需要进行Pod的驱逐 1.2 基于观察者模式的观测 在驱逐管理器中基于观察者模式实现对特殊资源驱逐管理的支持,比如内存资源,在某些情况下即时当前的资源水位没有达到阈值,也可能会触发oom killer这个时候,对应的ThresholdNotifier也会尝试进行状态同步,从而确定是否要主动的驱逐一些节点, 目前这个特性应该还没开, 同理如果这个资源有...阅读全文