Dev's Logging

Welcome to my blog !


阅读 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 协议,如何用 Golang 实现 https 代理

Published at August 31, 2019 ·  1 min read

在 http.HandlerFunc 中检查 r.Method 为 Connect 后及将请求交给 handleTunneling,其中关键的是将 http.ResponseWriter 转换为 http.Hijacker 接管连接,并通过两个 goroutine transfer 复制请求。 func handleTunneling(w http.ResponseWriter, r *http.Request) { dst, err := net.DialTimeout("tcp", r.Host, 10*time.Second) if err != nil { http.Error(w, err.Error(), http.StatusServiceUnavailable) return } w.WriteHeader(http.StatusOK) hijacker, ok := w.(http.Hijacker) if !ok { http.Error(w, "Hijacking not supported", http.StatusInternalServerError) return } conn, _, err := hijacker.Hijack() if err != nil { http.Error(w, err.Error(), http.StatusServiceUnavailable) } go transfer(dst, conn) go transfer(conn, dst) } func transfer(dst io....

通过 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....

在长城宽带等某些垃圾宽带的网络环境下,通过 ssh 连接某些服务器经常会出现 timeout 的解决方法

Published at August 30, 2019 ·  1 min read

可在 .ssh/config 中配置以下命令,通过 ssh q 连接服务器。 HostName 为目标服务器 ip, -X 5 为 socks5 代理, localhost:6153 为 socks5 代理地址。 Host q HostName 47.240.33.24 User root ProxyCommand nc -X 5 -x localhost:6153 %h %p 与此方法类似的是,可以配置通过跳板机,在客户端直接访问内网服务器。jumper server 为跳板机,在正常情况下,处于内网环境的 target 服务器无法直接从客户端访问,需经过跳板机访问,此时,则可通过如下配置,在 Terminal 中运行 ssh target 访问跳板机后面的目标服务器。 Host target HostName 172.16.6.2 Port 35000 User root IdentityFile /Users/tonywang/target.key ProxyCommand ssh -q -W %h:%p jumperserver Host jumperserver HostName 192.168.1.2 Port 35000 IdentityFile /Users/tonywang/js.key User root ...

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...

Ecosia Financial Report

Published at July 31, 2019 ·  1 min read

ecosia 在五月份达到了将近 100 m pv / month,其月收入为 1347484 欧元,约合人民币为 1 千万元,营销费用为 219329 欧元,约合人民币 168万元,运营费用总计 290382 欧元,约合人民币 223 万元。其中包括薪水(39人,包括自由职业者)107821 欧元,约合人民币 83万元,雇佣税费(健康保险、社会保障、雇佣及公司税费)70694 欧元,约合 54 万元,其他税收 60000 欧元,约合人民币 46 万元,服务器域名费用 31032 欧元,约合人民币 23 万元,办公室 5287 欧元,约合人民币 4 万元,其他费用 9664 欧元,约合人民币 74179 元,差旅费用 5884 欧元,约合人民币 4.5 万元。 主要使用国家为法、德、英、美、比利时五个国家,占据将近 70% 的流量,1 亿的流量,月营收 1 千万,平均一个 pv 价值 0.1 人民币,223 百万的服务器费用支出,平均每次搜索的费用是 0.0223 人民币。 Ecosia Financial Report...

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...

How to Access a Remote Server Using a Jump Host

Published at June 19, 2019 ·  1 min read

通过配置 ssh config ,实现在本地快捷通过跳板机登陆目标服务器,与配置 ssh proxy 较为类似 How to Access a Remote Server Using a Jump Host...

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)