[Docker] 拆解我的網路服務

前言: 講了Docker半天,這一篇主要是記錄一下我把在用的一些Web Service全部放進Docker的紀錄,順便看看有沒有什麼地雷怕踩到的. 其實將自己的服務全部轉成Dockerize Services最重要的重點就是要能夠清楚了解--link的作用. 原先架構 稍微解釋一下原先架構: Go RPC: 主要處理接受一些API,連接MySQL MySQL: 主要的資料乘載 PHP: 裡面有數個Web Services,主要也是連接PHP 先從MySQL資料庫開始 資料庫沒有太多困難,由於可能會有資料庫的版本不同,所以做法會是: 啟動 MySQL Docker Container (版本自選或是最新) 導入資料庫SQL (空白或是有資料) docker run --name my-db -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql 這是一個基本的啟動最新版MySQL的Docker指令,其中也預設了root密碼. 可以使用-p 3306:3306來開放port出來給其他server連接.不過由於我們要使用--link,所以我們不需要用到export port來用.等等透過Go RPC Server來使用, 整合Go RPC Server 這邊其實不討論怎麼build go binary,而是假設你已經有個在ubuntu上面compile好的binary. docker run -p 8088:8088 --link my-db -it -v $BiaryADD:/rpc ubuntu /rpc/go-rpc-server 這一段程式碼會去執行ubuntu基本的image,主要是透過/rpc/go-rpc-server來執行已經build好的Go RPC Server binary. 開始串連各個microservixes,必須搞懂--link 如果你要用--link my-db在新的container上的話,那麼你的Go DB Connection 應該要類似以下的Go: sql.Open("mysql", "root:PW@my-db/DB_NAME") 重點就是你要把你要連接的target連到my-db而不是localhost.(因為container的localhost會是在docker裡面,而不是那台機器本身) 根據link的docker spec有提到,其實link就是做了兩件事情: 更新 container ip 在 /etc/hosts 設定好系統參數 (讓你可以直接使用my-db) 整合PHP Web Server 這裡使用的是tumtumcloud/apache-php這個image.不過我有稍微修改,一併把外面PHP位置放進去. docker run -v /YOUR_PHP_ADD:/app --link my-db 透過這個方式,只要你的PHP設定是連接 $db['host']="my-db" 就可以了. 整在一起放在docker-compose吧 透過以上三個services,其實我們可以寫在同一個docker-compose.yaml然後一次啟動.檔案可能是類似以下的方式: go-app: build: ./rpc/. ports: - 8088:8088 volumes: - ./GO_RPC:/rpc links: - atc-db command: /rpc/run_rpc.sh web-app: build: ./apache-php/. volumes: - ./apache-php/php:/app links: - my-db ports: - 80:80 my-db: image: mysql volumes: - ./db/db_data:/var/lib/mysql env_file: db.env 稍微解釋一下,主要這邊有三個服務 go-app, web-app跟my-db.就像前面提到的一樣,只是把每個設定不論是link或是volumes或是env_file甚至是command都寫入了docker-compose.yaml.他就會依照相依關係來啟動個別microservices my-db DB services go-app Web Go RPC services web-app PHP Apache services 這樣大概就把整個有在使用的服務串接成三個container來使用.算是第一個階段完成,有更多的services等著要去dockerized.並且也可以考慮導入swarm來分開在不同的host上面.
繼續閱讀

[Go]取得實體網卡的IPv4網路遮罩(Get device network mask)

