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!

Zobacz kod na GitHubie i zapisz się na bezpłatny newsletter!

.

Leave a comment

Your email address will not be published.


*