最新 | 最热门 | 最高评价

+0  一个select死锁问题

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

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

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 | 点击: 685 | 展开摘要
最近我遇到了一个在 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 | 点击: 630 | 展开摘要
我平常有一个习惯,就是不断看以前写的代码,想着有没有哪些方面可以改进,如果每天能把代码可读性量变​ 1%,那么日积月累就是质变:前些天我们写过一次对 Makefile 的重构,去掉了一处重复代码的坏味道,没过多久我便又发现了一处重复代码的坏味道,本文就让我们看看如何消灭它!

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

// +b

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

+0  记一次对Makefile的重构

Tag: Technical
老王 发于 2021年08月19日 15:53 | 点击: 365 | 展开摘要
如果你不了解 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 | 点击: 363 | 展开摘要
最近一直在开发某个 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 | 点击: 409 | 展开摘要
一般来说,在 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 | 点击: 403 | 展开摘要
某项目要集成 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 | 点击: 396 | 展开摘要
对于大多数 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 | 点击: 1079 | 展开摘要
我用过很多消息系统,比如:简单的 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 | 点击: 418 | 展开摘要
虽说微服务早已是一个老生常谈的话题了,在 infoq 或者 thoughtworks 上可以找到很多案例,不过可惜的是其中相当比例的案例是失败的案例,究其原因,除了技术门槛之外,主要是因为很多人脱离了实际情况,只是为了微服务而微服务。本文通过一个例子带领大家从头到尾体验一下微服务的演化过程,不仅要做到知其然,更要做到知其所以然。

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

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

+0  编译 RenderDoc 的安卓 apk(带interceptor-lib)

Tag: Tech Notes
kxn 发于 2021年05月08日 21:23 | 点击: 373 | 展开摘要
之前做过一次结果没有做笔记,今天又想用了,发现当时的结果全都删了,浪费了一些时间。在这里做个笔记

RenderDoc 的安卓 APK 编译严格讲没啥难的,就是啰嗦。而且如果需要好的 hook 能力的话,需要编译 interceptor-lib,这个东西需要一个非常老版本的 llvm,编译这个 llvm 也非常啰嗦。

虽然理论上讲可以在 windows 上用 MSYS 之类的编译,但是为了避免啰嗦,我们还是老老实实用 Linux 吧,反正现在的 Windows 10 都能用

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

+0  Linux下解决同一硬盘因为连接设备不一样导致扇区大小不一致的问题

Tag: Tech Notes
kxn 发于 2021年03月14日 22:18 | 点击: 308 | 展开摘要
我有块硬盘放进了我家云盒子里面,前段时间想把这个硬盘拿出来插到电脑上面拷贝数据,结果发现分区表完全是乱的,分区变小了很多,在电脑上调整了分区表以后大小对了,放回我家云盒子,分区表又变得不合法了。

仔细研究了一下,发现硬盘直接接在电脑上面时候,扇区大小是 512 字节的,但是接在我家云盒子上面,扇区的大小是 4096 字节。之前有人说有些 USB 硬盘线也会造成这样的效果,大概也是相同的情况。分区表里面的单位都是按照扇区大小来计算的,所以分区大小自然也就不一样了

知道了这个

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