##前言 最近在研究一些Golang在UDP上的處理,主要是要抓取網路遮罩(network mask)做一些進階使用.就發現要取得正確的網路遮罩,其實是蠻困難的.由於是無法直接使用到裝置上面的網卡設定. 這邊介紹一下相關的流程: ###先來抓取IPv4 這邊先顯示抓取IP的方式: func GetIP() net.IP { ifaces, err := net.Interfaces() // handle err if err != nil { log.Println("No network:", err) return nil } for _, i := range ifaces { //只抓取網路卡名稱為"en0", "en1"... if strings.Contains(i.Name, "en") { addrs, err := i.Addrs() // handle err if err != nil { log.Println("No IP:", err) return nil } for _, addr := range addrs { var ip net.IP switch v := addr.(type) { case *net.IPNet: log.Println("IPNET") ip = v.IP case *net.IPAddr: log.Println("IPAddr") ip = v.IP } //這裡會抓取兩種IP,分別是IPv4與IPv6 if ip[0] == 0 { //第一個byte是0為IPv4 log.Println("Get device:", i.Name) return ip } } } } return nil } 透過這個方式可以列舉所有的網路卡並且把第一張具有IPv4資料的net.IP傳回來. ###再來找Network Mask 其實透過官方的API,原本就有一個IP.DefaultMask()的函式可以使用.不過抓來的Network Mask是透過計算而來的,而不是跟網卡拿的.透過以下的範例: package main import ( "fmt" "net" ) func main() { addr := net.ParseIP("192.168.1.1") mask := addr.DefaultMask() fmt.Printf("Address : %s \n Network : %s \n", addr.String(), mask) //Mask 255, 255, 255, 0 addr = net.ParseIP("172.16.110.123") mask = addr.DefaultMask() fmt.Printf("Address :...
繼續閱讀

程式設計週記[2016/01/08]: 再爛的政局也要去投票,再糟的架構也要寫測試

(image from twitter) 這是什麼? 程式週記主要內容如下: Gihub project 介紹: 主要會貼一些github,但是會盡量寫上一些有用的評語(或是我容易想到的關鍵詞)幫助以後查詢 網路文章心得: 會寫些心得,強迫自己閱讀. “程式週記”並且定期週期性更新. 本週摘要 本週想研究iOT傳輸協定中使用UDP的CoAP(Constrained Application Protocol),看了挺久的RFC還是沒有很了解.先寫一些簡單的應用來試著了解. iOS/MacOSX iOS崩溃调试的使用和技巧总结 如何來抓取iOS App crash log? 這裡有三個建議方式: 使用第三方的Crash log ( 這裡是講百度) 自己寫crash log然後上傳server XCode-Device裡面查看(如果機器在你那邊) 使用Apple Xcode自帶功能 Window->Organizer->Crashes Python 透過IDAPython 反組譯Python 一連有三部曲教學,主要是教導如何查看變數與斷點偵錯. Go mission-liao/dingo: An easy-to-use, distributed, extensible task/job queue framework for #golang ss rakyll/gom: A visual interface to work with runtime profiling data for Go 這是透過Golang自薦的profiling tool pprof來呈現的輕量化UI.當然Dave Cheney也寫了一個profile. davecheney/profile: A simple profiling support package for Go Dave Cheney寫得,將pprof簡單化的函式. mission-liao/dingo: An easy-to-use, distributed, extensible task/job queue framework for #golang 這個task/job queue library提供許多進階的功能: Two-way binding Distributed Task Framework Stateful Worker Functions dustin/go-humanize: Go Humans! (formatters for units to human friendly sizes) 算是一個helper,可以幫你把許多資料格式轉換的鄉黨的人性化.ex: humanize.Bytes(82854982) //83MB humanize.Time(someTimeInstance) //3 days from now pubnative/mysqldriver-go: GC optimized MySQL driver 原本的Go build-in的MySQL driver由於使用到太多的heap會造成GC頻繁的產生,而這個是 GC optimized 過的 Golang MySQL driver,大量減少heap的產生,進而減少GC的發生次數.讓系統效能能夠更好. Heap size與Heap的使用率是GC發生的基本參數(參考這篇Go GC: Latency Problem Solved).雖然透過GOGC可以調整heap的數量(GOGC越高heap上限變得更高,但是記憶體更消耗.反之記憶體比較低,但是GC會很常發生.) 網路文章 区块链:比特币的灵魂,下一个风口 Block Chain一直就是Bitcoin最值錢的部分,慢慢的許多應用也會浮出來.最近比較紅的就是有人將Block Chain跟Application結合在一起,可以透過BitProof裡面的Block Chain來證明你就是該應用程式的創始人.這邊有更詳細的說明文章.當然也有IBM想透過Block Chain來達到Smart Contract的功能. “【簡報】《Final Fantasy Record Keeper》開發實務暨產品架構經驗分享” 由專業的電玩部落客”吹著魔笛的浮士德“介紹,有完整的中日文對整解釋.. 以下為簡單的心得: FFRK的架構為WebView +...
繼續閱讀

