自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

倚天码农的博客

不堆砌术语,不罗列架构,不迷信权威,不盲从流行,坚持独立思考

  • 博客(32)
  • 收藏
  • 关注

原创 从代码的视角深入浅出理解DevOps

对于DevOps的理解大家众说纷纭,就连维基百科(Wikipedia)都没有给出一个统一的定义。一般的解释都是从字面上来理解,就是把开发(Development)和运维(Operations)整合到一起,来加速产品从启动到上线的过程,并使之自动化。这个是对DevOps的广义解释,而且大多数人都是认可的。但这个解释太宽泛了,几乎包括了IT的所有内容,使之没有太大意义。 而DevOps是近几年才兴起的...

2019-11-14 15:50:05 1700 1

原创 微服务的数据库设计

单独的数据库:微服务设计的一个关键是数据库设计,基本原则是每个服务都有自己单独的数据库,而且只有微服务本身可以访问这个数据库。它是基于下面三个原因。优化服务接口:微服务之间的接口越小越好,最好只有服务调用接口(RPC或消息),没有其他接口。如果微服务不能独享自己的数据库,那么数据库也变成了接口的一部分,这大大拓展了接口范围。错误诊断:生产环境中的错误大部分都是和数据库有关的,要么是数据出了...

2019-10-19 09:14:13 8431 7

原创 微服务之间的最佳调用方式

在微服务架构中,需要调用很多服务才能完成一项功能。服务之间如何互相调用就变成微服务架构中的一个关键问题。服务调用有两种方式,一种是RPC方式,另一种是事件驱动(Event-driven)方式,也就是发消息方式。消息方式是松耦合方式,比紧耦合的RPC方式要优越,但RPC方式如果用在适合的场景也有它的一席之地.耦合的种类:我们总在谈耦合,那么耦合到底意味着什么呢?时间耦合:客户端和服务端必须同...

2019-09-20 15:37:10 28031 5

原创 Go微服务全链路跟踪详解

在微服务架构中,调用链是漫长而复杂的,要了解其中的每个环节及其性能,你需要全链路跟踪。 它的原理很简单,你可以在每个请求开始时生成一个唯一的ID,并将其传递到整个调用链。 该ID称为CorrelationID,你可以用它来跟踪整个请求并获得各个调用环节的性能指标。简单来说有两个问题需要解决。第一,如何在应用程序内部传递ID; 第二,当你需要调用另一个微服务时,如何通过网络传递ID。

2019-09-06 20:26:14 7314 1

原创 清晰架构(Clean Architecture)的Go微服务—重大升级

去年,我创建了一个清晰架构(Clean Architecture)微服务框架,它功能强大,但有些重。我写了一个系列文章来讲述它,请参阅"清晰架构(Clean Architecture)的Go微服务"。 我还指出了设计中存在的一些缺陷,并讲到希望以后能修复它们。现在我终于有时间对它进行了改造,结果比我预期的还要好。我所做的改动不大,但效果惊人。主要的项目结构和接口没有变,我在那些文章中写的大部分内容仍然有效。这次升级修复了旧框架中的所有主要问题。现在它几乎拥有了我理想框架中的所有内容。它是一个轻量级的,但功

2020-07-24 17:10:55 1052 5

原创 事件驱动的微服务-创建第三方库

本篇是我的事件驱动的微服务系列的第三篇,主要讲述如何在Go语言中创建第三方库。如果想要了解总体设计,请看第一篇"事件驱动的微服务-总体设计"。在Go语言中创建第三方库是为了共享程序,做起来并不困难,不过你需要考虑如下几个方面:第三方库的对外接口第三方库的内部结构如何处理配置参数如何扩充第三方库我们用日志做例子讲述如何创建第三方库。Go语言有许多第三方日志库,它们各有优缺点。我在"清晰架构(Clean Architecture)的Go微服务: 日志管理" 中讲到了“ZAP”是迄今为止我发现的最

2020-07-21 16:09:17 477

原创 一个可以自我进化的微服务框架

本文介绍了一个能够自我进化的轻量级的清晰架构框架。当创建一个新项目时你可以从最简单的轻量级的框架开始。当此项目不断发展变得复杂时,框架可以自我进化为一个功能强大的重量级框架。在此过程中,不需要更改任何业务代码。目前它有三种模式,分别是初级模式,增强模式和高级模式。最复杂的是高级模式,它基于依赖注入,非常强大。我创建了三个简单的应用程序来说明展示如何使用它,每个程序对应一种模式。

2020-06-28 12:20:12 1461 1

原创 一个非侵入的Go事务管理库——工作原理

