2018-08-24 Set up Provider/Consu

2018-08-24  本文已影响0人  猪迹

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

Consumer will raise exception java.lang.IllegalStateException: No instances available for TEST-PROVIDER

Scenario 2

Success.

Scenario 3

Consumer will raise exception java.lang.IllegalStateException: No instances available for TEST-PROVIDER

Scenario 4

Success. Provider-B is used.

Scenario 5

Success.

Scenario 6

Success. Provider-B is used.

Scenario 7

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

Depends on the load-balance. Pass, if Provider-B is selected; Exception org.springframework.web.client.HttpClientErrorException: 404 null, if Provider-A is selected.

References:

上一篇下一篇

猜你喜欢

热点阅读