write.kogu

Go言語を採用している有名なオープンソースのプロダクト

Go言語 プログラミング

Go言語はシステムやネットワーク、サーバーサイド、CUIツールでは定番言語の一つになりつつあり、日本でのユーザーもここ数年大きく増えました。一方で、シンプルさを重視した設計思想には「言語の発展に逆行する」「筋力要る」「とにかく気に入らない」など、色々な批判もあります。

こうした批判に直接応えるものではないにせよ、Goで作られた有名なプロダクトとその成功は、少なくとも単に「Goはクソ」というだけの声には、ある程度反証となります。また巨大なプロジェクトでの採用は、大規模だったり複雑だったりする開発に耐え、どうしようもない欠点は無く、十分に実用的であることを証明しているはずです。

そこでGoを採用しているOSSのプロダクトから、比較的有名なものを探しました。

なお、主なネタ元は以下です。

Usersは公式がまとめているGoの採用事例で、OSSのリストではありませんが、国別で分類されていて面白いです。

なお、有名だったりスターが多くても、Go用のライブラリなどは除外し、独立したプロダクトとして有名なものをなるべく集めています。そのためGopherに有名でもWAFやORMなどのミドルウェアや、単純にポーティングされたものは含んでいません。

目次

プログラミング言語

Goはすでにセルフホスティングで開発されており、言語の実装に必要な機能が十分揃っています。 まだGoで実装された言語はほぼ少ないですが、これから増える可能性はあります。

なお、Goを離れて実用されているとまでは言えない、yuin/GopherLuamattn/ankoなどは挙げていません。 GopherJS などのトランスパイラもありますが、これもGoを書く前提のツールのため、挙げていません。

Go

Goで書かれた最も有名なプロダクトのひとつは、Goそのものです。 開発当初はCなどが使われていましたが、ver.1.5からコンパイラ・ランタイム共にCのコードを無くし、Go(と少しのアセンブラ)で書かれています。

セルフホスティングで順調にバージョンアップを重ねており、GoがGoのようなプログラミング言語を実用的に実装できる、と証明しています。

deno

Node.jsを生み出し、離れ、現在のNode.jsに触れたRyan Dahlによる、TypeScriptのランタイム。 Node.jsを振り返って後悔した点を解消したものを目指しているようです。

実際のランタイムは deno ←→ v8worker ←→ V8、という構成? ローカルのプロセス間通信もProtocol Buffers。

alpaca

PHP, Python, Ruby, Node.jsに対応した、APIとドキュメントのジェネレーター。が、もうメンテされてない様子。 swaggerとかautorestとか使いましょう。

コンテナ

変化の激しいコンテナ周りですが、長期間Go製のプロダクトが目立っています。Dockerはもちろん、rkt, Kubernetes, kata, helmなどなど派手なプレイヤーや、ここには挙げていませんがOCI関連など、Goで作られたものが非常に多い。mesosはC++ですが他はpythonが強いぐらいのように見えます。

この分野で異様にGoが強いのは、Docker・CoreOSからの文化的なものなのか、あるいは皆もっと積極的にGoを選んでいるんでしょうか。

Docker

コンテナのデファクトスタンダードとなっているDockerは、もうひとつの最も有名なGo製プロダクトです。 Dockerで採用されていたことでGoに興味を持った方も多いはず。

2013年のスライドDocker and Go: why did we decide to write Docker in Go?では、DockerがGoを採用した理由として以下の点などを挙げています。

  • libcにすら依存しないスタティックなバイナリ
  • セットアップやテスト、起動の容易さ
  • 既存の言語から中立的
  • 多出する非同期処理が書きやすい
  • 低レベルなシステムプログラミングが可能
  • 強力な標準パッケージ
  • 強力なダックタイピング
  • docやfmtなど開発ツールが充実
  • アーキテクチャを超えたクロスコンパイル

Dockerではコアだけでなく、cliやswarmなどの関連ツールも数多くGoで書かれています。

rkt(旧Rocket)

色々あってDockerと袂を分かったCoreOS社のコンテナランタイム(Dockerの諸問題とRocket登場の経緯 | SOTA)。

こちらもやはりGo製で、コンテナランタイムのトップはどちらも主要な言語にGoを採用しています。

CoreOS社は他にもetcdなど広く利用されているGoのプロダクトを開発しており、Goの普及に大きな影響を与えているユーザーです。

gVisor

Googleが最近OSSとして公開した、よりセキュアなサンドボックス化したコンテナランタイムを提供するためのプロダクト。

