张子阳的博客

首页 读书 技术 店铺 关于
张子阳的博客 首页 读书 技术 店铺 关于

最新内容

十字军的故事:上

很早前看过一部电影,叫做《天国王朝》,讲的就是十字军东征的故事。当时觉得蛮震撼的,一方面震撼的是十字军大军出场时的宏大场面,至今还记得那句“耶城主军已到”,以及充满魄力的 “Withdraw,or we all die here”的台词。另一方面,也震撼于战争的残酷和十字军的暴虐,在东征时期残杀了那么多穆斯林。有时候也在想,当下穆斯林世界和西方社会的矛盾和冲突,是否和源于中世纪的十字军东征是否有所联系呢。现在西欧的穆斯林移民的大量涌入,以及欧洲西方人生育率低,而穆斯林普遍生好几个,甚至又有“西方和穆斯林必有一战”的言论出现。

发表: 2018-12-31 阅读: (70) 推荐: 难度:

Consul 注册服务和健康检查(http检查) - Part.5

在前面两篇文章中,我们对控制台类型的程序进行了服务注册,并以script脚本的方式进行了健康检查。这篇文章将介绍如何对Web类型的服务进行服务注册,并进行健康检查。

本文依然是采用配置文件的方式进行服务注册,以Http API进行注册的方式会在以后的文章中说明。

发表: 2018-12-27 阅读: (44) 分类: 分布式系统

Consul 健康检查(检查节点) - Part.4

在上一节 Consul 注册服务和健康检查(script检查) - Part.3 定义的两个健康检查中,chk_service1和chk_service2分别和服务datacollect.server1和datacollect.server2关联起来了。健康检查也可以不关联任何服务独立运行。例如,我们可以写一个健康检查的脚本,检查节点的内存,当内存占用低于70%时返回 通过,介于70%~90%之间时返回 警告,高于90%时返回失败。

发表: 2018-12-27 阅读: (26) 分类: 分布式系统

Consul 注册服务和健康检查(script检查) - Part.3

Consul提供的一个主要功能就是提供一个可用服务的列表,进行服务注册和发现。这在服务做负载均衡时非常有用,因为前端应用不再直接访问服务(可能访问到不可用的节点,例如节点宕机或者服务应用异常退出),而是先请求consul获取可用的服务列表,然后再访问服务。Consul则负责维护这个服务列表,并对列表中的服务进行健康检查。

发表: 2018-12-26 阅读: (26) 分类: 分布式系统

Consul 运行和查看Client - Part.2

Consul 安装和配置Server.html中,配置了3节点的server集群。接下来,这篇文章将部署一台Client,并查看它的运行状态。

发表: 2018-12-26 阅读: (35) 分类: 分布式系统

Consul 安装和配置Server - Part.1

在实践微服务的过程中,通常使用Consul来进行服务发现和健康检查。这篇文章简单介绍在Linux(CentOS 7)下安装和配置一个3节点的Consul集群。

发表: 2018-12-25 阅读: (59) 分类: 分布式系统

Go Tips: 定时更新日志的输出位置

Go语言自带的log package非常简单和易用,只要在启动程序的时候调用log.SetOutput配置日志文件的路径,然后通过调用log.Printf()、log.Panic() 等方法就可以将日志输出到文件了。然而,对于一些服务程序而言,当操作系统启动时就开始运行,那么所有日志都会输出到启动时配置的那个文件当中。实际应用中,为了查看方便,我们经常需要按时间来生成日志,比如每天生成一个日志。那么可以通过单独运行一个goroutine,定时检查日志的最后创建时间来重新调用log.SetOutput方法,从而设置新的日志输出路径。

发表: 2018-12-22 阅读: (11) 分类: Go 语言

Go Tips: 控制台输出进度条

有时候经常会有一些很小的需求,做一些工具应用,比如抓取网页、下载更新数据包等。对于耗时比较久的任务而言,最好是有一个进度显示,可以实时显示进度。下面的代码实现了这一功能,其主要的思想是通过“\r”符号,将光标挪至行首,然后进行输出,此时的输出就覆盖了之前的输出,从而实现实时动画的效果。

这个范例仅仅是一个demo,它还有严重的不足:它是单线程,并只刷新了一行的数据。而诸如下载或者抓取网页,通常都是多线程运行,那么就需要同时更新多行的进度条。此时,就不仅需要将光标挪至行首,还要挪到上一行或者前几行。这种操作的实现思想和这里是类似的,但是使用的特殊符号不同,不再是“\r”。具体可以参考这里:https://en.wikipedia.org/wiki/ANSI_escape_code

除了控制光标位置以外,还可以控制输出的颜色。但大多数时候,因为时间紧张的关系,在控制台的输出上都非常简单,当需要复杂的输出,就直接写log日志了。

发表: 2018-12-22 阅读: (17) 分类: Go 语言

算法图解

算法是编程的基础,每隔一段时间就应当重温一下。算法的书大多比较艰涩,可能花很久还在看前两章,然后因为什么事情就中断了(往往是被其他更有趣的书所吸引),最后就烂尾了,再次拿起已经不知道是什么时候了。这本书则简单的多,如同书名所述,这本书包含了大量图片,使得理解更加方便。

发表: 2018-12-22 阅读: (68) 推荐: 难度:

架构整洁之道

