2018-08-24 Set up Provider/Consu
Background
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
1. Server side configuration
eureka:
instance:
hostname: peer3
ip-address: 127.0.0.1
prefer-ip-address: true
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://127.0.0.1:8761/eureka/
server:
enable-self-preservation: true
eviction-interval-timer-in-ms: 3000
The Down
items will always be displayed on the home-page of Eureka-Server, when enable-self-preservation
is set to be true
.
We don't want the Down
items to be removed from the list, since we want to know exactly which one should be fixed. By keeping this, we will be able to know which items are down at a glance.
We can set enable-self-preservation
to be false
under test-environment, to avoid mess items registered during debug-process.
2. Provider side configuration
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
application.yml
eureka:
instance:
lease-renewal-interval-in-seconds: 10
lease-expiration-duration-in-seconds: 30
client:
register-with-eureka: true
fetch-registry: false
should-unregister-on-shutdown: false
service-url:
defaultZone: http://127.0.0.1:8761/eureka/
We want the provider to send heartbeat to the Eureka-Server each 10 seconds. Value of lease-expiration-duration-in-seconds
will not take effect, since the Eureka-Server will not remove any registered items from its list.
The provider should go with register-with-eureka
as true
, since consumer need to discover it from the Eureka-Server.
We need to set should-unregister-on-shutdown
to be false
, so the Eureka-Server will consider the provider to be Down
when the provider exited unexpectedly. If we set it to be true
, the related item on Eureka-Server will always be displayed as Up
, even if the provider itself exited abnormally.
3. Consumer side configuration
pom.xml
<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>
application.yml
server:
port: 9111
spring:
application:
name: test-consumer
eureka:
instance:
prefer-ip-address: true
client:
register-with-eureka: false
fetch-registry: true
service-url:
defaultZone: http://127.0.0.1:8763/eureka/
Application.java
package hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class Application {
public static void main(String args[]) {
SpringApplication.run(Application.class, args);
}
}
Controller
package hello;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class TestController {
@LoadBalanced
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
@Autowired
RestTemplate restTemplate;
private static final Logger log = LoggerFactory.getLogger(Application.class);
@RequestMapping("/hello")
public String Hello() {
Greeting quote = this.restTemplate.getForObject("http://TEST-PROVIDER/blog", Greeting.class);
log.warn(quote.getId() + " , " + quote.getContent());
return "hello~";
}
}
4. Enable security for Eureka-Server
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
WebSecurityConfig.java
package hello;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.csrf().disable();
http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
}
}
application.yml
security:
user:
name: user
password: password123
5. Test Scenarios
Scenario 1
- Eureka-Server is up, with
enable-self-preservation: true
- Provider is not running, so nothing registered to Eureka-Server.
- Consumer is trying to invoke something from Provider.
Consumer will raise exception
java.lang.IllegalStateException: No instances available for TEST-PROVIDER
Scenario 2
- Eureka-Server is up, with
enable-self-preservation: true
- Provider with
should-unregister-on-shutdown: false
- Provider is running, registered to Eureka-Server and is up.
- Consumer is trying to invoke something from Provider.
Success.
Scenario 3
- Eureka-Server is up, with
enable-self-preservation: true
- Provider with
should-unregister-on-shutdown: false
- Provider is running, registered to Eureka-Server and is up.
- Provider is off-line, without un-registration
- Provider is displayed as
Down
on Eureka-Server. - Consumer is trying to invoke something from Provider.
Consumer will raise exception
java.lang.IllegalStateException: No instances available for TEST-PROVIDER
Scenario 4
- Eureka-Server is up, with
enable-self-preservation: true
- Provider with
should-unregister-on-shutdown: false
- Provider-A is running, registered to Eureka-Server and is up.
- Provider-A is off-line, without un-registration.
- Provider-A will always be displayed as
Down
on Eureka-Server. - Provider-B is running, with same name as Provider-A.
- Consumer is trying to invoke something from Provider.
Success. Provider-B is used.
Scenario 5
- Eureka-Server is up, with
enable-self-preservation: true
- Provider with
should-unregister-on-shutdown: false
- Provider-A is running, registered to Eureka-Server and is up.
- Provider-A is off-line, without un-registration.
- Provider-A will always be displayed as
Down
on Eureka-Server. - Provider-A is running again.
- Consumer is trying to invoke something from Provider.
Success.
Scenario 6
- Eureka-Server is up, with
enable-self-preservation: true
- Provider with
should-unregister-on-shutdown: false
- Provider-A is running, registered to Eureka-Server and is up.
- Provider-B is running, registered to Eureka-Server and is up.
- Provider-A is off-line, without un-registration.
- Consumer is trying to invoke something from Provider.
Success. Provider-B is used.
Scenario 7
- Eureka-Server is up, with
enable-self-preservation: true
- Provider with
should-unregister-on-shutdown: false
- Provider-A is running, registered to Eureka-Server and is up.
- Provider-B is running, registered to Eureka-Server and is up.
- Both Provider-A & Provider-B are off-line, without un-registration.
- Consumer is trying to invoke something from Provider, immediately after providers are down.
Consumer will raise exception
Request processing failed; nested exception is org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://TEST-PROVIDER/blog": Connection refused
Scenario 8
- Eureka-Server is up, with
enable-self-preservation: true
- Provider with
should-unregister-on-shutdown: false
- Provider-A is running, registered with name-A, providing service-A.
- Provider-B is running, registered with name-B, providing service-B.
- Consumer is trying to invoke service-B.
Depends on the load-balance. Pass, if Provider-B is selected; Exception
org.springframework.web.client.HttpClientErrorException: 404 null
, if Provider-A is selected.