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端点,那么两个端点将不能被访问。