又到了每年的双11,于是到京东看看有什么可买的书,就注意到了这本《架构整洁之道》。Bob大叔之前的几本书《代码整洁之道》和《敏捷软件开发》之前也都读过。这本是今年9月才出的新书,就立即买来读了。

全书近300页,分成了34篇文章,每一篇都比较短小,内容还是比较精炼的。通读过后,感觉相较于作者之前的书,没有太多新的内容,依然是以SOLID为基础,先对这些原则进行解释,再进行扩展和应用。

发表: 2018-11-30 阅读: (136) 推荐: 难度:

经济学原理:微观经济学

这本书在很久很久以前,大概是2008年,就读过一遍,那时候还是第4版。然后最近看另一本书《低欲望社会》,起初以为是一本关于社会学的书,看过之后才发现是一本经济学的书,很大篇幅都是对日本政策所造成的影响的解读。然而,我发现其中很多概念已经有些模糊,一些论证也一知半解了。所以我想有必要重新学习一下经济学基础,于是就又想起了这本《经济学原理》。因为新版已经出到了第7版,所以重新购买了第7版阅读。

发表: 2018-11-30 阅读: (119) 推荐: 难度:

Go中的Receiver和Method Sets

Go中没有class关键字,如果想将一组方法关联起来,除了将其放到同一个package下面以外,还有一种方式就是为方法指定receiver(receiver为某个类型),此时方法就与receiver类型关联起来了,有点类似于面向对象中类型方法的概念(但又很不同)。这篇文章介绍了指定receiver的两种方式以及相关的method sets概念。

发表: 2018-11-27 阅读: (32) 分类: Go 语言

Go反射指定执行方法的对象

在上一篇 Go反射动态创建对象 中,我们在末尾又提出了三个问题,其中最后一个是执行方法的对象,我们希望能够自行指定方法是在哪个对象上执行的。这篇文章将演示如何实现这一过程。因为这已经是同一个主题的第3篇文章了,因此我们快速地过一遍代码。

发表: 2018-11-22 阅读: (33) 分类: Go 语言

Go反射动态创建对象

在上一篇 Go使用反射动态调用方法 中,我们实现了动态调用方法,但是它存在着3个问题:缺乏参数校验、方法参型为静态构建和传递、多个参数类型需要保持一致。在这篇文章中,将会对这三个问题进行处理。

发表: 2018-11-22 阅读: (87) 分类: Go 语言

Go反射动态调用方法

反射是很多语言都提供的一种能力,它可以针对类型的元信息进行编程。例如获取类型的方法、字段、方法参数、方法返回值的信息。反射对于静态语言尤为重要,因为有了反射,可以使得静态语言变得"动态"一点。Go语言也提供了反射的能力,具体可以参考官方文章:The Laws of Reflection,以及reflect包的说明:Package reflect

这篇文章将实现一个常见的功能,即动态调用自定义struct的方法。

发表: 2018-11-21 阅读: (46) 分类: Go 语言

Kafka + Spark Stream实时WordCount

Word Count简直就是大数据届的hello world,所谓Word Count就是计算一行或者一段文本中英文单词的出现个数(英文单词以空格分隔)。这篇文章示范了如何使用Kafka + Spark Streaming来实现一个实时版本的Word Count。这个范例比较简单,仅仅有助于跑通流程。在实时运算时,一个很重要的问题就是:时间窗。比如说,统计实时的在线人数,当有新用户上线时,在线人数+1,但是过15分钟后,如果该用户的“最后活跃时间”仍是上线时间,那么此时就要去除它。

发表: 2018-10-28 阅读: (278) 分类: 大数据处理

Spark DataFrame解析json字符串

近期在做Spark Streaming方面的测试,从Kafka中实时取数据。此时接收到的数据是一段json数组形式的字符串,那么就需要将其解析为DataFrame的行数据,以方便进行实时运算。下面的代码示例演示了如何实现这个功能。

发表: 2018-10-22 阅读: (140) 分类: 大数据处理

Kafka Connect 实时读取MSSQL数据到Kafka

在处理实时数据时,需要即时地获得数据库表中数据的变化,然后将数据变化发送到Kafka中。这篇文章将介绍如何使用Kafka Connector完成这一工作。当获取实时数据时,数据源需要支持对数据变化进行反馈。不同的数据源采用了不同的技术和方法实现该功能,因为我们的业务数据库是MS SQL Server,因此这篇文章采用MSQL作为数据源。

发表: 2018-10-20 阅读: (702) 分类: 大数据处理

Kafka Connect 基本概念

搭建好了Kafka集群以后,最常见的两个需求就是:1、将数据从数据源采集并发送到Kafka的topic中;2、将数据从Kafka中取出,(进行运算后),然后再转存到其他的位置。完成这一工作,通常我们会使用各种语言的kafka库,调用相应的API,来完成读写kafka的操作。因为这种操作是非常常见的,因此kafka包含了一个名为Kafka Connect的组件,专门来完成这项工作。

发表: 2018-10-20 阅读: (184) 分类: 大数据处理

Spark 从文本创建DataFrame的3种方式

Spark Sql的核心对象DataFrame提供了Sql查询的能力,极大的方便了数据的查询和统计。如果要对DataFrame进行Sql查询,需要指定Scheme信息。而文本文件往往缺少Scheme信息,这篇文章将演示3种从文本文件创建DataFrame,并设置其Scheme的方式。

发表: 2018-10-19 阅读: (55) 分类: 大数据处理