1. Add api to get information
Continue previous article Quick guide to Spring Cloud Eureka.
Add some code in Client Eureka:
@SpringBootApplication
@RestController
public class SpringEurekaClientApplication {
Logger logger = Logger.getLogger(this.getClass().getSimpleName());
public static void main(String[] args) {
SpringApplication.run(SpringEurekaClientApplication.class, args);
}
@Value("${spring.application.name}")
private String appName;
@Autowired
private EurekaDiscoveryClient eurekaClient;
@GetMapping("/instances")
public List<ServiceInstance> instances() {
logger.info("GET instances");
return this.eurekaClient.getInstances(appName);
}
@GetMapping("/apps")
public List<String> list() {
logger.info("GET apps");
return this.eurekaClient.getServices();
}
@GetMapping("/info")
public ServiceInstance info() {
logger.info("GET this instance's information");
return this.eurekaClient.getInstances(appName).get(this.eurekaClient.getOrder());
}
}
Run twice Eureka Client.
2. Ribbon Client without Eureka
2.1. Dependency
<dependencies>
<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>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.2. Configure
In application.yml file:
spring:
application:
name: spring-cloud-ribbon
server:
port: 8083
spring-cloud-eureka-client-config:
ribbon:
eureka:
enabled: false
listOfServers: localhost:8081,localhost:8082
ServerListRefreshInterval: 15000
Assume 2 Eureka Servers run at 8081 and 8082 port.
Create new config class with name RibbonConfiguration:
public class RibbonConfiguration {
@Autowired
IClientConfig ribbonClientConfig;
@Bean
public IPing ribbonPing(IClientConfig config) {
return new PingUrl();
}
@Bean
public IRule ribbonRule(IClientConfig config) {
return new WeightedResponseTimeRule();
}
}
Add a api to demo load balancing
@SpringBootApplication
@RestController
@RibbonClient(name = "spring-cloud-eureka-client-config",
configuration = RibbonConfiguration.class)
public class SpringRibbonApplication {
public static void main(String[] args) {
SpringApplication.run(SpringRibbonApplication.class, args);
}
@LoadBalanced
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
@Autowired
RestTemplate restTemplate;
@RequestMapping("/info/{service-name}")
public Object serverLocation(@PathVariable("service-name") String serviceName) {
return this.restTemplate.getForObject(
"http://" + serviceName + "/info", Object.class);
}
}
Testing add http://localhost:8083/info/spring-cloud-eureka-client-1
3. Ribbon Client with Eureka and Feign
3.1. Dependency
<dependencies>
<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.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.2. Configure
In application.yml file:
spring:
application:
name: spring-cloud-ribbon
server:
port: 8083
eureka:
client:
serviceUrl:
defaultZone: ${EUREKA_URI:http://localhost:8761/eureka}
instance:
preferIpAddress: true
instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
Add a api to demo load balancing
@SpringBootApplication
@RestController
@EnableFeignClients
public class SpringRibbonApplication {
public static void main(String[] args) {
SpringApplication.run(SpringRibbonApplication.class, args);
}
@Autowired
private SpringCloudEurekaClient springCloudEurekaClient;
@RequestMapping("/info")
public Object serverLocation() {
return this.springCloudEurekaClient.getInfo();
}
@FeignClient("spring-cloud-eureka-client-1")
interface SpringCloudEurekaClient {
@RequestMapping(value = "/info", method = GET)
Object getInfo();
}
}
Testing add http://localhost:8083/info