1. 程式人生 > >Eureka客戶端-服務消費者(Ribbon+Hystrix)

Eureka客戶端-服務消費者(Ribbon+Hystrix)

1、pom.xml

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.SR1</spring-cloud.version>
    </properties>
    <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>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!--restTemplate要用到-->
        </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-netflix-ribbon</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <!--客戶端只有當我們有了這個依賴之後,才能有那些狀態頁面的檢視,否則會報ErrorPage-->
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
    </dependencies>

2、application.yml

spring:
  application:
    name: eureka-client-consumer-ribbon-hystrix
server:
  port: 8604
eureka:
  instance:
    prefer-ip-address: true
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

3、簡單的Ribbon的使用

(1)服務提供者

@RequestMapping("/getUUid/{i}")
    public String getUUid(@PathVariable("i") Integer i){
        UUID uuid = UUID.randomUUID();
        String s = i + "==="+uuid.toString();
        return s;
    }

(2)服務消費者

@RestController
public class ConsumerController {
    @Autowired
    RestTemplate restTemplate;
    @HystrixCommand(fallbackMethod = "getUUidFallback")
    @RequestMapping("/getUUid/{i}")
    public String getUUid(@PathVariable Integer i){
        return restTemplate.getForObject("http://eureka-client-provider/getUUid/"+i,String.class);
    }
    public String getUUidFallback(Integer i){ //引數和返回值必須和原方法一致,否則再呼叫的時候會報錯
        return "getUUidFallback使用了";
    }
}

(3)服務消費者啟動類

@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public class EurekaconsumerribbonhystrixApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaconsumerribbonhystrixApplication.class, args);
    }
    @Bean
    @LoadBalanced
    RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

4、關於Hystrix中傳播安全上下文這部分

@HystrixCommand(fallbackMethod = "getUUidFallback",commandProperties = {@HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE")})
    @RequestMapping("/getUUid/{i}")
    public String getUUid(@PathVariable Integer i){
        return restTemplate.getForObject("http://eureka-client-provider/getUUid/"+i,String.class);
    }

大概應該是:

       semaphore模式表示的是,我們的getUUid方法和getUUidFallback方法是在同一個執行緒裡面,

       thread模式表示的是,兩個方法再不同的執行緒裡面,預設的是thread模式

5、健康指標

Finchley.SR1版本就我目前掌握的,/health端點下面只有

    

看視訊查部落格大部分都是Brixton版本的,暫且將這種現象理解成版本不一致的正常現象吧。

6、Hystrix指標流

和Brixton版本不同的是,我們不僅要加入依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <!--客戶端只有當我們有了這個依賴之後,才能有那些狀態頁面的檢視,否則會報ErrorPage-->
        </dependency>

這個依賴健康指標檢視的時候也要加。

還要加入配置:

management:
  endpoints:
    web:
      exposure:
        include: hystrix.stream,health,info

include:中的端點值用逗號分隔開來

注意,預設情況下我們只能訪問health和info端點的,如果我們加了這個配置,將會覆蓋掉預設的配置,也就是說如果我們再這個配置裡面不加入health和info端點,那麼兩個端點將不能被訪問。