Žily byly dvě aplikace, které spolu spokojeně asynchronně komunikovaly přes RabbitMQ. Zlý vývojář ovšem potřeboval, aby spolu začaly komunikovat synchronně přes REST. A protože byly obě aplikace napsány s pomocí Spring Boot, poohlédl se vývojář po Spring Cloudu, jmenovitě po Euréce. Jak to dopadlo?

Co je Eureka?

Eureka je open source service registr, který vyvinul Netflix a následně ho poskytl komunitě. Projekt byl záhy začleněn pod Spring Cloud a má přímou podporu ve Spring Boot, což jsem velmi ocenil. V případě, že nefungujete nad JVM, podívejte se na Netflix Prana.

Prana - Making it easy to integrate with NetflixOSS services. Prana exposes Java based client libraries of various services like Eureka, Ribbon, Archaius over HTTP. It makes it easy for applications especially written in Non-JVM languages exist in the NetflixOSS eco-system.

Jak Eureka funguje?

Telegraficky: server registruje instance služeb. Klient se na ně ptá a pak se rozhodne, se kterou si bude povídat.

Server

Někde na známé adrese běží Eureka Server, ke kterému se přihlašují (registrují) servery nabízející služby. Registrované servery posílají heartbeaty a pokud server neobdrží heartbeat ve stanovený čas, vyřadí server z registru.

Server si buď stáhnete jako hotový war soubor a nebo sestavíte jako Spring Boot aplikaci:

SpringApplication.java
1
2
3
4
5
6
7
8
9
10
@SpringBootApplication
@EnableEurekaServer
@EnableDiscoveryClient
public class EurekaApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(EurekaApplication.class, args);
}
}
application.yml
1
2
3
4
5
6
7
8
9
server:
port: 8761
eureka:
client:
registerWithEureka: false
fetchRegistry: false
server:
waitTimeInMsWhenSyncEmpty: 0

Klient

Jak už bylo zmíněno, klient se jednak registruje jakožto služba, jednak získává informace o již registrovaných serverech a službách. U klienta existuje podpora pro Guice, Spring (Boot), případně se dá použít čistá Java a úplně v nejhorším pouze REST volání.

Ve Spring Boot stačí přidat správnou anotaci a máme hotovo:

SpringApplication.java
1
2
3
4
5
6
7
8
9
@SpringBootApplication
@EnableDiscoveryClient
public class EurekaApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(EurekaApplication.class, args);
}
}
application.yml
1
2
3
spring:
application:
name: rosnicka

Tímto jsme zajistili, že se instance registruje při startu a odregistruje při vypnutí.

A k čemu je dobrá?

Naše aplikace jsou zaregistrovány, teď se na ně konečně můžeme registru zeptat. Řekněme, že naše aplikace Weather Portal se potřebuje zeptat přes REST služby rosnicka na aktuální teplotu. Rosniček nám v cloudu běží 10 a na adrese /api/1/temperature získáme teplotu. Pracný způsob je dotaz na Eureku, získání seznamu serverů, výběr jednoho, vytvoření REST/HTTP klienta, volaní a deserializace. Snadný způsob je pak použítí další vychytávky od Netflixu - FeignClient.

WeatherService.java
1
2
3
4
5
6
7
8
@FeignClient("ROSNICKA")
public interface WeatherService {
@RequestMapping(value = "api/1/temperature", method = RequestMethod.GET)
Temperature getTemperature();
}

Takto definovanou službu stačí nainjektovat přes Spring a knihovny na pozadí se postarají o všechna kouzla - kontaktování Eureky, výběr serveru, (de) serializaci a případné znovuvolání (retry) v případě, že rosnicka vrátí například HTTP 404. Musím dodat celkem důležitou věc:

Služby spolu komunikují přímo, Eureka jim pouze doporučí, kam poslat požadavek.

Shrnutí

Eureka se výborně hodí do prostředí, kde předem nevíte, kde a kolik mikroslužeb vám poběží. Oproti tradičnímu load balanceru přináší výhodu - klienti Eureky mají vlastní cache, takže když umře server, případně se preruší spojení, servery si dál povídají. Další velkou výhodou je fakt, že servery můžete přidávat (a odebírat) prostě tím, že spustíte (vypnete) dalši instanci služby a nemusíte pokaždé psát svému administrátorovi, aby někde změnil konfiguraci load balanceru.

Eureka se nehodí tam, kde vyžadujete například sticky sessions či tam, kde musíte administrátorovi přinést hrnec zlata, aby vám poskytl nový server pro Eureku.

Comments