#golang

阅读 Sniper 源码实现,学习 Golang 中重载机制的实现

Published at August 31, 2019 ·  1 min read

Sniper 是 Bilibili 开源的一款轻量级业务框架,通过阅读其代码,可以学习到很多优秀的设计理念,这里学习的主要是其中 cmd/server/main.go 中关于停止、重载的设计,首先利用 viper.OnConfigChange 函数监听配置文件,发生更改后,则向 reload channel 发送消息,通过 signal.Notify(stop, syscall.SIGTERM, syscall.SIGINT, syscall.SIGHUP) 监听 syscall.SIGTERM, syscall.SIGINT, syscall.SIGHUP 三个信号,并将其发送给 stop channel。其后在 for loop 循环中,通过 select case 获取两个channel 中的消息,进行相应的重制、停止等操作。 func main() { reload := make(chan int, 1) stop := make(chan os.Signal, 1) conf.OnConfigChange(func() { reload <- 1 }) conf.WatchConfig() signal.Notify(stop, syscall.SIGTERM, syscall.SIGINT, syscall.SIGHUP) startServer() for { select { case <-reload: util.Reset() case sg := <-stop: stopServer() // 仿 nginx 使用 HUP 信号重载配置 if sg == syscall....


通过 Golang 学习 http,几行代码实现 http proxy

Published at August 30, 2019 ·  1 min read

这个 Github 作为通过 Golang 学习 http 中的其中一篇教程,非常简单明了。 其中关于 http proxy 代理用户校验部分代码如下,r.Header.Get("Proxy-Authorization") 从 request 的 header 中获取 ‘Proxy-Authorization’ 并将其通过 base64 解码获取用户名和密码进行校验。 若失败则直接将 http status code 通过 w.WriteHeader 返回给用户端。 func basicAuth(w http.ResponseWriter, r *http.Request, users []User) bool { var auth = r.Header.Get("Proxy-Authorization") if ms := strings.Split(auth, " "); len(ms) == 2 && ms[0] == "Basic" { // check user:password up, err := base64.StdEncoding.DecodeString(ms[1]) if err == nil { if ms := strings....


Essential Go Interview Questions

Published at August 16, 2019 ·  1 min read

Golang 基础的面试题,答案结合问题详细的解释 Golang 的技巧 Essential Go Interview Questions...


Go Defer Simplified with Practical Visuals

Published at August 15, 2019 ·  1 min read

详细的讲解了 defer 在 Golang 中的实现原理及各种特殊情况,当 defer 时,其传入的参数及被注册(运行),到程序结尾再执行 defer 中的代码。defer 按照 stack 的先进后出的原则,当有多个 defer 时,最开始的 defer 最后执行 Go Defer Simplified with Practical Visuals...


React Native: Why and How to Build Your Native Code in Go

Published at July 20, 2019 ·  1 min read

利用 gomobile 将 Golang 代码分别部署到 iOS 和 Android,同时借助 React Native 编写界面的便捷性,在 RN 中调用 Golang 函数,可以实现底层同样的一套代码同时在 iOS 和 Android 运行,UI 层也可以实现复用同样一套代码 React Native: Why and How to Build Your Native Code in Go...


Struct vs. Class In Swift Explained – LearnAppMaking

Published at June 25, 2019 ·  1 min read

swift 同时有 struct 和 class 两种类型,在 Python 中只有 class,在 Golang 中只有 struct ,而swift 似乎是把两种语言一种类似的类型均融合了。相同之处是,struct 和 class 均可以定义属性和方法,均有 init 以进行状态的初始化。不同的是,class 可以继承,也可以定义 deinitialized 实现在 class 销毁时调用某个函数 Struct vs. Class In Swift Explained – LearnAppMaking...


Linux Signal及Golang中的信号处理

Published at June 12, 2019 ·  1 min read

Linux 和 Golang 中的信号处理问题,在 Linux 中,则是操作系统中用来进程间通讯的一种方式,一个信号就是一个异步的通知,发送给某个进程,或者同进程的某个线程,当信号发送给某个进程时,操作系统会中断该进程的正常流程,并进入相应的信号处理函数执行操作,完成后再回到中断的地方继续执行。几个常见命令为,SIGINT 导致进程结束,SIGTSTP 导致进程挂起,SIGQUIT 导致进程结束 和 Dump core。在 Golang 中,则是通过 os/signal 和 syscall 捕捉到相应的信号量 Linux Signal及Golang中的信号处理...


Build Your Own Container Using Less than 100 Lines of Go

Published at April 20, 2019 ·  1 min read

用 Golang 从零搭建 Docker,关键概念分别是,Namespaces,将 container 与 host 的环境相互隔离,cgroups 管理 container 中的资源使用,Layered filesystem 是 docker 打包镜像时的管理技术,将镜像分层方便镜像的管理和复用 Build Your Own Container Using Less than 100 Lines of Go...



What is the difference between switch and select in Go?

Published at April 16, 2019 ·  1 min read

Golang 中 switch 和 select 的区别,最大的则是,switch 根据常规的状态进行判断,而 select 则是针对与 channel 一起使用,若无 default 时,则为阻塞 What is the difference between switch and select in Go?...


Achieving concurrency in Go

Published at April 6, 2019 ·  1 min read

Golang 中的 concurrency。关于 thread 与 goroutine 的对比较为详细。 线程/ thread 协程 / goroutine 系统的线程是由内核管理,有硬件依赖 goroutines 通过 Go 运行时管理,没有硬件依赖 系统线程通常有 1-2 MB 大小的固定堆栈 goroutines 在最新版的 Go 中通常是 8kb 大小的堆栈 堆栈大小在编译时及被决定,并且不能增加 堆栈大小由运行时进行管理,通过释放和分配新的堆栈可以增加到 1GB 在线程间没有方便的通信媒介 goroutine 通过 channels 进行低延时通信 (read more). 线程具有唯一的身份. 通过线程ID(TID)辨别在进程中的每个线程 goroutine 并没有任何唯一身份识别. 因为 Go 没有线程本地存储 TLS(Thread Local Storage). 线程有非常显著的创建和销毁成本,创建时需要向系统申请大量资源,并在销毁时将资源返还 goroutines 则是在运行时进行创建和销毁,这些操作相比于线程成本很低,因为 Go 运行时为 goroutines 维护了一个线程池....


Labels in Go

Published at April 5, 2019 ·  1 min read

label 在 Golang 中的用法,在 Python 没有接触过这种用法,在 Golang 见到略懵 Labels in Go...


百万 Go TCP 连接的思考: epoll方式减少资源占用

Published at March 11, 2019 ·  1 min read

百万 TCP 链接的文章,通过 epoll 减少资源开销,在设计思路上与 redis 类似,虽然单线程,但并不是瓶颈。 百万 Go TCP 连接的思考: epoll方式减少资源占用...


关于内网穿透frp程序的分析

Published at February 28, 2019 ·  1 min read

frp 原理的大致讲解,和花生壳之类的常见ddns 不同,这种方式是需要有一个中继服务器将对用户和本地的流量进行双向转发以实现内网穿透,与常见的 ddns 的优势也是非常明显,在复杂的网络环境中,比如多层 nat 中同样也可以使用。 关于内网穿透frp程序的分析...


shadowsocks-go源码阅读

Published at February 27, 2019 ·  1 min read

shadowsocks 源码分析,其中关键的部分 handleconnection 函数中通过 go ss.PipeThenClose(conn, remote) 和 ss.PipeThenClose(remote, conn) 进行 client 和 server 之间的数据交换,在之前的阅读源码中,并没有很好的理解其作用。 shadowsocks-go源码阅读...




Tags

abcs accept acid activemq affinity algorithm allocation android array async aws b+tree b-tree backoff benchmark best-practices bfs big-o bigquery bind bitcount blog break broker bubble buffer cache cap cert cgroups channel citus class classmethod cluster concurrency config consumer container cookie cors crawler cronjob csrf ctr data-science data-structure database datadog dataflow datascience decorator defer dfs distributed django dns docker double-shipping drf ecosia elastic-search enumerate epoll extra facebook-pixel financial-report flask flutter forward-proxy freelance frp garbage-collector gc gcp generator get gil git golang goroutine graphql ha handbook haproxy hash hash-slot hashring hashtable hpa http http-auth http-proxy http_proxy https index innodb instagram intergration interview ios javascript jinja2 jobboard jwt k8s kafka kibana kqueue label lambda layer4 layer7 lean levels.io linked-list linux list listen loadbalancer logs long-tail lru marketing master matplotlib memory merge metaclass metaprogramming metrics metrics-server microservices mitm model mq myisam mysql namespace nat netflix network-extension nginx nodejs nomad nosql npm oodesign openssl optimization orm pandas parallelism parkinglot patroni permission pg pipeline pixelme post postgresql postresql prefetch_related prerender process proxy proxycommand put pvm python queue rabbitmq rbac react-native rebase redis redis-cluster replication resource rest restfulapi retargeting retry revenue reverse-proxy rocketmq saas scaleable search-engine security select seo serverless service session set shadosocks shadowsocks shard sharding shell shopify sigint signal sigterm slack slave slow-query sniper sns socket socks5 source-code spa sql sqlalchemy sqs ssh ssl ssl-pinning stack startup state stateful stateless staticmethod string struct swift switch syscall system-design systemctl tcp tcp-proxy thread tmpreaper token traefik trustkit tunning type typeform udp variable vc vpn vuejs web web-development where yarn zset 削峰 宽索引 异步 窄索引 解耦 跨域 跳板机


Archives

2019 (137)
0001 (1)