我对去年写的事务管理代码进行了升级,使其成为一个非侵入式的轻量级事务管理库。当你使用它时,只需要在应用程序中额外增加两三行代码就能搞定,所有其他代码都放在了事务管理库。它很好地将业务代码与数据库事务代码隔离开来,这样你的业务代码里就只有纯粹的业务逻辑。它是一个库而不是框架,所以不论你使用任何框架都可以使用它。本文讨论事务管理库的工作原理

2020-06-21 15:36:53 1104

原创 一个非侵入的Go事务管理库——如何使用

我对去年写的事务管理代码进行了升级,使其成为一个非侵入式的轻量级事务管理库。当你使用它时,只需要在应用程序中额外增加两三行代码就能搞定,所有其他代码都放在了事务管理库。它很好地将业务代码与数据库事务代码隔离开来,这样你的业务代码里就只有纯粹的业务逻辑。它是一个库而不是框架,所以不论你使用任何框架都可以使用它

2020-06-21 15:26:21 1048

原创 事件驱动的微服务-事件驱动设计

本篇是“事件驱动的微服务”系列的第二篇,主要讲述事件驱动设计。如果想要了解总体设计,请看第一篇"事件驱动的微服务-总体设计"程序流程我们通过一个具体的例子来讲解事件驱动设计。 本文中的程序有两个微服务,一个是订单服务(Order Service), 另一个是支付服务(Payment Service)。用户调用订单服务的用例createOrder()来创建订单,创建之后的订单暂时还没有支付信息,...

2020-04-16 14:37:25 1127

原创 事件驱动的微服务-总体设计

我在"微服务之间的最佳调用方式"中讲到了微服务之间的两种调用方式。微服务刚兴起时,大部分都是RPC的调用模式。我也写了一个RPC的架构,详情参见"清晰架构(Clean Architecture)的Go微服务"。但现在事件驱动的微服务越来越流行,因为大家觉得它是松耦合的。我会写一个新的系列来讲述如何构建事件驱动的微服务。本文是这个系列的第一篇,总体设计。本文通过一个具体的例子来讲解事件驱动微服务的...

2020-04-15 10:02:11 1778

原创 如何快速高效率地学习Go语言

要想快速高效率地掌握Go语言,关键是要通过不断写代码去训练,熟能生巧。方法是没问题的,但具体的路径呢?就像开车,能不能给个导航?我希望这篇文章能起到一个导航的作用,这里提供的路径,应该对很多人都适合。当然每个人的具体情况不同,因此路径会有差异。你可以对这个路径进行剪裁,得到最适合自己的。####目标(快速,高效率):短时间和高效率是这里的关键词。其实只要你每天用Go来编写程序,时间一长,也就掌...

2020-03-18 10:19:45 733

原创 清晰架构(Clean Architecture)的Go微服务

我用Go和gRPC创建了一个微服务项目,并试图找出最好的程序结构,它可以作为我其他项目的模板。我还将程序设计和编程的最佳实践应用于Go Microservice程序,例如清晰架构(Clean Architecture),依赖注入(Dependency Injection),日志记录,错误处理等。我有Java背景,并发现自己在Java和Go之间挣扎,它们之间的编程理念完全不同。我写了一系列关于在项目...

2020-02-17 09:32:23 2687

原创 清晰架构(Clean Architecture)的Go微服务: 编码风格

编码风格在编程中是一个相对乏味的主题,但是合适的编码风格对一个有效的程序员是至关重要的。 它有三个组成部分:程序结构 ( application layout)编码规则或风格命名约定我已经在清晰架构(Clean Architecture)的Go微服务: 程序结构¹中讨论了程序结构,因此本文将介绍后两点。编码规则或风格没有包级别(package level)变量。 ...

2020-02-03 09:08:38 1490

原创 清晰架构(Clean Architecture)的Go微服务: 事物管理

为了支持业务层中的事务,我试图在Go中查找类似Spring的声明式事务管理,但是没找到,所以我决定自己写一个。 事务很容易在Go中实现,但很难做到正确地实现。需求:将业务逻辑与事务代码分开。在编写业务用例时,开发者应该只需考虑业务逻辑,不需要同时考虑怎样给业务逻辑加事务管理。如果以后需要添加事务支持,你可以在现有业务逻辑的基础上进行简单封装,而无需更改任何其他代码。事务实现细节应该对业务逻...

2020-01-22 09:10:35 2357

原创 清晰架构(Clean Architecture)的Go微服务: 依赖注入(Dependency Injection)

在清晰架构(Clean Architecture)中,应用程序的每一层(用例,数据服务和域模型)仅依赖于其他层的接口而不是具体类型。 在运行时,程序容器¹负责创建具体类型并将它们注入到每个函数中,它使用的技术称为依赖注入²。 以下是要求。容器包的依赖关系:容器包是唯一依赖于具体类型和许多外部库的包,因为它需要创建具体类型。 本程序中的所有其他软件包主要仅依赖于接口。外部库可以包括DB和DB...

