美文网首页
2018-08-24 Set up Provider/Consu

2018-08-24 Set up Provider/Consu

作者: 猪迹 | 来源:发表于2018-08-24 13:53 被阅读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

    • 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.

    References:

    相关文章

      网友评论

          本文标题:2018-08-24 Set up Provider/Consu

          本文链接:https://www.haomeiwen.com/subject/ipvbiftx.html