我尝试过Feign来配置Hystrix。在浏览器地址栏中输入127.0.0.1:8100/test。无论是配置了fallback还是fallbackFactory,提示的结果都是:“com.netflix.client.ClientException:负载均衡器没有客户端的可用服务器:microservice-provider-user”,这说明回退不是工作。
调节器
@Import(FeignClientsConfiguration.class)
@RestController
public class TestController {
private UserFeignClient userFeignClient;
private UserFeignClient adminFeignClient;
@Autowired
public TestController(Decoder decoder, Encoder encoder, Client client, Contract contract) {
this.userFeignClient = Feign.builder().client(client).encoder(encoder)
.decoder(decoder).contract(contract)
.requestInterceptor(new BasicAuthRequestInterceptor("user", "user"))
.target(UserFeignClient.class, "http://microservice-provider-user/");
this.adminFeignClient = Feign.builder().client(client).encoder(encoder)
.decoder(decoder).contract(contract)
.requestInterceptor(new BasicAuthRequestInterceptor("admin", "admin"))
.target(UserFeignClient.class, "http://microservice-provider-user/");
}
@GetMapping("/test")
@ResponseBody
public String test() {
return userFeignClient.findById(123L);
}
@GetMapping("/testAdmin")
@ResponseBody
public String test2() {
return adminFeignClient.findById(123L);
}
}
主要方法
@SpringBootApplication
@EnableFeignClients
@EnableHystrixDashboard
@EnableHystrix
@EnableCircuitBreaker
public class Demo2Application {
public static void main(String[] args) {
SpringApplication.run(Demo2Application.class, args);
}
}
倒退
@Component
public class FeignClientFallback implements UserFeignClient{
@Override
public String findById(Long id) {
return "hello FeignClientFallback";
}
}
gradle这个
plugins {
id 'org.springframework.boot' version '2.1.3.RELEASE'
id 'java'
}
apply plugin: 'io.spring.dependency-management'
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
ext {
set('springCloudServicesVersion', '2.1.2.RELEASE')
set('springCloudVersion', 'Greenwich.SR1')
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-hystrix'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-hystrix-dashboard'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-turbine'
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
dependencyManagement {
imports {
mavenBom "io.pivotal.spring.cloud:spring-cloud-services-dependencies:${springCloudServicesVersion}"
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
假装客户
@FeignClient(name = "microservice-provider-user", fallback = FeignClientFallback.class)
public interface UserFeignClient {
@GetMapping("/test2/{id}")
String findById(@PathVariable("id") Long id);
}
application.yml
spring:
application:
name: microservice-custom
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
healthcheck:
enabled: true
instance:
prefer-ip-address: true
server:
port: 8100
feign:
hystrix:
enabled: true
client:
config:
default:
connectTimeout: 1000
readTimeout: 1000
loggerLevel: basic
hystrix:
command:
default:
execution:
isolation:
strategy: SEMAPHORE
logging:
level:
com.lv.springCloudClient1.UserFeignClient: DEBUG
management:
endpoints:
web:
exposure:
include: '*'
理论上,如果我关闭“microservice-provider-user”服务器,我将获得fallback方法返回的内容。
@Import(FeignClientsConfiguration.class)
@RestController
public class TestController {
@Autowired
private UserFeignClient userFeignClient;
@Autowired
private UserFeignClient adminFeignClient;
@GetMapping("/test")
@ResponseBody
public String test() {
return userFeignClient.findById(123L);
}
@GetMapping("/testAdmin")
@ResponseBody
public String test2() {
return adminFeignClient.findById(123L);
}
}
我将以前的控制器代码更改为当前的控制器代码。 Hystrix后备方法是有效的。