实现服务间的调用
Feign和RestTemplate一样,也是HTTP客户端请求工具,
openfeign是 Spring 官方推出的一种声明式服务调用与负载均衡组件,它的出现就是为了替代进入停更维护状态的 Feign
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在启动类添加@EnableFeignClients
注解
需要调用其他微服务提供的接口时直接创建一个对应服务的接口类即可
@FeignClient("userservice") //声明为userservice服务的HTTP请求客户端
public interface UserClient {
}
直接创建所需类型的方法
@FeignClient("userservice")
public interface UserClient {
//路径保证和其他微服务提供的一致即可
@RequestMapping("/user/{uid}")
User getUserById(@PathVariable("uid") int uid); //参数和返回值也保持一致
}
相当于
RestTemplate template = new RestTemplate();
User user = template.getForObject("http://userservice/user/"+uid, User.class);
@Service
public class BorrowServiceImpl implements BorrowService {
@Resource
BorrowMapper mapper;
@Resource
UserClient userClient;
@Resource
BookClient bookClient;
@Override
public UserBorrowDetail getUserBorrowDetailByUid(int uid) {
List<Borrow> borrow = mapper.getBorrowsByUid(uid);
//直接使用相应的接口调用服务
User user = userClient.getUserById(uid);
List<Book> bookList = borrow
.stream()
.map(b -> bookClient.getBookById(b.getBid()))
.collect(Collectors.toList());
return new UserBorrowDetail(user, bookList);
}
}
实现服务降级
Hystrix也可以配合Feign进行降级,可以对应接口中定义的远程调用单独进行降级操作
Feign都是以接口的形式来声明远程调用,那么既然远程调用已经失效,可以自行对其进行实现,创建一个实现类,对原有的接口方法进行替代方案的实现并注册为Bean
@Component //注意,需要将其注册为Bean,Feign才能自动注入
public class UserFallbackClient implements UserClient{
@Override
public User getUserById(int uid) { //这里我们自行对其进行实现,并返回我们的替代方案
User user = new User();
user.setName("我是替代方案");
return user;
}
}
再在原有的接口中指定失败替代实现即可
//fallback参数指定为我们刚刚编写的实现类
@FeignClient(value = "userservice", fallback = UserFallbackClient.class)
public interface UserClient {
@RequestMapping("/user/{uid}")
User getUserById(@PathVariable("uid") int uid);
}
还要在配置文件中开启熔断支持
feign:
circuitbreaker:
enabled: true