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

golang自定义一个简洁而强大的错误追踪包

一. 前言 1.1 错误追踪需要了解的信息 错误提示语 错误的位置, 如:具体的文件名,错误行号和错误方法等. 1.2 实际情况 golang自带了错误信息包error 只提供了简单的用法, 如errors.New(),和errors.Error()用来传递和获取错误信息. 明显官方的包已经不能满足了, 只能采取其他方法补救, 如: 扩充官方包 自定义错误包 目前已经有很多人造了这个轮子, 同时也各有特色, 有简单的, 也有复杂的. 这里为了简单使用, 我便选择了扩充官方包, 做一个简单优雅的错误处理包. 1.3 实现目标 通过简单调用, 即可以查看我们需要的信息, 最好是一键调用搞定. 为了照顾使用习惯, 我们就采用跟官方一致的用法, 来完成. 该包已经完成, github地址为 http...阅读全文

通用抽奖工具之系统设计

前言 上篇文章《通用抽奖工具之需求分析》我们已经通过一些常见的抽奖场景,得到了符合这些抽奖场景的抽奖工具五要素: 抽奖五要素 要素名称 第一要素 活动 第二要素 场次 第三要素 奖品 第四要素 中奖概率 第五要素 均匀投奖 以及创建一个抽奖活动的5个基本步骤,如下: 活动配置 场次配置 奖品配置 奖品中奖概率配置 奖品投奖配置 上篇文章回顾 《通用抽奖工具之需求分析》 需求已经分析完了,今天我们就来看看这通用抽奖工具具体的设计,分为如下三个部分: DB设计 配置后台设计 接口设计 DB设计 第一要素活动配置的抽奖活动表: -- 通用抽奖工具(万能胶Glue) glue_activity 抽奖活动表 CREATE TABLE `glue_activity` ( `id` int(11) uns...阅读全文

分布式负载均衡算法之亲和性轮询原理

无论是在早期的负载均衡器中,还是当前微服务基于客户端的负载均衡中,都有一个最基础的轮询算法,即将请求平均分布给多台机器,今天聊聊在此基础上, kube proxy是如何实现亲和性轮询的核心数据结构. 了解亲和性策略实现,失败重试等机制 1. 基础筑基 1.1 Service与Endpoints Service和Endpoint是kubernetes中的概念,其中Service代表一个服务,后面通常会对应一堆pod,因为pod的ip并不是固定的,用Servicel来提供后端一组pod的统一访问入口, 而Endpoints则是一组后端提供相同服务的IP和端口集合在这节内容中大家知道这些就可以来, 1.2 轮询算法 轮询算法可能是最简单的算法了,在go里面大多数实现都是通过一个slice存储当前可...阅读全文

博文 2020-02-07 11:34:17 8小时_2020

Golang基础(四)-- 错误处理

最近在做项目的时候,错误处理写的不是很好,甚至占用了一下午的时间专门调试这个错误处理问题,所以我觉得有必要单独再为自己整理一下错误处理的用法。虽然在看书的时候看到过关于error,panic,recover的简单介绍,但是在项目里错误处理及错误信息返回至关重要,所以在这单写一章错误处理内容...阅读全文

博文 2018-09-12 18:34:41 魔改谢馒头

兄弟连区块链教程btcpool矿池源码分析slparser

btcpool矿池-slparser(share log parser)模块解析 核心机制总结 支持三种功能: 指定Date和UID,将打印指定日期指定用户的share信息到stdout UID=0时,将打印指定日期所有用户的share信息 指定Date但未指定UID,读取指定日期sharelog,统计数据并写入数据库 按Worker、user、pool三个维度统计:Accept1h、Accept1d、score1h、score1d、Reject1h、Reject1d 数据库仅保留最近3个月统计数据 如果Date和UID均未指定,将监听文件变化,读取share并统计数据,每15秒写入数据库 同时启动Httpd服务,开放ServerStatus和WorkerStatus slparser命令使...阅读全文

博文 2018-10-26 15:34:41 兄弟连区块链培训

Golang笔记2--基础语法

Golang笔记2--基础语法 一个大的程序是由很多小的基础构件组成的。变量保存值,简单的加法和减法运算被组合成较复杂的表达式。基础类型被聚合为数组或结构体等更复杂的数据结构。然后使用if和for之类的控制语句来组织和控制表达式的执行流程。然后多个语句被组织到一个个函数中,以便代码的隔离和复用。函数以源文件和包的方式被组织 程序结构 命名 Go命名规则:一个名字必须以一个字母(Unicode字母,所以中文也可)或下划线开头,后面可以跟任意数量的字母、数字或下划线 Keyword: 不能用于自定义名字 break default func interface select case defer go map struct chan else goto package switch const ...阅读全文

博文 2019-08-12 01:02:40 开发心情不好

Go语言的错误处理

序言 错误处理在每个语言中都是一项重要内容。众所周知,通常写程序时遇到的分为异常与错误两种,Golang中也不例外。Golang遵循『少即是多』的设计哲学,错误处理也力求简洁明了,在错误处理上采用了类似c语言的错误处理方案,另外在错误之外也有异常的概念,Golang中引入两个内置函数panic和recover来触发和终止异常处理流程。 基础知识 错误指的是可能出现问题的地方出现了问题,比如打开一个文件时可能失败,这种情况在人们的意料之中 ;而异常指的是不应该出现问题的地方出现了问题,比如引用了空指针,这种情况在人们的意料之外。可见, 错误是业务逻辑的一部分,而异常不是 。 我们知道在C语言里面是通过返回-1或者NULL之类的信息来表示错误,但是对于使用者来说,不查看相应的API说明文档,根本...阅读全文

博文 2018-08-13 15:35:35 propylaia

Go “一个包含nil指针的接口不是nil接口”踩坑

最近在项目中踩了一个深坑——“Golang中一个包含nil指针的接口不是nil接口”,现象是函数内返回了nil给一个对象,使用interface接收函数返回值判断始终不为nil。总结下分享出来,如果你不是很理解这句话,那推荐认真看下下面的示例代码,避免以后写代码时踩坑。 示例一 先一起来看下这段代码,你感觉有没有问题呢? type IPeople interface { hello() } type People struct { } func (p *People) hello() { fmt.Println("github.com/meetbetter") } func errFunc1(in int) *People { if in == 0 { fmt.Println("import...阅读全文

博文 2019-08-05 10:34:23 CodeWithTxT

golang flag 命令行参数解析

基础例子 // 注册参数 port := flag.Int("p", 8080, "server Port") // 解析参数, 模块方法将使用 os.Args[1:] 做参数解析 flag.Parse() fmt.Printf("server port:%d", port) 基础类型 Flag 单条flag信息 type Flag struct { Name string // flag在命令行中的名字 Usage string // 帮助信息 Value Value // 要设置的值 DefValue string // 默认值(文本格式),用于使用信息 } FlagSet flag 设置对象 type FlagSet struct { // Usage函数在解析flag出现错误时会被调...阅读全文

博文 2019-07-30 03:32:40 直立猿

2017双11技术揭秘—分布式缓存服务Tair的热点数据散列机制

摘要: Tair是阿里巴巴集团自研的弹性缓存/存储平台,在内部有着大量的部署和使用。Tair的核心组件是一个高性能、可扩展、高可靠的NoSQL存储系统。目前支持MDB、LDB、RDB等存储引擎。本文基于Tair的存储和访问原理,对缓存的读写热点问题进行讨论,并给出一个满足现阶段需求的热点数据读写问题的解决方案。 作者:刘欢(浅奕) ![图片描述](http://img.blog.csdn.net/20171229113421675?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity...阅读全文

Go36-48,49-程序性能分析基础

程序性能分析基础 本篇讲的是Go程序的性能分析,下面提到的内容都是从事这项任务必备的一些知识和技巧。这些有助于我们真正理解以采样、收集、输出为代表的一系列操作步骤。 代码包 Go语言为程序开发者们提供了丰富的性能分析API,和非常好用的标准工具。这些API主要存在于下面三个包中: runtime/pprof net/http/pprof runtime/trace 另外,runtime包中还包含了一些更底层的API。这些都可以被用来收集或输出Go程序运行过程中的一些关键指标,并帮助我们生成相应的概要文件以供后续分析时使用。 标准工具 标准工具主要有: go tool pprof go tool trace 这两个工具,可以解析概要文件中的信息,并以人类易读的方式把这些信息展示出来。 go t...阅读全文

博文 2019-02-14 19:35:13 骑士救兵

Bytom交易说明(账户管理模式)

该部分主要针对用户使用bytom自带的账户模式发送交易 1、构建交易 API接口 build-transaction,代码api/transact.go#L120 以标准的非BTM资产转账交易为例,资产ID为全F表示BTM资产,在该示例中BTM资产仅作为手续费,该交易表示花费99个特定的资产到指定地址中。其中构建交易的输入请求json格式如下: { "base_transaction": null, "actions": [ { "account_id": "0ER7MEFGG0A02", "amount": 20000000, "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "t...阅读全文

博文 2018-08-22 10:35:01 比原链Bytom

深度解密Go语言之反射

反射和 Interface 息息相关,而 Interface 是我们上一篇文章的内容。在开始正文前,和大家说点题外话。 上一篇关于 Interface 的文章发出后,获得了很多的关注和阅读。比如,登上了 GoCN 的每日新闻第一条: 可能是编辑者觉得这篇文章称不上“深度解密”,把标题给小小地改动了下,哈哈~~ 在博客园登上了 48 小时阅读排行榜: 在开发者头条 APP (类似于今日头条,不过内容都是技术相关的,还挺有意思的)上收获了 150 收藏,并被推荐到首页最显眼的 banner 位置,阅读量达到了 1w 多,只是不知道这个数字是否是真实的,有点难以相信。 很多同学在后台向我反映文章太长了,不利于阅读,建议拆分一下。我非常理解,读屏时代,大家需要快速地读完全文,拿到收益。而码农桃花源的...阅读全文

博文 2019-06-03 23:32:42 Stefno

关注你所关注的 - Golang社区调研报告

Golang语言可以说现在炙手可热,大家熟悉的Kubernates 就是使用Golang开发的。我们在最近于伦敦和圣地亚哥举行的GopherCon大会上调查了1000多名开发者,以更好地了解Go 开发社区和对Go Module的总体看法。随着最近发布的Go 1.13版本,现在是向社区分享一些有趣数据的好时机。BTW, 在JFrog,我们也是Go开发者(JFrog CLI和Xray都是用Go编写的)。同时也是GoLang社区的贡献者, 并为社区维护贡献了公共注册中心Gocenter(goproxy)https://gocenter.io/. 加速Golang语言开发人员构建速度。以下是我们学到的一些关键的东西:Go开发人员是高度投入的绝大多数的Go开发者都在使用最新版本的GoLang。超过70...阅读全文

博文 2019-12-21 06:33:05 JFrog杰蛙科技

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

运维大神如何使用 Golang 日志监控应用程序

你是如何使用 Golang 日志监控你的应用程序的呢?Golang 没有异常,只有错误。因此你的第一印象可能就是开发 Golang 日志策略并不是一件简单的事情。不>支持异常事实上并不是什么问题,异常在很多编程语言中已经失去了其异常性:它>们过于被滥用以至于它们的作用都被忽视了。-- Nils 本文导航1、Golang 日志基础 使用 Golang “log” 库 2、为你 Golang 日志统一格式 JSON 格式的结构优势 标准化 Golang 日志 3、Golang 日志上下文的力量 4、 Golang 日志对性能的影响 不要在 Goroutine 中使用日志 使用异步库 使用严重等级管理 Golang 日志 5、集中化 Golang 日志 6、希望你享受你的 Golang 日志之旅 ...阅读全文

Golang 包和依赖管理

前言:这篇简单整理了一下golang的包管理相关内容。 一、package package是基本复用模块单元。 注:以首字母大小写来区分是否可被包外代码访问。 大写代表,可以被包外引入。 小写代表,不可被包外引入。 package名可以与目录名不一致。(但建议一致) 同一目录下的Go文件,必须属于同一个package。 PS:在终端下,输入go env,可获得go的环境信息。 操作步骤: 第一步:我们要配置GoPath。将我们的工程路径写入GoPath内。 打开终端并输入: vim ~/.bash_profile 复制代码配置GoPath,例如: export GOPATH="/Users/Liu/go:/Users/Liu/Documents/VSCode/go_learning" exp...阅读全文

博文 2020-03-08 12:34:24 奇舞647

Kubernetes之ingress controller--contour

contour 是基于envoy实现的kubernetes ingress controller。除了支持官方的Ingress对象,Ingress对象一直没有处于beta阶段,发展比较慢,无法满足实际生产使用,社区通过注解的方式扩展,以表达HTTP路由缺少的属性。 而且还支持了HTTPProxy 。HTTPProxy 是通过自定义资源定义(CRD)的方式扩展Ingress API的功能,以提供更丰富的用户体验,并解决后者在多租户环境中使用的限制。 有如下的优势: 安全地支持多团队Kubernetes集群,并能够限制哪些命名空间可以配置虚拟主机和TLS凭据。 允许包括来自另一个HTTPProxy(可能在另一个命名空间中)的路径或域的路由配置。 在一条路由中接受多种服务,并在它们之间负载均衡流量...阅读全文

博文 2020-01-27 11:32:39 iyacontrol

兄弟连区块链教程以太坊源码分析chain-indexer区块链索引二

Start方法。 这个方法在eth协议启动的时候被调用,这个方法接收两个参数,一个是当前的区块头,一个是事件订阅器,通过这个订阅器可以获取区块链的改变信息。 eth.bloomIndexer.Start(eth.blockchain.CurrentHeader(), eth.blockchain.SubscribeChainEvent) // Start creates a goroutine to feed chain head events into the indexer for // cascading background processing. Children do not need to be started, they // are notified about new e...阅读全文

博文 2018-10-19 11:34:46 兄弟连区块链培训

Kafka两级调度实现分布式协调任务分配Golang版

背景基于Kafka消息队列的两级协调调度架构Kafka内部为了协调内部的consumer和kafka connector的工作实现了一个复制协议, 主要工作分为两个步骤:通过worker(consumer或connect)获取自身的topic offset等元数据信息,交给kafka的broker完成Leader/Follower选举worker Leader节点获取到kafka存储的partation和member信息,来进行二级分配,实现结合具体业务的负载均衡分配从功能实现上两级调度,一级调度负责将Leader选举,二级调度则是worker节点完成每个成员的任务的分配主要是学习这种架构设计思想,虽然这种方案场景非常有限基于消息队列实现分布式协调设计一级协调器设计:一级协调器主要是指的Co...阅读全文

博文 2019-05-24 06:35:39 spring太难

Golang随谈——浅瞰底层:Go的并发调度模型

调度器分析 国内喜欢把Go的并发模型称为G-M-P模型,但在网上一查,貌似国外并没有这样的定义,他们喜欢直接称其为Go Scheduler——Go的调度器。不管如何,G-M-P都是Go调度器中的重要概念,它们都定义在sys/runtime/runtime2.go文件中,让我们看看它们都代表什么吧: G for Goroutine,定义于struct g,其存放着Goroutine的状态信息,如保存着Goroutine的执行堆栈信息、Goroutine的等待信息和变量的GC信息等信息。我们每用关键字go创建一个Goroutine,其在go程序的底层都创建了一个对应的G对象。 M for Machine,定义于struct m,对应着操作系统的工作线程,其和物理处理器线程对应,它负责任务的调度,...阅读全文

博文 2020-02-10 11:34:23 2hwang

好程序员大数据技术分享:Zookeeper集群管理与选举

大数据技术的学习,逐渐成为很多程序员的必修课,因为趋势也是因为自己的职业生涯。在各个技术社区分享交流成为很多人学习的方式,今天很荣幸找到好程序员大数据培训给我们分享一些大数据基础知识,大家可以一起学习!1.集群机器监控 这通常用于那种对集群中机器状态,机器在线率有较高要求的场景,能够快速对集群中机器变化作出响应。这样的场景中,往往有一个监控系统,实时检测集群机器是否存活。过去的做法通常是:监控系统通过某种手段(比如ping)定时检测每个机器,或者每个机器自己定时向监控系统汇报“我还活着”。 这种做法可行,但是存在两个比较明显的问题: 集群中机器有变动的时候,牵连修改的东西比较多。 有一定的延时。 利用ZooKeeper有两个特性,就可以实时另一种集群机器存活性监控系统: 客户端在节点 x 上...阅读全文

Golang中的反射

简单理解golang中的反射机制 假如把语言的运行时环境看做集市 角色信息必然保存在某个地方 代码运行环境 代码原型 代码原型中t和v的打印结果 获取t指针所指向的对象 获取t指针所指向对象的方法 相对于t来说v是什么 获取v所指向对象的方法 动态方法调用 小结 参考 假如把语言的运行时环境看做集市 假如把语言的运行时环境看做集市,在Ruby语言里,你能够在这个集市里认清楚所有的角色。这是Ruby作为动态语言的一个特性,在运行时环境,Ruby保存了对象的所有元数据,所以开发人员能清楚地列出对象的属性、方法等。 那么,Golang作为一种类C语言的静态语言,通过什么样的机制来识别运行时集市中的角色的呢? 角色信息必然保存在某个地方 如果想识别运行时集市中的角色,其角色信息必然保存在某个地方。有...阅读全文

博文 2019-06-13 21:42:21 敬维

基于consul构建golang系统分布式服务发现机制

文地址-石匠的Blog: http://www.bugclosed.com/post/5 在分布式架构中,服务治理是一个重要的问题。在没有服务治理的分布式集群中,各个服务之间通过手工或者配置的方式进行服务关系管理,遇到服务关系变化或者增加服务的时候,人肉配置极其麻烦且容易出错。 之前在一个C/C++项目中,采用ZooKeeper进行服务治理,可以很好的维护服务之间的关系,但是使用起来较为麻烦。现在越来越多新的项目采用consul进行服务治理,各方面的评价都优于ZooKeeper,经过几天的研究,这里做一个总结。 zookeeper和consul比较 开发语言方面,zookeeper采用java开发,安装的时候需要部署java环境;consul采用golang开发,所有依赖都编译到了可执行程序...阅读全文

博文 2018-07-26 14:30:00 williamjie

剥开比原看代码10:比原是如何通过/create-key接口创建密钥的

作者:freewind 比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 在前一篇,我们探讨了从浏览器的dashboard中进行注册的时候,密钥、帐户的别名以及密码,是如何从前端传到了后端。在这一篇,我们就要看一下,当比原后台收到了创建密钥的请求之后,将会如何创建。 由于本文的问题比较具体,所以就不需要再细分,我们直接从代码开始。 还记得在前一篇中,对应创建密钥的web api的功能点的配置是什么样的吗? 在API.buildHandler方法中: api/api.go#L164-L244 func (a *API) buildHandler() { // ... ...阅读全文

博文 2018-07-23 15:34:52 比原链Bytom

Golang的反射reflect深入理解和示例

编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。 每种语言的反射模型都不同,并且有些语言根本不支持反射。Golang语言实现了反射,反射机制就是在运行时动态的调用对象的方法和属性,官方自带的reflect包就是反射相关的,只要包含这个包就可以使用。 多插一句,Golang的gRPC也是通过反射实现的。 interface 和 反射 在讲反射之前,先来看看Golang关于类型设计的一些原则 变量包括(type, value)两部分 理解这一点就知道为什么ni...阅读全文

博文 2018-10-10 19:34:46 豆瓣奶茶

golang 编写的在线redis 内存分析工具 rma4go

redis 内存分析工具 rma4go redis是一个很有名的内存型数据库,这里不做详细介绍。而rma4go (redis memory analyzer for golang) 是一个redis的内存分析工具,这个工具的主要作用是针对运行时期的redis进行内存的分析,统计redis中key的分布情况, 各种数据类型的使用情况,key的size,大key的数量及分布, key的过期状况分布等一些有助于定位redis使用问题的工具,希望这能够给应用开发者提供便利排查生产中所遇到的实际问题。 rma4go的应用场景 redis是目前很流行的一个内存型数据库,很多企业都在使用。 但由于业界并没有很多对于redis使用上的规范,或者是有一些规范并没有被很好的遵循, 存在很多redis使用上的问题...阅读全文

博文 2018-12-17 11:34:45 winjeg

剖析nsq消息队列(二) 去中心化源码解析

在上一篇帖子剖析nsq消息队列(一) 简介及去中心化实现原理中,我介绍了nsq的两种使用方式,一种是直接连接,还有一种是通过nslookup来实现去中心化的方式使用,并大概说了一下实现原理,没有什么难理解的东西,这篇帖子我把nsq实现去中心化的源码和其中的业物逻辑展示给大家看一下。 nsqd和nsqlookupd的通信实现 上一篇中在启动nsqd时我用了以下命令,我指定了一个参数 --lookupd-tcp-address ./nsqd -tcp-address ":8000" -http-address ":8001" --lookupd-tcp-address=127.0.0.1:8200 --lookupd-tcp-address=127.0.0.1:7200 -data-path=....阅读全文

博文 2019-09-18 11:56:49 li-peng

区块链教程Fabric1.0源代码分析blockfile区块文件存储2

//构造blockIndex func newBlockIndex(indexConfig *blkstorage.IndexConfig, db *leveldbhelper.DBHandle) *blockIndex //获取最后一个块索引(或编号),取key为"indexCheckpointKey"的值,即为最新的区块编号 func (index *blockIndex) getLastBlockIndexed() (uint64, error) func (index *blockIndex) indexBlock(blockIdxInfo *blockIdxInfo) error //索引区块 //根据区块哈希,获取文件区块指针 func (index *blockIndex) g...阅读全文

博文 2018-10-11 15:35:09 兄弟连区块链培训

如何在Go的函数中得到调用者函数名?

有时候在Go的函数调用的过程中,我们需要知道函数被谁调用,比如打印日志信息等。例如下面的函数,我们希望在日志中打印出调用者的名字。 12345678func Foo() { fmt.Println("谁在调用我?") bar()}func Bar() { fmt.Println("谁又在调用我?")} 首先打印函数本身的名称 最简单的方式就是硬编码。 因为在编译之前,我们肯定知道打印的时候所在哪个函数,但是更好的方式是编写一个通用的函数,比如下面的例子: 123456789101112131415161718192021222324package mainimport ( "fmt" "runtime")func main() { Foo()}func Foo() { fmt.Printf(...阅读全文

博文 2018-12-23 21:24:43 smallnest

以太坊源码分析:fetcher模块和区块传播

前言 这篇文章从区块传播策略入手,介绍新区块是如何传播到远端节点,以及新区块加入到远端节点本地链的过程,同时会介绍fetcher模块,fetcher的功能是处理Peer通知的区块信息。在介绍过程中,还会涉及到p2p,eth等模块,不会专门介绍,而是专注区块的传播和加入区块链的过程。 当前代码是以太坊Release 1.8,如果版本不同,代码上可能存在差异。 总体过程和传播策略 本节从宏观角度介绍,节点产生区块后,为了传播给远端节点做了啥,远端节点收到区块后又做了什么,每个节点都连接了很多Peer,它传播的策略是什么样的? 总体流程和策略可以总结为,传播给远端Peer节点,Peer验证区块无误后,加入到本地区块链,继续传播新区块信息。具体过程如下。 先看总体过程。产生区块后,miner模块会发...阅读全文

博文 2018-11-17 13:34:43 大彬

Kafka 重平衡机制

微信公众号「后端进阶」,专注后端技术分享:Java、Golang、WEB框架、分布式中间件、服务治理等等。 当集群中有新成员加入,或者某些主题增加了分区之后,消费者是怎么进行重新分配消费的?这里就涉及到重平衡(Rebalance)的概念,下面我就给大家讲解一下什么是 Kafka 重平衡机制,我尽量做到图文并茂通俗易懂。 重平衡的作用 重平衡跟消费组紧密相关,它保证了消费组成员分配分区可以做到公平分配,也是消费组模型的实现,消费组模型如下: image.png 从图中可以找到消费组模型的几个概念: 同一个消费组,一个分区只能被一个消费者订阅消费,但一个消费者可订阅多个分区,也即是每条消息只会被同一个消费组的某一个消费者消费,确保不会被重复消费; 一个分区可被不同消费组订阅,这里有种特殊情况,加...阅读全文

博文 2019-10-31 20:33:01 aside section._1OhGeD

在 Ubuntu 14.04 中配置 Sublime Text 3 的 Golang 开发环境

1、下载 golang 并解压(这里以解压到 $HOME/golang/ 目录为例): http://www.golangtc.com/download 2、创建 GoPath 相关目录(这里以 $HOME/golang/projects/ 目录为例): mkdir ~/golang mkdir ~/golang/projects mkdir ~/golang/projects/3rdparty mkdir ~/golang/projects/3rdparty/bin mkdir ~/golang/projects/3rdparty/pkg mkdir ~/golang/projects/3rdparty/src mkdir ~/golang/projects/own mkdir ~/gol...阅读全文

博文 2018-08-13 14:31:34 Mirage520

reflect笔记

reflect使用和源码阅读的心得笔记。 TypeOf使用 package main import ( "fmt" "reflect" ) type S struct { A float64 `usage:"a"` B float64 `usage:"b"` c float64 `usage:"c"` } func (s *S) Add() float64{ return s.A + s.B } func (s *S) Del()float64{ return s.A - s.B } func main() { s := S{1.43,2.15,3.24} t := reflect.TypeOf(s)//利用unsafe.Pointer的特性将S类型反射为emptyInterface类型,e...阅读全文

博文 2019-02-01 15:34:43 Cedrus

Go36-21,22-panic函数、recover函数以及defer语句

panic panic,Go语言的另外一种错误处理方式。严格来讲,它处理的不是错误,而是异常,并且是一种在我们意料之外的程序异常。 panic详情 要分析panic详情,首先来生成一个panic。比如在一个切片里,它的长度是5,但是要通过索引5访问其中的元素,这样的访问是不正确的。比如下面这样: func main() { l := []int{1, 2, 3, 4, 5} _ = l[5] } 程序在运行时,会在执行到这行代码的时候抛出panic,提示用户索引越界了。这不仅仅是个提示。当panic被抛出后,如果没有在程序里添加任何保护措施的话,程序(或者说代表它的那个进程)会在打印出pinic的详细情况之后终止运行。下面是panic的详情: panic: runtime error: in...阅读全文

博文 2019-01-21 00:35:16 骑士救兵

golang反射

反射让我们能在运行期间弹指对象的类型信息和内存结构,甚至还能访问隐藏属性。 类型 获取对象类型 t.Name是真实类型 t.Kind是基础结构类型 package main import ( "fmt" "reflect" ) type B func(int) int func main() { var b B t := reflect.TypeOf(b) fmt.Println(t.Name(), t.Kind()) // B func } 构建对象 package main import ( "fmt" "reflect" ) func main() { a := reflect.ArrayOf(1, reflect.TypeOf(byte(0))) m := reflect.MapOf...阅读全文

golang interface 理解探究

golang interface 1.interface 由来 在很多oop语言中都有接口类型,java中的接口以及c++中的虚基类都是接口的实现。golang中的接口概念类似,但是它有自己的特点: 非侵入式 ducktype 泛型 隐藏具体实现 非侵入式     比如 Java 的 interface 实现需要显示的声明: public class MyWriter implements io.Writer {}     意味着对于接口的实现都需要显示的声明,在代码编写方面有依赖限制,同时需要处理包的依赖。而非侵入式接口只需实现其包含的方法即可: type IO struct {} func (io *IO) Read(p []byte) (n int, err error) {...} ...阅读全文

博文 2019-06-15 22:02:38 Zero

client-go客户端自定义开发Kubernetes及源码分析

介绍 client-go 是一种能够与 Kubernetes 集群通信的客户端,通过它可以对 Kubernetes 集群中各资源类型进行 CRUD 操作,它有三大 client 类,分别为:Clientset、DynamicClient、RESTClient。通过它,我们可以很方便的对 Kubernetes 集群 API 进行自定义开发,来满足个性化需求。 client-go 安装 client-go 安装很简单,前提是本机已经安装并配置好了 Go 环境,安装之前,我们需要先查看下其版本针对 k8s 版本 兼容性列表,针对自己本机安装的 k8s 版本选择对应的 client-go 版本,当然也可以默认选择最新版本,来兼容所有。 client-go 安装方式有多种,比如 go get、Gode...阅读全文

博文 2019-05-31 13:34:41 程序员同行者

gf框架之分页模块(三) - 静态分页

文章来源:http://gf.johng.cn/597433 静态分页是指页面的分页参数使用的是路由传参,这种场景下分页对象与Web Server的路由设计耦合性比较大。 示例如下: package main import ( "gitee.com/johng/gf/g/os/gview" "gitee.com/johng/gf/g/net/ghttp" "gitee.com/johng/gf/g/util/gpage" ) func main() { s := ghttp.GetServer() s.BindHandler("/page/static/*page", func(r *ghttp.Request){ page := gpage.New(100, 10, r.Get("page...阅读全文

博文 2018-05-21 12:34:38 John

golang笔记之接口(三)

实现接口的条件: 一个类型如果拥有一个接口需要的所有方法,那么这个类型就实现了这个接口。 例如,*os.File类型实现了io.Reader,Writer,Closer,和ReadWriter接口。*bytes.Buffer实现了Reader,Writer,和ReadWriter这些接口,但是它没有实现Closer接口因为它不具有Close方法。Go的程序员经常会简要的把一个具体的类型描述成一个特定的接口类型。举个例子,*bytes.Buffer是io.Writer;*os.Files是io.ReadWriter。 接口指定的规则非常简单:表达一个类型属于某个接口只要这个类型实现这个接口。所以: var w io.Writer w = os.Stdout // OK: *os.File ha...阅读全文

博文 2019-05-07 19:34:58 月下独酌100

gin是怎么处理请求的,源码分析

一.github上gin的 quick start package main import "github.com/gin-gonic/gin" func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080") } gin建立web服务的步骤: 1). 通过调用 gin.Default() 得到一个 *gin.Engine 2). 添加设置路由以及处理请求 3). 监听 8080端口...阅读全文

博文 2020-05-09 19:32:42 Bomb_

Golang 对MongoDB的操作简单封装

使用MongoDB的Go驱动库 mgo,对MongoDB的操作做一下简单封装 初始化 操作没有用户权限的MongoDB var globalS *mgo.Session func init() { s, err := mgo.Dial(dialInfo) if err != nil { log.Fatalf("Create Session: %s\n", err) } globalS = s } 如果MongoDB设置了用户权限需要使用下面的方法操作 func init() { dialInfo := &mgo.DialInfo{ Addrs: []string{dbhost}, //数据库地址 dbhost: mongodb://user@123456:127.0.0.1:27017 Ti...阅读全文

博文 2019-01-14 12:34:39 进阶默示录

go微服务框架go-micro深度学习(四) rpc方法调用过程详解

上一篇帖子go微服务框架go-micro深度学习(三) Registry服务的注册和发现详细解释了go-micro是如何做服务注册和发现在,服务端注册server信息,client获取server的地址信息,就可以和服务建立连接,然后就可以进行通信了。这篇帖子详细说一下,go-micro的通信协议、编码,和具体服务方法的调用过程是如何实现的,文中的代码还是我github上的例子: gomicrorpc go-micro 支持很多通信协议:http、tcp、grpc等,支持的编码方式也很多有json、protobuf、bytes、jsonrpc等。也可以根据自己的需要实现通信协议和编码方式。go-micro 默认的通信协议是http,默认的编码方式是protobuf,我就以默认的方式来分解他的...阅读全文

博文 2019-08-01 13:58:45 li-peng

[Go基础]Json在Go中的使用

前言 本文主要根据Go语言Json包[1]、官方提供的Json and Go[2]和go-and-json[3]整理的。 Marshal Marshal提供对数据进行Json序列化的功能: func Marshal(v interface{}) ([]byte, error) type Message struct { Name string Body string Time int64 } m := Message{"Alice", "Hello", 1294706395881547000} b, err := json.Marshal(m) //result b == []byte(`{"Name":"Alice","Body":"Hello","Time":12947063958815...阅读全文

博文 2019-08-29 03:32:45 TOMOCAT

1分钟将你的jenkins构建环境迁移到K8S集群上

资源准备1,稳定运行的K8S集群一套(没有可使用Rancher快速部署一个)2,Jenkins master一台3,Jenkins pipeline基础知识:见 链接jenkinspipeline传统Jenkins使用中暴露的问题1,每个业务团队使用的编译环境不统一,需要准备大量的slave节点2,Slave很多,空闲期(如夜里)资源浪费3,虽然Slave很多,但高峰期队列等待构建任务依然在排队,资源抢占严重4,构建任务多,workspace空间不足5,性能瓶颈,偶尔有slave节点内存泄漏问题将Jenkins的slave节点部署到K8S的原理K8S有pod的概念,一个pod内可以有多个container。通过每次构建时创建一个新的pod,挂载一个容器的slave节点的方式构建。构建后将构建...阅读全文

博文 2020-03-26 16:00:09 JFrogChina

【Zinx第二章-初识Zinx框架】Golang轻量级并发服务器框架

【Zinx教程目录】Zinx源代码https://github.com/aceld/zinx (请拷贝网址,在浏览器打开[简书不让自动跳转])完整教程电子版(在线高清)-下载Zinx框架视频教程(框架篇)(完整版下载)链接在下面正文 Zinx框架视频教程(应用篇)(完整版下载)链接在下面正文 Zinx开发API文档Zinx第一章-引言Zinx第二章-初识Zinx框架Zinx第三章-基础路由模块Zinx第四章-全局配置Zinx第五章-消息封装 Zinx第六章-多路由模式 Zinx第七章-读写分离模型 Zinx第八章-消息队列及多任务 Zinx第九章-链接管理 Zinx第十章-连接属性设置 【Zinx应用案例-MMO多人在线游戏】(1)案例介绍(2)AOI兴趣点算法(3)数据传输协议protoc...阅读全文

博文 2019-07-03 11:32:44 aceld

Go“一个包含nil指针的接口不是nil接口”踩坑

最近在项目中踩了一个深坑——“Golang中一个包含nil指针的接口不是nil接口”,总结下分享出来,如果你不是很理解这句话,那推荐认真看下下面的示例代码,避免以后写代码时踩坑。 示例一 先一起来看下这段代码,你感觉有没有问题呢? type IPeople interface { hello() } type People struct { } func (p *People) hello() { fmt.Println("github.com/meetbetter") } func errFunc1(in int) *People { if in == 0 { fmt.Println("importantFunc返回了一个nil") return nil } else { fmt.Prin...阅读全文

博文 2019-08-04 10:32:38 CodeWithTxT

为什么区块链是不可篡改的

区块链的数据结构是由包含事务信息的块按远近顺序排列的。块按远近顺序在这个链中链接,每个块都指向前面的块。 区块链通常被视为一个垂直堆栈,第一个块是堆栈底部的第一个块,然后将每个块放在前一个块的顶部。使用堆栈将块依次堆叠的概念可视化之后,我们可以使用一些术语,如“高度”来表示块与第一个块之间的距离;和“top”或“top”表示新添加的块。 每个块头生成一个SHA256加密散列来生成散列值。使用这个散列值,可以标识区块链中相应的块。同时,每个块可以通过其块头的“父块哈希值”字段引用前一个块(父块)。更多区块链知识 也就是说,每个块头包含其父块散列值。这样,通过将每个块链接到相应父块的散列序列,就创建了一个返回到第一个块(创建块)的链。 虽然每个块只有一个父块,但它可以临时有多个子块。每个子块具有...阅读全文

博文 2019-11-21 16:02:41 真是很秃ran

77.利用js异步获取数据

由于页面在已经展开的某些情况下,需要通过用户操作来调用一些当前尚未获取的数据,这就会用到异步。 web上比较简单的做法,是使用一个iframe来取得相应的数据,并且在iframe的父窗口上获取iframe内页面的数据。 这里使用一个校验的例子。 用户端提供一个值,点击一个按钮去进行校验。这时候已经在同一个页面填写了大量的信息,所以不能整个页面跳转。通过异步的方式,在iframe内反馈回校验的结果,父窗口获取结果。(注意:由于iframe内页面数据可能需要一定的等待时间,父窗口需要监听iframe获取数据的状态,这里只做一个5秒钟的等待,没有真实实现监听) input框内返回异步加载的信息,通过点击button“检查” 来触发 /*取得当前填写的实物储位号的校验结果*/ function ch...阅读全文

博文 2019-03-01 07:34:41 厚土火烟

Prometheus vs Zabbix

一、开发语言zabbix 后端用 C 开发,界面用 PHP 开发,定制化难度很高。Prometheus 后端用 golang 开发,前端是 Grafana,JSON 编辑即可解决。定制化难度较低。二、集群规模zabbix 集群规模上限为 10000 个节点。Prometheus 支持更大的集群规模,速度也更快。三、能够监控的环境zabbix 更适合监控物理机环境。Prometheus 更适合云环境的监控,对 OpenStack,Kubernetes 有更好的集成。四、使用的数据库zabbix 监控数据存储在关系型数据库内,如 MySQL,很难从现有数据中扩展维度。Prometheus监控数据存储在基于时间序列的数据库内,便于对已有数据进行新的聚合。五、安装方式zabbix 安装简单,zabb...阅读全文

博文 2020-02-06 17:32:46 聖桀