概要
最近、自作ルーティングのgoblinをアップデートしたのでその記録を書き残しておく。
以下は過去ルーティングについて書き残した記事。他にも実装検討フェーズの記事があるが、内容があまり良くないので割愛。
- URLルーティング自作入門 エピソード1
- URLルーティング自作入門 エピソード2
- GolangのHTTPサーバーのコードリーディング
- Introduction to URL router from scratch with Golang
何が変わったのか?
基本的な動作をするバージョンを1.0.0としてリリースしていた。 実際に自分で利用する中で、バグを見つけたり、機能の物足りなさを感じて、後方互換性のない変更を何回か経て(行き当たりばったりな実装をしていたツケが回った)、現在は5.0.1が最新のバージョンになっている。
具体的には、ミドルウェアの機能をサポートするようになったことが一番の変更点で、それに伴い内部のデータ構造を見直したり、DSLを見直したり、バグを改修したりした。
なぜミドルウェアをサポートしたのか?
ミドルウェアはルーターを利用する側で自由に対応できると考えていたが、実際には制約があった。
利用側でミドルウェアを実装しても、ルーティングのマッチングの処理(≒パスとHTTP メソッドが登録済みのルーティングにマッチするかどうかの処理)が完了した後にミドルウェアの処理が実行されるような形になるため、HTTPメソッドのマッチング前にミドルウェアを適用したいようなケースに対応できないという制約を設けてしまっていた。
これはPreflightのリクエスト(CORS対応など)を捌きたいときに不便なため、根本的に解決するために、ミドルウェアをサポートする判断をした。
そのようなケースを考慮する上で厄介だったのが、ルーティングが内部的に持つデータ構造で、パスとHTTPメソッドの一致を前提とするようなデータ構造になってしまっていたため、そこの見直しからする必要があった。
なので、データ構造を以下のように変更をして、ミドルウェアのサポートを実装した。
Before

After

ベンチマーク
静的なルーティングだけ対応したベンチマークを書いていたが、他のライブラリとの比較を動的なルーティングのテストと合わせて比較したみたかったので一番充実していそうなgithub.com - julienschmidt/go-http-routijng-benchmarkを使ってベンチマークテストを実施してみた。
以下は最新のスコア。
goblinのベンチマーク対応を追加したPRを投げてみている。 github.com - julienschmidt/go-http-routing-benchmark Add a new router goblin #97
所感
ようやく人並みのルーター?になったような気がする。 まだまだ改善点はあるので今後も継続的にメンテしていく。