Pengenalan Finagle

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan melihat Finagle, perpustakaan RPC Twitter.

Kami akan menggunakannya untuk membina pelanggan dan pelayan yang mudah.

2. Blok Bangunan

Sebelum kita menggali pelaksanaannya, kita perlu mengetahui konsep asas yang akan kita gunakan untuk membina aplikasi kita. Mereka terkenal tetapi mempunyai makna yang sedikit berbeza di dunia Finagle.

2.1. Perkhidmatan

Perkhidmatan adalah fungsi yang diwakili oleh kelas yang menerima permintaan dan mengembalikan Masa Depan yang berisi hasil akhirnya dari operasi atau maklumat mengenai kegagalan tersebut.

2.2. Penapis

Penapis juga berfungsi. Mereka mengambil permintaan dan layanan, melakukan beberapa operasi atas permintaan tersebut, menyebarkannya ke layanan, melakukan beberapa operasi pada Masa Depan yang dihasilkan , dan akhirnya mengembalikan Masa Depan terakhir . Kita dapat menganggapnya sebagai aspek kerana mereka dapat menerapkan logik yang berlaku di sekitar pelaksanaan fungsi dan mengubah input dan outputnya.

2.3. Niaga hadapan

Niaga hadapan mewakili hasil akhirnya operasi tak segerak. Mereka mungkin berada di salah satu dari tiga keadaan: tertunda, berjaya, atau gagal.

3. Perkhidmatan

Pertama, kami akan melaksanakan perkhidmatan ucapan HTTP sederhana. Ini akan mengambil parameter nama dari permintaan dan membalas dan menambahkan mesej "Hello" biasa.

Untuk melakukannya, kita perlu membuat kelas yang akan memperluas kelas Perkhidmatan abstrak dari perpustakaan Finagle, dengan menerapkan kaedah penerapannya .

Apa yang kami lakukan kelihatan serupa dengan melaksanakan antara muka yang berfungsi. Menariknya, kami sebenarnya tidak dapat menggunakan fitur khusus itu kerana Finagle ditulis dalam Scala dan kami memanfaatkan interoperabilitas Java-Scala:

public class GreetingService extends Service { @Override public Future apply(Request request) { String greeting = "Hello " + request.getParam("name"); Reader reader = Reader.fromBuf(new Buf.ByteArray(greeting.getBytes(), 0, greeting.length())); return Future.value(Response.apply(request.version(), Status.Ok(), reader)); } }

4. Tapis

Seterusnya, kami akan menulis penapis yang akan mencatat beberapa data mengenai permintaan tersebut ke konsol. Sama dengan Perkhidmatan , kita akan perlu untuk melaksanakan Pilih 's memohon kaedah yang akan mengambil permintaan dan dapatkan Future tindak balas, tetapi kali ini ia juga akan mengambil perkhidmatan sebagai parameter kedua.

Kelas Filter asas mempunyai empat parameter-jenis tetapi selalunya kita tidak perlu mengubah jenis permintaan dan respons di dalam filter.

Untuk itu, kami akan menggunakan SimpleFilter yang menggabungkan empat parameter jenis menjadi dua. Kami akan mencetak beberapa maklumat daripada permintaan itu dan kemudian hanya sembah memohon kaedah daripada perkhidmatan yang diberikan:

public class LogFilter extends SimpleFilter { @Override public Future apply(Request request, Service service) { logger.info("Request host:" + request.host().getOrElse(() -> "")); logger.info("Request params:"); request.getParams().forEach(entry -> logger.info("\t" + entry.getKey() + " : " + entry.getValue())); return service.apply(request); } } 

5. Pelayan

Sekarang kita dapat menggunakan perkhidmatan dan penapis untuk membina pelayan yang sebenarnya akan mendengar permintaan dan memprosesnya.

Kami akan menyediakan pelayan ini dengan perkhidmatan yang mengandungi penapis dan perkhidmatan kami yang dirantai bersama dengan kaedah dan Kemudian :

Service serverService = new LogFilter().andThen(new GreetingService()); Http.serve(":8080", serverService);

6. Pelanggan

Akhirnya, kami memerlukan pelanggan untuk menghantar permintaan ke pelayan kami.

Untuk itu, kami akan membuat perkhidmatan HTTP menggunakan kaedah perkhidmatan baru yang mudah dari kelas Http Finagle . Ia akan bertanggungjawab secara langsung untuk menghantar permintaan.

Selain itu, kami akan menggunakan penapis pembalakan yang sama yang kami laksanakan sebelumnya dan mengaitkannya dengan perkhidmatan HTTP. Kemudian, kita hanya perlu untuk memohon memohon kaedah.

Operasi terakhir itu tidak segerak dan hasil akhirnya disimpan dalam contoh Masa Depan . Kita boleh menunggu Masa Depan ini berjaya atau gagal tetapi itu akan menjadi operasi penyekat dan kita mungkin ingin menghindarinya. Sebagai gantinya, kita dapat melaksanakan panggilan balik untuk dicetuskan ketika Masa Depan berjaya:

Service clientService = new LogFilter().andThen(Http.newService(":8080")); Request request = Request.apply(Method.Get(), "/?name=John"); request.host("localhost"); Future response = clientService.apply(request); Await.result(response .onSuccess(r -> { assertEquals("Hello John", r.getContentString()); return BoxedUnit.UNIT; }) .onFailure(r -> { throw new RuntimeException(r); }) );

Perhatikan bahawa kami mengembalikan BoxedUnit.UNIT. Returning Unit adalah kaedah Scala untuk mengatasi kaedah batal , jadi kami melakukannya di sini untuk mengekalkan interoperabiliti.

7. Ringkasan

Dalam tutorial ini, kami belajar bagaimana membina pelayan HTTP sederhana dan klien menggunakan Finagle serta cara menjalin komunikasi di antara mereka dan bertukar mesej.

Seperti biasa, kod sumber dengan semua contoh boleh didapati di GitHub.