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 gateway
catch request dari browser, kemudian di-forward keeureka naming server
untuk mencari nama service atau application name yang di register ke eureka. -
eureka
forward request ke localhost:7000/perorangan/10 berdasarkan application name yaitunasabah_service
. -
Di dalam nasabah service, memanggil service lain yaitu
wilayah_service
dengan menggunakan proxyfeign client
yang mereference ke servicewilayah_service
seperti 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 client
melakukan check status dengan menggunakanspring-boot-starter-actuator
jika statusUP
maka akan di arahkan ke service tersebut berdasarkan application namewilayah_service
. -
Karena instance
wilayah_service
ada 2 service yang berjalan yaitu di port 6000 dan 6001. Makaapi gateway
akan 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 client
berikut 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" }