程式設計週記[2015/12/31]: The year of Go

這是什麼? 程式週記主要內容如下: Gihub project 介紹: 主要會貼一些github,但是會盡量寫上一些有用的評語(或是我容易想到的關鍵詞)幫助以後查詢 網路文章心得: 會寫些心得,強迫自己閱讀. “程式週記”並且定期週期性更新. 本週摘要 由於週五剛好是元旦,這個禮拜只有四天.剛好上週拿到了來自拍賣的Eddystone Beacon,就先玩了一下也順便把Eddystone Beacon Scanner寫好. 2016即將來臨,應該要給自己一些不同的期許與挑戰. iOS/MacOSX Flickr’s experience with iOS 9 Flickr在iOS9上的經驗談,想要用”Spotlight Search”, “Universal Links”, “Deep linking into the app” 跟”3D Touch”一定要仔細閱讀這一篇. Python python-cn/slack_bot: 立志成为一个可被调戏的Bot 這是一個Python Slack Bot的套件,從小黄鸡改過來.大部分資料都是從人人網過來,有電影資訊,美食資訊,地理資訊.新聞轉貼. djacobs/PyAPNs: Python library for interacting with the Apple Push Notification service (APNs) 透過Python來使用APNS(Apple Push Notification Services) Setting Up Sublime Text 3 for Full Stack Python Development 介紹不少好用的Sublime Text 3的package,透過這些package可以讓Sublime Text馬上變身成全端工程師的開發利器. 蠻基本的漣漪開始怎麼安裝Package Management都有教. Ruby Portus:CLAIM CONTROL OF YOUR DOCKER IMAGES 不想要使用公開的Docker Hub? 想要使用私有的Docker Registry.但是又怕無法有良好的權限控管與被人家修改你的Docker Registry? Suse提供一個良好的機制來管理,並且連網頁介面都有了. Go chai2010/tensorflow: tensorflow for Go tensorflow 的Golang wrapper dobyrch/termboy-go: Another Game Boy emulator for your terminal 可以在terminal上面玩GBA. 恩.. 你沒有看錯.. 是terminal不過可惜的是只有Linux可以用,還不支援Mac OSX.底層透過他自己寫的terminal display library: libtermboy與參考gba模擬器.另外一個terminal display library可以參考termUI,他是跨平台. “Handwritten Parsers & Lexers in Go” 這篇教學文章,首先先教導了在Parser裡面的一些基本概念,不論是Lexer或是AST.最後在教導如何寫出自己的Lexer跟Parser. 挺好的文章.簡單概念整理一下: 範例 SELECT * from Mytable 就是一個句子,如何把他掃成有意義的內容變成AST(Abstract Syntax Tree) 類似 Fileds []string 跟 table string. 首先要把句子透過Lexer Analysis也就是一個一個字掃描.並且將你需要的部份放入該AST裡面. Java/Android wasabeef/awesome-android-ui: A curated list of awesome Android UI/UX libraries 有著所有的Android UI Opensource List,並且還有圖片顯示.可以快速幫助你找到需要的library來用. Android Open Source...
繼續閱讀

程式設計週記[2015/12/25]: 聽說Swift很好玩.. 連我都忍不住想再學一次