すでにGoogle Cloud Function、Google App Engine/SEのNode.jsとJava8ランタイムは、gVisorベースになっているようです(Google App Engine / Cloud Functions のアーキテクチャについて公開情報を集めるスレ · Issue #51 · gcpug/nouhau)。GAE/SEのようにはじめからサンドボックスなサービスは、さっさとgVisorに統一されそうな雰囲気。

kata-containers

OpenStack Foundationによるコンテナ。 OpenStackらしく、軽量な仮想マシンとカーネルでよりセキュアに分離したランタイムを目指しているようです。

rkt, gVisor, kataが揃ってこうセキュアセキュアと掲げると、まるでDockerが危険に聞こえますが、Dockerもその辺はアップデートされていってます。

kubernetes

k8sことコンテナ運用自動化(オーケストレーション)ツールのデファクトスタンダード。 当初はGoogleのプロダクトでしたが、Apache License 2.0のOSSに。

コンテナはいずれ、kubernetesのようなレイヤーを前提とし、helmなどそれを基盤とするツールを通じて使うのが一般的になりそうです。大手が軒並みkubernetesをサポートし、containerdのようにコンテナランタイム側がkubernetesにネイティブ対応。Dockerはより深く広いOSでkubernetesサポートと、kubernetesの標準化が進むことで、そういう未来は早まるかも知れません。

helm

Deisが開発する「kubernetesのパッケージマネージャ」。

kubernetesをOSのように捉え、OSのパッケージマネージャの如くhelmがパッケージ(Chart)を供給、というモデルを実現します。

Flynn

DockerベースのPaaS環境を構築するツール。

インフラ管理

Terraform

HashiCorpの定番ツール。

色々なクラウドの提供するインフラをコード化し、変更やバージョン管理などを容易にします。 対応する事業者の豊富さ、対応スピードが素晴らしい。

HashiCorp社も、Nomad, Consul, Vaultなど他にも多くの有名なGo製のプロダクトを開発しています。

Consul

これもHashiCorpによる、インフラ管理ツール。 動的に変化するようになってきたインフラを、検出し、把握し、管理する。

HashiCorpだらけになるので省いていますが、他にもNomad, Vault, Packerなどなど、優れたGoによるOSSを公開しています。

ネットワーク

lantern

中国などインターネットに制限ある環境向けのプロキシツール。 OSSですが、プロキシサーバーの利用は有料または制限ありの無料アカウント。

traefik

モダンなリバースプロキシ・ロードバランサ。 コンテナと連動してくれたがしやすかったり、マイクロサービス想定されているようです。

交通整理Gopherくん。

fabio

HashiCorp Consulと連携する、ロードバランサ・TCPルータ。

Caddy

“Every Site on HTTPS”がキャッチフレーズなHTTP/2対応のWebサーバー。

Goだと簡単にHTTP待てますが、これはいわゆる単体のWebサーバーのモダンなもの。 GoらしくSolarisやAndroidでも動きます。基本はファイル配信ですが、php-fmp経由でPHPも動かせるし、Nginxと少し重なる。

NSQ

もとはbitlyが開発した、分散のメッセージングプラットフォーム用ミドルウェア。

ロボット・IoT

ガベージコレクションの制御しにくい負荷と、静的リンクによる大きなバイナリなどから、リアルタイムが求められたり、リソースが非常に限られたりする用途にGoは不向きと言われます。

確かに宇宙開発や廉価な白物家電などには向いていないかも知れません。それでも、Linuxが乗る程度の機器であれば十分実用できるようです。

Gobot

Goでの電子工作といえば、Gobot。 様々な機器や規格に対応したフレームワークであり、開発も活発。 公式サイトのトップには”35 Platforms”、”19 GPIO drivers”、”5 Analog I/O (AIO) drivers”、”24 I2C drivers”、”8 SPI drivers”と、幅広い機器への対応が謳われています。

当初はGoで組み込みするとしたら…という言語ありきの選択肢のひとつだったものが、Gobotが使いたいからGoで、というGoが選ばれる理由になるケースも。

embd

Gobotに次いで有名なのは、embdでしょうか。 Gobotに比べると低レベルの操作を提供します。

ただし開発は下火になっており、テコ入れが無い限りこのまま忘れ去られていくかも。

ファイル

syncthing

Win・Mac・Linux・BSDに対応するP2Pでのファイル共有ツール。

管理用のインターフェースはブラウザで提供。UPnP環境ならNATも自動超え。

restic

高機能でシンプルに使えるバックアップ・リストアツール。

あれこれ賢く、S3やGCSなどのクラウドストレージにも対応しています。

Annie

主に動画を対象としたダウンローダー。 プレイリストの動画を統合する場合だけ、要ffmpeg。

開発が中国の方のようで、対応サイトは优酷や哔哩哔哩など中華系が充実。

CLI

elvish

Windowsにも対応してるシェル。 構造化データを流せるパイプや使いやすいヒストリなどなど。

まだまだ開発途上のようです。

peco

Daisuke Maki (a.k.a lestrrat)による、CLIでのインタラクティブなフィルタリングツール。 シングルバイナリでWindowsでも使えて、日本では同じ用途のfzfと並んで人気。

fzf

こちらもpecoと同じく、インタラクティブフィルタリングツール。 pecoとの比較や歴史はおい、peco もいいけど fzf 使えよが素晴らしい。

この手のツールはGoのポータビリティが最適なので、CLIツールはGo製だととても嬉しいです。

jid

IMEとは無関係な日本のsimeji(@simeji)作。

“Json Incremental Digger”の名の通り、CLIでJSONをインクリメントに掘り下げられます。jq風のクエリでさくさくドリルダウンしていけるので、大きめのJSONは読むのにこれないと辛い。

The Platinum Searcher

高速な検索ツール。grep代替。

Windowsで動いて、しかも文字コードまたいでくれるので重宝してます。

gopass

Pass互換の、GPGで保管するパスワードマネージャー。

DB

InfluxDB

「時系列データベース」。メトリクスやIoTセンサーのログなど、時系列がキーになるようなデータに特化。

cockroachDB

名前はあれですが、元GoogleのエンジニアがGoogle Cloud Spannerのような、SQLが使えてACIDなトランザクション対応を目指した立派なプロダクト。

どんな環境でも動き続けることを目差して、名前もロゴもこうなった。 だめな人はとことんだめだから、これでユーザー減らしてるんではないか。

etcd

CoreOSが開発する分散Key-Valuesストア。

CoreOSクラスタ間の設定共有が主な用途ですが、gRPCやJSONで引けて信頼性高くて、色んな所で使われてます。

Cayley

グラフDB。 たとえばナレッジグラフのような、頂点と枝で構成されたグラフ構造のデータを取り扱うエンジン。

GoogleのプロジェクトにインスパイアされたGoogleのエンジニアが開発。Googleこういうの多いな。

モニタリング

grafana

モニタリング系のシンプルできれいなダッシュボードが比較的簡単に作れる。 InfluxDBとの組み合わせをよく見る。

bosun

Stack Exchange製のモニタリング・アラートフレームワーク。 ルールベースのアラートで、ルールは独自の式で作る。

これもInfluxDBにつないだり。

Prometheus

独自のクエリ言語を持ち、モニタリングデータをざくざく可視化したり評価できる。

スタンドアロンなツールなので、要求環境も使い方もシンプル。

beats

Elasticによるデータシッパー。Elastic用Fluentdのような感じでしょうか。

Topbeat, Packetbeatなど、~beatという形で収集対象を手軽に扱えるようです。

SCM

gogs

手軽に自前でGitHub風サービスを立てられる。マルチプラットフォーム。

Hub

GitHubによる、GitHubを叩けるコマンドラインツール。 gitコマンドのラッパーとして動きつつ、プルリクエストなどgithubの機能に対応。

ghq

motemen作のリポジトリ管理ツール。 色んなリポジトリを行き来したり、あれどこいった?なんて状況でとても便利。hubやpecoとの組み合わせがよく紹介されています。

作者の言っている通り、go getしてる感覚。

テスト

hey

以前はboomと名乗っていた、シンプルなHTTPのロードテストツール。ApacheBenchの置き換え狙い。

vegeta

こちらもシンプルなHTTPのロードテストツール。

READMEにある通り、名前はもちろんあのベジータから。テストの実行も”attack”。 名前が違ったらここまで有名ではなかった気がする。

コンテンツ管理

HUGO

HUGO

JekyllやHexoなどと同じ、静的サイトジェネレータ。

静的サイトジェネレーターとして有名で、今や定番になっています。

rubyやnode.jsでの実装が多い他のプロダクトに比べて、ビルドがかなり高速。 テンプレートがhtml/templateなのがやや使いにくい。

画像処理

GAPID

GoogleによるグラフィックAPIのデバッガ。 AndroidのOpenGL ESやデスクトップのVulkanに対応。

APIによる描画をステップ実行風に順に確認したり、シェーダーやドローコールを可視化したりと、まさにデバッガ。

GUIはJavaっぽい。

primitive

入力画像をプリミティブな図形で描写して出力するツール。

コアはCLIで、Mac版はGUI付き。

まとめ

JavaやSwiftがプラットフォームを背景にしたユーザーを持つのに比べ、Goにはそうしたボーナスがありません。 それでもこうして多くの優れたプロダクトで採用されています。 コンテナやCLIやインフラなどの分野では、話題になったプロダクトが言及もなくGoを採用していることも珍しくありません。

Dockerはもちろんですが、CoreOSやHashiCorpなど、OSSを扱うヘビーユーザー企業が優れたプロダクトを公開する。 そのユーザーは自然とGoに親しみ、Goを書き、公開する。 こうした循環がより進んでいると感じます。

他のインデックスでも、自分でGitHubを集計したものでも同様ですが、Goの言語としての人気はここ数年大きく上がってはいません。TIOBEで跳ね上がったこともありますが、その後を見ても、実態は15位前後が続いています。 しかし今後、GUIなど特に苦手な分野がカバーされれば、初学者にも向いた設計思想などもあり、劇的に普及するのかも知れません。

広告