Adnotacja @LoadBalanced
Adnotacja @LoadBalanced
Z tego artykułu dowiesz się w jaki sposób działa adnotacja @LoadBalanced w przykładowym projekcie Spring Boota. Utworzymy dwa projekty, pierwszy mikroserwis będzie wywoływał endpointy drugiego mikroserwisu który z kolei będzie wystawiony na 3 różnych portach (instancjach mikroserwisu). Request trafi na poszczególną instancję z użyciem algorytmu Ribbon.
Projekt mikroserwisu – Master:
Tworzymy nowy projekt Spring Boota – plik pom.xml – niezbędne zależności:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR9</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
[UWAGA] Spring Cloud Hoxton.SR9 nie działa z wersją Spring 2.4.4, wybierzmy zatem wersję:
2.3.3.RELEASE
Klasa konfiguracyjna:
@Configuration public class Config { @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } }
Tworzymy klasę kontrolera która z użyciem RestTemplate będzie wywoływać endpoint innego mikroserwisu:
@RestController @RibbonClient(name = "master") public class MasterController { @Autowired RestTemplate restTemplate; @GetMapping("/worker") public String getWorkerPortInstance() { String url = "http://master/getWorker/port"; String port = "[port] : " + restTemplate.getForObject(url, String.class); return port; } }
Plik application.properties: – lista dostępnych instancji (8081, 8082, 8083):
master.ribbon.eureka.enabled = false master.ribbon.listOfServers = localhost:8081, localhost:8082, localhost:8082
Projekt mikroserwisu – Worker:
W tym projekcie należy utworzyć prosty endpoint:
@RestController @RequestMapping("/getWorker") public class WorkerController { @Value("${server.port}") private String port; @GetMapping("/port") public String getPort() { return port; } }
Wykonujemy testy!
Uruchamiamy projekt Worker na 3 instancjach (8081, 8082, 8083) – w środowisku Intellij należy włączyć opcję uruchamiania aplikacji na kilku portach:
Uruchamiamy projekt Master na porcie 8080 i wykonujemy request:
http://localhost:8080/worker/
w wyniku otrzymujemy w zależności od tego na jaką instancję trafił request:
[port] : 8081
lub:
[port] : 8082
lub:
[port] : 8083
Kolejność determinowana jest algorytmem Ribbon!
Leave a comment