在服务消费方引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在启动类上添加注解@EnableFeignClients
@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
@EnableFeignClients
public class UserConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(UserConsumerApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
}
}
在dao下添加一个接口
@FeignClient(value = "user-service", path = "user", fallback = UserFeignClientFallback.class)
public interface UserClient {
@GetMapping("findUser/{id}")
User findUserById(@PathVariable("id") Integer id);
}
在service 中使用
@Service
public class UserService {
/*@Autowired
private UserDao userDao;
public List<User> findUserByIds(List<Integer> ids){
ArrayList<User> users = new ArrayList<>();
for (Integer id : ids) {
User user = this.userDao.findUserById(id);
users.add(user);
}
return users;
}*/
@Autowired
private UserClient userClient;
public List<User> findUserByIds(List<Integer> ids) {
ArrayList<User> users = new ArrayList<>();
for (Integer id : ids) {
User user = this.userClient.findUserById(id);
users.add(user);
}
return users;
}
}
在浏览器中测试(注释掉服务提供者中线程睡眠代码)
二、Feign中的Ribbon和Hystrix
通过依赖可以看到Feign的依赖中已经将Ribbon和Hystrix的依赖添加进来了,已经默认的开启了Ribbon的负载均衡策略
配置Ribbon的重试机制的时候,可以不用指定某个服务名称,可以全局配置,而熔断则需要通过配置来开启
server:
port: 8082
spring:
application:
name: user-consumer
cloud:
loadbalancer:
retry:
enabled: true # 开启重试
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka
fetch-registry: true #拉取Eureka Server服务的列表只读备份,然后缓存在本地
registry-fetch-interval-seconds: 5 #每隔5秒重新拉取并更新数据,生产环境30
feign:
hystrix:
enabled: true # 开启Feign的熔断功能
ribbon:
ConnectTimeout: 250 # Ribbon的连接超时时间 ms
ReadTimeout: 1000 # Ribbon的数据读取超时时间
OkToRetryOnAllOperations: true # 是否对所有操作都进行重试
MaxAutoRetriesNextServer: 1 # 切换实例的重试次数
MaxAutoRetries: 1 # 对当前实例的重试次数
logging:
level:
org.springframework: debug
com.liaoxiang: debug
开启熔断后,同样可以指定熔断处理逻辑,并在Feign客户端中使用
@Component
public class UserFeignClientFallback implements UserClient {
@Override
public User findUserById(Integer id) {
User user = new User();
user.setId(id);
user.setName("用户查询出现异常!");
return user;
}
}
@FeignClient(value = "user-service", path = "user", fallback = UserFeignClientFallback.class)
public interface UserClient {
@GetMapping("findUser/{id}")
User findUserById(@PathVariable("id") Integer id);
}
在服务提供者中添加超时异常,通过浏览器访问
从日志也可以看出,最后一次超时时,进行了重试,然后再熔断