Belajar spring-cloud for microservice architecture.
Configuring runtime
| application name | the ports binding |
|---|---|
| config-server | localhost:8888 |
| sample-service | localhost:8080 |
| wilayah-service | localhost:7000,7001... |
| nasabah-service | localhost:6000,6001,6002... |
| eureka-naming-server | localhost:8671 |
| zuul api-gateway | localhost:8765 |
Berikut flow proxy dari service nasabah ke service wilayah:
Biasya kalau kita call rest-api harus menanamkan url contohnya http://localhost:8080/api/** atau lain-lain. Nah itu hanya bekerja klo untuk satu service aja kalo ada ratusan service ??? how we can do that?
Dengan menggunakan fitur spring-cloud-starter-netflix-eureka-server kita bisa membuat proxy dengan multiple instance, kemudian untuk memanggil rest dengan menggunakan spring-cloud-starter-openfeign, spring-cloud-starter-netflix-ribbon dan spring-cloud-starter-netflix-eureka-client kita tidak perlu meng-hardcode lagi url tetapi hanya dengan menggunakan memanggilnya melalu ${spring.application.name} contoh implementasi di nasabah service seperti berikut:
@FeignClient(name = "wilayah-service")
@RibbonClient("wilayah-service")
public interface WilayahProxy {
@GetMapping("/provinsi/{id}")
ResponseEntity<Provinsi> provinsiById(@PathVariable("id") Long provinsiId);
}Akan secara langsung di forward ke service wilayah.
Berikut ini flow api gateway berdasarkan gambar dibawah ini:
Schenario 1
request: GET localhost:8765/nasabah_service/perorangan/10
-
Zuul
api gatewaycatch request dari browser, kemudian di-forward keeureka naming serveruntuk mencari nama service atau application name yang di register ke eureka. -
eurekaforward request ke localhost:7000/perorangan/10 berdasarkan application name yaitunasabah_service. -
Di dalam nasabah service, memanggil service lain yaitu
wilayah_servicedengan menggunakan proxyfeign clientyang mereference ke servicewilayah_serviceseperti berikut penggalan codenya:@FeignClient(name = "api-gateway-zuul") @RibbonClient(name = "wilayah-service") public interface WilayahProxy { @GetMapping("/wilayah-service/provinsi/{id}") ResponseEntity<Provinsi> provinsiById(@PathVariable("id") Long provinsiId); }
-
feign clientmelakukan check status dengan menggunakanspring-boot-starter-actuatorjika statusUPmaka akan di arahkan ke service tersebut berdasarkan application namewilayah_service. -
Karena instance
wilayah_serviceada 2 service yang berjalan yaitu di port 6000 dan 6001. Makaapi gatewayakan memilih route berdasarkan algoritmanya. Contohnya app yang di forward yaitu port 6001 maka di forward ke path localhost:6001/provinsi/32 -
Response dikirim kembali ke
feign clientberikut repsonse:{ "id": 32, "name" : "Jawa Barat" } -
Menerima response berupa json
-
forward data nasabah + data provinsi ke
eureka naming server -
forward data nasabah + data provinsi ke
api-gateway -
Browser mendirima data nasabah seperti berikut:
{ "id": 10, "provinsiTinggal": { "id": 32, "name" : "Jawa Barat" }, "namaLengkap": "Dimas Maryanto" }


