RouterFunctionでリクエストをインターセプトする

はじめに Router Functionを利用しているときのサーブレットフィルターとかインターセプターみたいなのってどうやってやるんだろって言うのが気になったのでちょっと調べてみます。 やってみる 環境 環境は以下の通り $ java --version openjdk 15 2020-09-1…

QuarkusでHealth Checkのエンドポイントを作成する

はじめに KubernetesにはLiveness ProbeをReadiness Probeといった概念があり、アプリケーションにそれぞれを確認するためのエンドポイントを作成する場合があります。 Spring Boot(2.3以上)などではそのエンドポイントが用意されていますが、Quarkusにもそ…

RouterFunctionでグローバルにエラーハンドリングして任意のレスポンスを返す

はじめに @ControllerAdvanceや@ExceptionHandler,を使ったグローバルなエラーハンドリングはやったことがあったのですが、そういえばRouterFanctionでやったことなかったなと思い試してみたいと思います。 やってみる ざっくりやること 大きく2つのやること…

Spring WebFluxでブロッキング処理を書く

はじめに てっきり、WebFluxのようなReactiveの場合、ハンドラーみたいなのはEventLoopとは別スレッドで動いているもんだとばかり思っていたのですが、どうやらそうではないようで(冷静に考えれば当たり前、と言うかそうしてしまったら意味がない)、悪気な…

Kotlinでのエラーハンドリング(ResultとEither)

はじめに 諸々の事情で、今後Kotlinを使うことになりようなので、少し学びたいなと思いました。 いろいろ本とか読んでる中で、Javaと大きな違い1つとして、エラーハンドリングのやり方があるように感じたので、このブログではそれについてまとめます。 大本…

Linuxでシステムの起動時間を調べる

はじめに LinuxのシステムでOSの起動時間を調べるためにはsystemd-analyzeというツールが使えるみたいです。 このブログではsystem-analyzeについてまとめ、いくつかの機能を試してみたいと思います。 systemd-analyzeとは Linuxシステムの起動時の情報を解…

Dockerイメージ調査ツールDiveを試してみる

はじめに Dockerのイメージを調査するツールとしてDiveというツールがあるのを知り試してみようと思います。 何ができるか? Diveでは主に以下のようなことができます。 イメージ層ごとのコンテンツの調査 それぞれのイメージのレイヤーの差分 イメージの効…

VisualVMを使ってみる

はじめに Javaのプロセスをプロファイルするツールはいろいろあると思うのですが、個人的にVisuralVMが気になったので、調べてまとめます。 具体的には以下のようなことを目指します。 VivualVMの概要を知る どのようなことができるかを知る 実際に使ってみ…

QuarkusでReactiveなWebAPIを書いてみる

はじめに Reactive Stream系のものはSpring WebFluxしか触ったことが無かったのですが、QuarkusにもReactive Routeというのがあるというのを知り使ってみたくなったので、その機能を試してみたいと思います。 Reactive RouteとSmallrye Mutiny まず、Quarkus…

WebFluxのFluxレスポンスをテストする

はじめに 表題通りなんですが、よくやり方を忘れるのでメモしておきます。 手順 手順としては簡単で 1.WebTestClient.ResponseSpectのreaurnResultを呼び出し、FluxExchangeResultを受け取る。 2. FluxExchengeResultのgetResponseBody()を呼び出してFluxを…

Elixirで関数の非同期呼び出しを行って結果に対して逐次的に別の処理をかける

はじめに Elixirで非同期をやる場合Task.asyncをつかいますが、非同期で呼び出した複数の関数の呼び出し結果に対して、逐次的に別の処理をかけたい状況で、同僚のElixirに詳しい人のコード見てなるほどと思ったのでメモとして残しておきます。 どうするか? …

QuarkusのログをJson形式で出力する

はじめに ログコレクターでアプリの情報収集する場合、Jsonでログが出力されている方が何かとやりやすいことがありますがQuarkusでもログの出力をJsonに変えることができます。 ログをJsonに変更する 依存の追加 適当にQuarkusプロジェクトを作成し、以下の…

QuarkusのアプリにJWT RBACを追加する

はじめに Quarkusのアプリケーションを作ったことが無かったので、エコーサーバを作りたいと思います。ただ、エコーサーバ作るだけだと面白くないので、JWT認証と合わせてやってみようかと思います。 以下のようなことを目標にします。 Quarkusのプロジェク…

ElixirのコレクションをEnumで処理する際のエラーハンドリングを呼び出し側で行なう

はじめに Elixirにはコレクションを列挙して処理するためのモジュールとして Enum モジュールというのがありますが、列挙中にエラーが発生して、実行をやめたい場合のエラーハンドリングについてやり方を調べる機会があったのでそのメモを残しておきます。 E…

Spring Cloud Contractをnon-JVMの言語で使う

はじめに Spring Cloud ContractはCDC(Consumer Driven Contract)をサポートするSpring Cloud傘下のプロジェクトです。 このプロジェクトはJavaのプロジェクトであることにより、初期の段階では、JVM言語以外での利用ができない状況でした。しかし、その場合…