2020-01-16 09:50:38 1995

原创 清晰架构(Clean Architecture)的Go微服务: 程序容器(Application Container)

清晰架构(Clean Architecture)的一个理念是隔离程序的框架,使框架不会接管你的应用程序,而是由你决定何时何地使用它们。在本程序中,我特意不在开始时使用任何框架,因此我可以更好地控制程序结构。只有在整个程序结构布局完成之后,我才会考虑用某些库替换本程序的某些组件。这样,引入的框架或第三方库的影响就会被正确的依赖关系所隔离。目前,除了logger,数据库,gRPC和Protobuf(这...

2020-01-09 19:42:26 3099 2

原创 清晰架构(Clean Architecture)的Go微服务: 日志管理

良好的日志记录可以提供丰富的日志数据,便于在调试时发现问题,从而大大提高编码效率。 记录器提供的自动化信息越多越好,日志信息也需要以简洁的方式呈现,便于找到重要的数据。日志需求:无需修改业务代码即可切换到其他日志库不需直接依赖任何日志库整个应用程序只有一个日志库的全局实例,因此你可以在一个位置更改日志配置并将其应用于整个程序。可以在不修改代码的情况下轻松更改日志记录选项,例如,日志级...

2020-01-03 16:03:46 2088

原创 清晰架构(Clean Architecture)的Go微服务: 设计原则

我最近写了一个Go微服务应用程序,这个程序的设计来自三个灵感:清晰架构"Clean Architecture"¹ and SOLID (面向对象设计)² 设计 原则³Spring的容器技术(Spring’s application context)⁴Go的简洁设计⁵ 特别是 Go的面向对象的设计⁶我使用Spring的基于接口的编程和依赖注入(Dependency Injection...

2019-12-30 09:23:59 1808 1

原创 清晰架构(Clean Architecture)的Go微服务: 程序设计

我使用Go和gRPC创建了一个微服务,并将程序设计和编程的最佳实践应用于该项目。 我写了一系列关于在项目工作中做出的设计决策和取舍的文章,此篇是关于程序设计。程序的设计遵循清晰架构(Clean Architecture)¹。 业务逻辑代码分三层:用例(usecase),域模型(model)和数据服务(dataservice)。有三个顶级包“usecase”,“model”和“dataservi...

2019-12-26 09:10:22 2166 4

原创 清晰架构(Clean Architecture)的Go微服务: 程序结构

我使用Go和gRPC创建了一个微服务,并试图找出最佳的程序结构,它可以用作我未来程序的模板。 我有Java背景,并发现自己在Java和Go之间挣扎,它们之间的编程理念完全不同。我写了一系列关于在项目工作中做出的设计决策和取舍的文章。 这是其中的第一篇, 是关于程序结构的。程序结构的资源Go的标准程序结构的最佳资源可能是Github上的标准Go程序结构¹,但它不适合我的项目。在阅读了Sylvai...

2019-12-20 11:32:16 3313

原创 云原生开发环境初探

在上一篇“云原生的不同解释及正确含义”里,我们讲到了云原生的引申含义,就是开发环境也是云环境,这样就能保证开发环境和生产环境的一致性,使最终的部署顺利进行。本文就通过具体的例子来探讨云原生的开发环境。开发流程主要包括编写代码,程序部署和调试几个环节。每一个环节都需要相应的工具来帮助你提高效率。下面我们就来看一下如何搭建开发的云环境以及那些工具能帮你在云环境里提高开发效率。开发IDE以前的IDE...

2019-12-12 19:38:33 3767 1

原创 云原生的不同解释及正确含义

云原生的解释可以说五花八门,本文从不同角度探讨云原生的内涵以及如何从不同维度准确理解它的含义。云原生起源网上有些文章提到云原生是“Pivotal公司的Matt Stine于2013年首次提出云原生(CloudNative)的概念”。我搜索了英文“CloudNative”,阅读了首页的所有文章,里面没有一篇提到“Matt Stine首次提出云原生”,但它们每一篇都提到了“云原生计算基金会”的定义...

2019-12-12 19:27:55 4453

原创 用Helm3构建多层微服务

Helm是一款非常流行的k8s包管理工具。以前就一直想用它,但看到它产生的文件比k8s要复杂许多,就一直犹豫,不知道它的好处能不能抵消掉它的复杂度。但如果不用,而是用Kubectl来进行调式真的很麻烦。正好最近Helm3正式版出来了,比原来的Helm2简单了不少,就决定还是试用一下。结果证明确实很复杂,它的好处和坏处大致相当。有了它确实能大大简化对k8s的调式,但也需要花费比较多的时间来学习,而且...

2019-11-29 15:39:56 2903

原创 在容器上构建持续部署及最佳实践初探

要想理解持续集成和持续部署,先要了解它的部分组成,以及各个组成部分之间的关系。下面这张图是我见过的最简洁、清晰的持续部署和集成的关系图。图片来源持续部署:如图所示,开发的流程是这样的:程序员从源码库(Source Control)中下载源代码,编写程序,完成后提交代码到源码库,持续集成(Continuous Integration)工具从源码库中下载源代码,编译源代码,然后提交到运行库(R...

2019-11-08 10:00:30 3589 1

原创 在k8s上安装Jenkins及常见问题

持续集成和部署是DevOps的重要组成部分,Jenkins是一款非常流行的持续集成和部署工具,最近试验了一下Jenkins,发现它是我一段时间以来用过的工具中最复杂的。一个可能的原因是它需要与各种其它工具集成才能完成任务,而集成的方法又各不相同。在这些工具中,Docker是最简单的,真的非常好用。K8s比较复杂,开始要花些时间熟悉,但它的整体设计十分合理,一旦搞清核心概念,掌握脉络之后,就非常顺利...

2019-11-04 15:55:39 11262 7

原创 把应用程序迁移到k8s需要修改什么?

程序部署环境的容器化已经是大势所趋,微服务为容器化提供了广阔的应用舞台,k8s已经把Docker纳入为它的底层支撑容器引擎,一统江湖,成为了容器技术事实上的标准。一般的应用程序是不能直接拿来部署到容器上的,需要经过一些修改才能移植到k8s上。那么这些改动包括哪些内容呢?它主要有两个部分:第一部分是服务调用。不论是微服务之间的调用,还是微服务调用数据库或前端调用后端,调用的方式都是一样的。都需...

2019-10-26 16:38:57 3871 1

原创 创建优化的Go镜像文件以及踩过的坑

在Docker上创建Go镜像文件并不困难,但建立的文件很大,接近1G,使用起来不太方便。Docker镜像的一个主要难题就是如何优化,创建小的镜像。我们可以用多级构建的方法来创建Docker镜像文件,它也不复杂。但由于使用这种方法时,需要用简版的Linux(Alpine),它带来了一系列的问题。本文讲述如何解决这些问题并成功创建优化的Go镜像文件,优化之后只有14M。单级构建:我们用一个Go程序...

2019-10-24 08:11:23 3160 1

原创 通过搭建MySQL掌握k8s(Kubernetes)重要概念(下):参数配置

本文通过搭建MySQL环境来了解k8s的重要概念,包括持久卷,网络和参数配置。这是下篇,专门讲解参数配置。如果你有些地方不能完全看明白,请先看上篇"通过搭建MySQL掌握k8s(Kubernetes)重要概念(上):网络与持久卷"。配置参数:参数配置是K8s里比较重要的一个概念,它包含了下面三个部分:ConfigMap:是用来保存共享配置数据的。当你需要在不同的配置文件之间共享数据时,你可...

2019-10-12 09:52:46 3035 1

原创 通过搭建MySQL掌握k8s(Kubernetes)重要概念(上):网络与持久卷

上一篇"通过实例快速掌握k8s(Kubernetes)核心概念"讲解了k8s的核心概念,有了核心概念整个骨架就完整了,应付无状态程序已经够了,但还不够丰满。应用程序分成两种,无状态和有状态的。一般的前段和后端程序都是无状态的,而数据库是有状态的,他需要把数据存储起来,这样即使断电,数据也不会丢失。要创建有状态的程序,还需要引入另外一些k8s概念。它们虽然不是核心,但也很重要,共有三个,持久卷,网络...

2019-10-12 09:44:36 4957

原创 通过实例快速掌握k8s(Kubernetes)核心概念

容器技术是微服务技术的核心技术之一,并随着微服务的流行而迅速成为主流。Docker是容器技术的先驱和奠基者,它出现之后迅速占领市场,几乎成了容器的代名词。但它在开始的时候并没有很好地解决容器的集群问题。Kubernetes抓住了这个机遇,以容器编排者(Container Orchestration)的身份出现,对容器集群进行管理和调度,现在已经打败了Docker成为了容器技术事实上的标准。当然K8...

2019-10-05 09:56:27 6344 1

原创 Go微服务容错与韧性(Service Resilience)

服务韧性是微服务里非常重要的一项技术,它可以在服务环境不可靠的情况下仍能提供适当的服务,大大提高了服务的容错能力。它使用的技术包括服务超时 (Timeout),服务重试 (Retry),服务限流(Rate Limiting),熔断器 (Circuit Breaker),故障注入(Fault Injection)和舱壁隔离技术(Bulkhead)。你可以用代码也可以用Service Mesh来实现这些功能,Service Mesh是将来的方向。但实现它们需要大量的工作,因此需要考虑清楚到底哪些服务真正需要它们

2019-09-16 09:17:29 2126 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除