Computer

RESTクライアントを自動生成するSpring Cloud OpenFeignが便利すぎた

OpenFeignはSpring Data JPAのREST版

最近はマイクロサービスなJavaアプリケーションを作っている中で、Spring Cloud OpenFeignを使ってみたのですが便利すぎて驚きました。

Spring Data JPAによってデータベースにアクセスするボイラープレート(繰り返し書く似たようなコード)がほぼゼロになりましたが、OpenFeignを使うとRESTクライアントで今までやっていたボイラープレートを激減できます。

ちなみにですが、Feignは「フェイン」と発音し、「装う」「何かをふりをする」という意味があるそうです。

Spring Cloud OpenFeignの概要

Spring Cloud OpenFeignを使うと、宣言的なアプローチでRESTクライアントを作成することができます。

OpenFeign自体はSpringのプロジェクトではありません。

OpenFeignプロジェクトページ: https://github.com/OpenFeign/feign

基本的なコンセプトとしては、

  1. Javaのインターフェイスを定義して
  2. メソッドにRESTの仕様をアノテーションで記述する
  3. OpenFeignが実行時に自動的にコード(実装)が生成してくれる

というもので、データベースへのアクセスと同じくらい退屈だけど、何度も繰り返し行う必要がある「RESTクライアントの作成作業」を消し去ることができます。

Spring Cloud OpenFeignは、Springプロジェクトによる拡張版で、Spring MVCのアノテーションや、メッセージのコンバーターを使えるようになっています。

Springのアノテーションがそのまま使えるというのは、Spring MVCやSpring Rest Controllerに慣れている人にとっては非常に便利です。

Spring Cloud OpenFeignのサンプルコード

実際に使ってみると、記述もスッキリしていて非常に快適です。

こちらが実際のコードです。

@FeignClient(value = "jplaceholder", url = "https://jsonplaceholder.typicode.com/")
public interface DemoClient {

    @RequestMapping(method = RequestMethod.GET, value = "/posts")
    List<Object> getPosts();
}

ちなみにテストに使っているサーバーはRESTのテストサーバー的な感じで幅広く使われているようです。http://httpbin.org のREST版みたいな感じですかね。

 

で、以下がクライアントを利用するサンプルです。

@Slf4j
@RestController
public class DemoController {

    @Autowired
    private DemoClient demoClient;

   @GetMapping
    public String test() {
        log.info("response: {}", demoClient.getPosts());
        return "yes";
    }
}

 

普通にインターフェイスをインジェクト(@Autowired)をしていますが、Springによってインジェクトされるのは実際の実装クラスです。

実行するとデータが取得できます。上の例ではやる気なくList<Object>を取得していますが、ここはJSONと対応したPOJOにしてやれば、自動的にJSONからJavaへの変換も行われます。

社内用のコードなので掲載はできませんが、もちろんGET以外のメソッドも使えますし、@PathVariableや@RequestParameter、@RequestBodyなども、普通にRESTコントローラを書いているのと同じ感覚で使えます。

クラウドじゃなくても使えるのか

Sprig Cloud OpenFeignは、Spring Cloudのサブプロジェクトですが、クラウド環境でなくても使えるのか気になりますが、ローカルで立ち上げたところ普通に使えるので、クラウド向けの開発でなくても積極的に使えそうですね。

Cloudプロジェクトから出ている理由はおそらく、Netflix HystrixやNetflix Ribbon (Spring Cloud Load Balancer)などのマイクロサービス向けのライブラリと一緒に開発されたからかなと思います。Spring Cloud OpenFeignは、上に挙げたライブラリと密接に連携することができるそうなので。

知識を更新する重要性

少し話はそれますが、Springは仕事でしょっちゅう使っていたのに、OpenFeignはまさに「灯台下暗し」でした。

OpenFeignは2016年に初リリース、Spring Cloud OpenFeignは2017年末にはリリースされてようですが、僕が初めて使ったのは2020年5月です。

この期間にかなりの数のRESTクライアントをRestTemplateで書いていたので、今までもったいないことをしたなと思うばかりです。

僕は技術者同士の交流や情報交換をする機会が極端に少ない(自分から避けているせいもあります…)ので、その点は反省するしかないですが、これと似たようなケースははいくらでもあると思いますし、これは僕だけではありません。

例えばHazelcastなどは名前だけは知っていたけど、実際に使ってそのパワーを知るまでは長い時間が空いていました。これは僕に限らず、Spring Data JPAの存在を知らないままゴリゴリデータベース周りのコードを書いている同僚もいます。

新しいものを見たら「なんだろう」と思うくらいの好奇心を失くしたらダメだのかもしれませんね。技術者を続ける以上は、歳のせいにばかりもできません・・・

それにこうやって古いやり方を続けていると、別に古いものに固執したり他人に押し付けているわけではなくても、いつしか「老害」になってしまうのでしょうね。反省です。

参考リンク

Spring Cloud OpenFeign - https://spring.io/projects/spring-cloud-openfeign

OpenFeign - https://github.com/OpenFeign/feign

Spring Data JPA入門

Spring Data JPAとは データベースのやり取りはJavaに限らずほとんどのサーバーサイドのアプリケーションで必要となる機能ですが、データベース関連のJavaライブラリやフレームワークは無数 ...

続きを見る

-Computer