某人的寶貝女兒設定檔 (Daughter YAML refer from Ansible) (pic from: https://twitter.com/chrisnuber/status/679069190377066497) 這是什麼? 程式週記主要內容如下: Gihub project 介紹: 主要會貼一些github,但是會盡量寫上一些有用的評語(或是我容易想到的關鍵詞)幫助以後查詢 網路文章心得: 會寫些心得,強迫自己閱讀. “程式週記”並且定期週期性更新. 本週摘要 Go 出了1.6 beta 1,讓大家在聖誕節感受到HTTP/2的威力.Swift持續在熱頭上,到處都是Swift的討論文章.程式語言的討論第一名也不是開玩笑的.本週開始想一些演算法與現實社會的應用,希望可以把之前寫過的專案來想想有沒有實作可以弄. iOS/MacOSX facebook/AsyncDisplayKit: Smooth asynchronous user interfaces for iOS apps. Facebook 出的可以讓你的App順暢的讀取一些遠端(或是比較需要時間的資料).由於是非同步,讀取到資料後會再回頭更新UI. Python 理解python中的装饰器(decorators) 介紹什麼是Python decorators與怎麼使用它,可以看看原文. An AI That Can Mimic Any Artist” 想不到機器學習引擎TensorFlow可以拿來做圖片的濾鏡效果.(內有Python Github) Go NYTimes/gizmo:A Microservice Toolkit from The New York Times gizmo 是什麼? gizmo是一個類似go-kit的微型服務的工具包.這一篇文章有解釋為何紐約時報需要建立自己的microservices的toolkit而不是使用go-kit. 稍微解釋一下go-kit,他提供了許多的小工具不論是斷路器(Circuit breaker)還是Rate limiter. 可以幫助你建立與管理Microserivces. “PHP7+Swoole比Nginx/Golang性能高75%” 測試方式挺受爭議,不過可以看看結果. RobotsAndPencils/buford: A push notification delivery engine for the new HTTP/2 APNS service. Go 1.6 beta 1 剛放上了 HTTP/2 馬上有人寫出搭配Apple更新的APNS services. RobotsAndPencils/marvin: Slack bot written in Go 用Go寫出的Slat bot,主要功能是列出Github上面的所有issue跟相關進度.如果用github來做專案管理或是開源專案的一定不要放過.還提供Heroku Deploy. ory-am/hydra: Run your own AWS-like identity & access management (IAM) service in less than 2 minutes. Written in Go. Backed by PostgreSQL. Built cloud native. 一個套件可以幫助你快速的建置出類似AWS的Identy & Access Services(IAM).資料庫使用PostgresSQL. 這是一個遠遠比起AWS IAM更輕量的服務,而且可以快速地部署出去.可以管理帳號與權限控管.對於網路服務提供商(SaaS or API Services provider)有著相當好的切入點. Java GovernmentCommunicationsHeadquarters/Gaffer: A large-scale graph database Gaffer是用Java寫出來的大型圖學資料庫(Graph Database),可用來分析不同資料之間的內部關係,相較於圖學處理系統(Graph Processing System),Gaffer特別優化了在特定節點上的資料檢索能力。使用者可以將資料整批上傳或是持續地將資料匯入,這個軟體有能力識別出大批電話記錄中的一組通話者是誰,或針對單一對象進行資料蒐集與分析,也可以透過API來進一步檢索或篩選出所需的資料。(摘自: IThome) A-Frame: Building blocks for the virtual reality web Mozilla出的framework,主要針對WebGL跟WebVR的部分.可以讓你的網站在瀏覽器上馬上看到3D效果(當然是指Firefox). SECCON...
繼續閱讀

[iOS] 把舊專案換到XCode7與iOS9上面會出現上下黑條(Application appears with black bars on top and bottom)

##問題: 主要是心血來潮把自己就的App”粉絲相簿“想拿出來改版(終於). 結果發現上下邊有黑條.這裡有個示意圖: 不過,我的App明明就是使用系統預設的UITableViewController,NavigationController跟UITabBar而已. 趕緊來找找解決方法. ##主要原因: 根據iOS 9 Xcode 7 - Application appears with black bars on top and bottom這邊的解答,是說由於你沒有” LaunchScreen.storyboard”在你的App,所以XCode會”預設”而把你的App變成比較能夠跑的狀況(類似iPhone4 App跑在 iPhone6 Plus一樣). 這樣其實很不好,因為有上下邊黑條還有擴大的效果. ##解決方式: 根據http://stackoverflow.com/a/32614526/1316907這邊的解釋,進行以下的方式可以解決這樣的問題: 更改”Launch Image Source” 成 “Brand Assets” 不過由於我還是有問題,我必須還要修改”Launch Screen File”成MainStoryBoard 這裡有個修改後示意圖: 打完收工,本來想加新功能,卻踩一堆舊Bug.不過這樣也學了一課.. 真棒… ##相關鏈結: iOS 9 Xcode 7 - Application appears with black bars on top and bottom iOS9 App has black bars on top and bottom UITableView under UINavigationBar with a black top background in IOS 9
繼續閱讀