入門 監視を読んだ

はじめに システムを継続して動作させ、改善していく上で、重要なプロセスの1つが監視だと思います。このブログではその監視についてのチップがまとめられている「入門 監視」についてまとめます。なお、このブログはあくまで私自身の理解を自分の言葉でまと…

testcontainer-goを試す

はじめに JavaのライブラリーにTestcontainersと呼ばれるものがありますが、そいつのGo版ライブラリがあると言うのを見かけたので試してみたい思います。 Testcontainersとは TestcontainersはJavaのライブラリーでDocker ContainerをJunitのライフサイクル…

AppCDSを使ってみる

はじめに AppCDS(Application Class Data Sharing)はCDS(Class Data Sharing)の拡張であり、Java 10以降で利用可能です。この機能を使うことで、アプリケーションでロードされるクラスを共有アーカイブから読み込むようになり、その起動時間を削減することが…

Spring Cloud ContractでCDCする

はじめに マイクロサービスで、E2Eテストを書く際にマイクロサービスが依存するマイクロサービスを立ち上げるのが面倒だったり、時には現実的では無い場合があるなぁと最近感じてます。 そんな中でConsumer Driven Contract(CDC)という考え方を耳にはさみ…

GraalVMのNative ImageでReflectionを使う

はじめに よくSpringのアプリケーションをNative Image化するときDynamic ProxyやReflectionをゴリゴリ使っているので、設定が大変みたいな話を聞いたことがあるのですが。 じゃあ、実際に使うためにはどんな設定が必要なんだろう。というのが気になったので…

Elixirのex_parameteriedでパラメタライズテストを行なう

はじめに JavaのJunitでもパラメタライズテストを行なうための機能が色々と用意されていますが、Elixirのでもex_parameterizedというライブラリがあり、このライブラリを用いると便利にパラメタライズドテストを行なうことができます。 ちょっと便利そうだっ…

squashでKubernetesのPod内のGoアプリをデバッグ実行する

はじめに 最近、アプリの実行プラットフォームとしてk8sを使うことが多いのですが、ローカルで動いているアプリがk8s上で動かないみたいな事象にハマることがありました(もちろん、なるべく環境は合わせるようにしていたのでですが、ローカルでは外部APIを…

Springのプロジェクトをマルチモジュール構成で作る

はじめに Mavenではプロジェクトをマルチモジュール構成に構築することは可能ですが、Spring Frameworkでもその機能を利用することが可能です。 この辺の機能はあまり触ったことがなかったので、触ってみたいと思ったがのがこのブログのモチベーションです。…

Moxを試してみる

はじめに MoxはElixirのMockライブラリです。最近はElixirでコードを書く機会が増えているのいて、Mockをどうすれば良いのかよくわかってなかったのですが、手近なプロジェクトを覗いて見たらMoxというMockライブラリを使っていました。 Elixir界隈のデファ…

Kongのプラグインを書いてみる

はじめに Kongはマルチクラウド対応されたAPIゲートウェイです。Kongはlua-nginx-moduleとLuaと呼ばれるScript言語を利用して、 拡張プラグインを書くことが可能で、その機能を試してみようと思います。 ここでは、以下をゴールとします Kong Pluginの基本的…

Goのタイムゾーンの変更をalpineのDockerコンテナ内で行なう

はじめに Goのtimeパッケージにはいくつかタイムゾーンを指定するための関数が生えていますが、それらはすべて、 the IANA Time Zone databaseと呼ばれる世界各地の標準時間を集めたDatabaseを利用してタイムゾーンの情報を取得します。これはubuntuの環境な…

APIゲートウェイKongを試す

はじめに 最近触れた技術としてKongと呼ばれるNginxベースのAPIゲートウェイがあります。個人的に興味が湧いたので調べてまとめようと思います。以下のようなことをまとめたいなと思います。 Kongの概要 基本的な機能の使い方(インストールはDocker前提) S…

MicroProfileを調べてまとめる

はじめに 昨今はマイクロサービスが採用されるソフトウェアアーキテクチャとして、一般的になっているように感じます。マイクロサービスでは従来のようにアプリケーションを大きな一枚岩として作成せずアプリケーションの単位で分割し、それらのまとまりで、…

JavaのFlight RecorderとJDK Mission Controlをつかってプロファイリングをしてみる

はじめに 自分は結構JVMの動きとか、GCとかそういうのに興味があるのですが、どう分析して良いのかさっぱりでした。そこで、今回はJavaのプロファイリングデータを収集するツールであるFlight Recorderととその分析ツールであるJDK Mission Controlに入門し…

Network Namespaceを使って、Linux上で仮想のネットワーク環境を作る

はじめに ネットワークで色々実験したいときに自分自身の環境内で完結するネットワークが欲しい時があると思います。この記事ではNetwork Namespaceを使って自分のPC内に仮想のネットワークを作ってpingコマンドを送信してみたいと思います。 最初にお断りし…