最新 | 最热门 | 最高评价

+0  一个select死锁问题

Tag: Technical | Golang
老王 发于 2021年08月29日 21:12 | 点击: 323 | 展开摘要
话说前几天我遇到了一个死锁问题,当时想了一些办法糊弄过去了,不过并没有搞明白问题的细节,周末想起来便继续研究了一下,最终便有了这篇文章。

让我们搞一段简单的代码来重现一下当时我遇到的问题:

package main

import "sync"

func main() {
var wg sync.WaitGroup
foo := make(chan int)
bar := make(chan int)
closing := make(chan struct{})

查看全文: http://www.udpwork.com/item/18152.html

+0  在docker环境导入私有仓库的问题

Tag: Technical
老王 发于 2021年08月24日 15:45 | 点击: 343 | 展开摘要
最近我遇到了一个在 docker 环境导入私有仓库的问题:一个 Golang 项目,使用 gitlab ci 来发布,通过 gitlab runner 调用 docker-compose 来打包,但是在构建时失败了。

让我们重回案发现场,看看问题是怎么产生的:

首先是 .gitlab-ci.yml 文件,其相关代码片段内容如下:

build_job:
stage: build
script:
- make docker-build

然后是 Makefi

查看全文: http://www.udpwork.com/item/18131.html

+0  记又一次对Makefile的重构

Tag: Technical | AWK
老王 发于 2021年08月21日 14:34 | 点击: 209 | 展开摘要
我平常有一个习惯,就是不断看以前写的代码,想着有没有哪些方面可以改进,如果每天能把代码可读性量变​ 1%,那么日积月累就是质变:前些天我们写过一次对 Makefile 的重构,去掉了一处重复代码的坏味道,没过多久我便又发现了一处重复代码的坏味道,本文就让我们看看如何消灭它!

让我们先把问题的来龙去脉搞清楚,在 Golang 项目里,一般推荐在根目录创建一个名为 tools.go 的文件,里面记录本项目依赖的相关工具,比如我的某个项目的 tools.go 如下:

// +b

查看全文: http://www.udpwork.com/item/18132.html

+0  记一次对Makefile的重构

Tag: Technical
老王 发于 2021年08月19日 15:53 | 点击: 150 | 展开摘要
如果你不了解 Makefile 的话,那么推荐看看阮一峰的文章「Make 命令教程」。本文通过一个重构的例子带你写出味道更好的 Makefile,让我们开始吧!

假设有一个名为 foo 的项目,用 golang 开发,在 docker 上部署,其 Makefile 如下:

APP = $(shell basename ${CURDIR})
TAG = $(shell git log --pretty=format:"%cd.%h" --date=short -1)

.P

查看全文: http://www.udpwork.com/item/18133.html

+0  关于OCR项目的流水账

Tag: Technical
老王 发于 2021年08月16日 16:58 | 点击: 147 | 展开摘要
最近一直在开发某个 OCR 项目:底层用的是 ABBYY 提供的 FineReader 引擎,应用层把 FineReader 包装成 gRPC 对外提供服务,因为 FineReader 项目是 C++ 实现的,而我们团队使用的编程语言是 Golang,所以二者间通过 CGO 来完成交互。整个项目没有什么特殊的需求,只是鉴于 OCR 耗时较长,为了提升产品体验,要求在处理过程中:客户端可以主动退出;服务端能够实时返回已处理百分比。下面是根据需求画出来的流程图:

流程图

看上

查看全文: http://www.udpwork.com/item/18134.html

+0  浅谈K8S下gRPC负载均衡问题

Tag: Technical
老王 发于 2021年07月14日 17:21 | 点击: 143 | 展开摘要
一般来说,在 K8S 下部署服务是很简单的事儿,但是如果部署的是一个 gRPC 服务的话,那么稍不留神就可能掉坑里,个中缘由,且听我慢慢道来。

在 K8S 下部署服务,缺省情况下会被分配一个地址(也就是 ClusterIP),客户端的请求会发送给它,然后再通过负载均衡转发给后端某个 pod:

ClusterIP

如果是 HTTP/1.1 之类的服务,那么 ClusterIP 完全没有问题;但是如果是 gRPC 服务,那么 ClusterIP 会导致负载失衡,究其原因,是

查看全文: http://www.udpwork.com/item/18007.html

+0  实战CGO

Tag: Technical | Golang
老王 发于 2021年07月03日 14:55 | 点击: 154 | 展开摘要
某项目要集成 PDF 文件的 OCR 功能,不过由于此功能技术难度太大,网络上找不到靠谱的开源实现,最终不得不选择 ABBYY FineReader Engine 的付费服务。可惜 ABBYY 只提供了 C++ 和 Java 两种编程语言的 SDK,而我们的项目采用的编程语言是 Golang,此时通常的集成方法是使用 C++ 或 Java 实现一个服务,然后在 Golang 项目里通过 RPC 调用服务,不过如此一来明显增加了系统的复杂度,好在 Golang 支持 CGO,让

查看全文: http://www.udpwork.com/item/18008.html

+0  浅谈pprof

Tag: Technical | Golang
老王 发于 2021年06月06日 15:37 | 点击: 185 | 展开摘要
对于大多数 Gopher 而言,一般平时最主要的工作内容除了实现各种无聊的业务逻辑之外,剩下的就是解决各种琐碎的问题。比如:查询性能瓶颈在哪里?查询内存泄漏在哪里?好在 pprof 是处理此类问题的利器,共有两套标准库,分别适用于不同的场景:

runtime/pprof:采集工具型应用运行数据进行分析

net/http/pprof:采集服务型应用运行时数据进行分析

命令行工具「go test」就包含了 runtime/pprof,相关参数请参考「go help test

查看全文: http://www.udpwork.com/item/17913.html

-1  浅谈NATS消息系统

Tag: Technical
老王 发于 2021年05月21日 19:07 | 点击: 797 | 展开摘要
我用过很多消息系统,比如:简单的 Redis Streams;高效的 Kafaka 等等,不过自从我把编程语言切换到 Golang 以后,总觉得必须找个用 Golang 开发的消息系统才配得上门当户对,原本我已经和小家碧玉的 NSQ 厮守终生,不过当我认识了上流社会 CNCF 钦定的大家闺秀 NATS 后,刹那间就仿佛徐志摩遇到了林徽因,扭头就给结发妻子写了休书。

INSTALLATION

服务端 nats-server,客户端 nats,监控工具 nats-top,性能

查看全文: http://www.udpwork.com/item/17711.html

+0  浅谈微服务

Tag: Technical | microservices
老王 发于 2021年05月11日 13:46 | 点击: 215 | 展开摘要
虽说微服务早已是一个老生常谈的话题了,在 infoq 或者 thoughtworks 上可以找到很多案例,不过可惜的是其中相当比例的案例是失败的案例,究其原因,除了技术门槛之外,主要是因为很多人脱离了实际情况,只是为了微服务而微服务。本文通过一个例子带领大家从头到尾体验一下微服务的演化过程,不仅要做到知其然,更要做到知其所以然。

假设我们正在开发一个在线购物项目,其主要功能包括商城、推荐、评论、用户等,它是一个典型的单体架构:不同团队的技术人员工作在同一个版本库上,系统功能

查看全文: http://www.udpwork.com/item/17712.html

+0  浅谈配置文件

Tag: Technical | Kubenetes
老王 发于 2020年12月28日 08:58 | 点击: 216 | 展开摘要
很少有人关注配置文件,但它绝对是一个值得讨论的问题。

一个常见问题是:如何处理不同环境下不同的配置?传统的解决方案是为每个环境都单独设置一个配置文件,比如 rails 项目里一般会有 development、production、test 等几个配置文件,不过此方法不易扩展:更多部署意味着更多新的环境,随着项目的不断深入,开发人员可能还会添加他们自己的环境,这将导致各种配置组合的激增,从而给管理部署增加了很多不确定因素,此外,直接在文件中保存配置的话,如果有用户名密码等敏感

查看全文: http://www.udpwork.com/item/17713.html

+0  实战etcd的服务发现

Tag: Technical | ETCD | Golang
老王 发于 2020年11月17日 21:17 | 点击: 227 | 展开摘要
在云原生的时代,服务发现已经是必不可少的功能,我借着最近迁移 gRPC 服务的机会尝试了一下如何用 etcd 实现服务发现,期间遇到诸多问题,本文逐一记之。

虽然 gRPC 并没有内置 etcd 的服务发现功能,但是它提供了相关接口让我们扩展:

// Builder creates a resolver that will be used to watch name resolution updates.
type Builder interface {
// Buil

查看全文: http://www.udpwork.com/item/17714.html
|<<<1234567>>>| 一共16页, 185条记录