四、OpenFeign服务间调用之响应处理
1. 调用服务返回对象
- 被调用Share服务定义一个返回对象的接口
@RestController
@RequestMapping("shareConApi")
public class ShareController {
private static Logger log = LoggerFactory.getLogger(ShareController.class);
@GetMapping("findMember/{id}")
public MemberEntity findMember(@PathVariable("id") Long id) {
log.info("ID:{}", id);
return new MemberEntity(id, "xiaosan", 23, new Date());
}
}
- 调用方Friend服务开发需要调用的服务客户端接口
/**
* 调用Share服务的接口
*/
@FeignClient(value = "SHARE") // value=调用服务的ID
public interface ShareClients {
/**
* 声明调用share服务 findMember接口,获取member对象
*/
@GetMapping("shareConApi/findMember/{id}")
public MemberEntity findMember(@PathVariable("id") Long id);
}
- 调用方Friend调用客户端接口
@RestController
@RequestMapping("friendConApi")
public class FriendController {
private static Logger log = LoggerFactory.getLogger(FriendController.class);
@Resource
private ShareClients shareClients;
@GetMapping("invokeFindMember/{id}")
public MemberEntity invokeFindMember(@PathVariable("id") Long id) {
MemberEntity member = shareClients.findMember(id);
log.info("invokeFindMember success {}", member.toString());
return member;
}
}
- 启动测试
2. 调用服务返回List
- 被调用Share服务定义一个返回对象的接口
@RestController
@RequestMapping("shareConApi")
public class ShareController {
private static Logger log = LoggerFactory.getLogger(ShareController.class);
@GetMapping("findMemberList")
public List<MemberEntity> findMemberList(Long id) {
log.info("ID:{}", id);
// ... 根据业务逻辑返回member列表
List<MemberEntity> memberEntityList = new ArrayList<>();
memberEntityList.add(new MemberEntity(11L, "xiaosan", 21, new Date()));
memberEntityList.add(new MemberEntity(12L, "xiaosi", 22, new Date()));
memberEntityList.add(new MemberEntity(13L, "xiaowu", 23, new Date()));
return memberEntityList;
}
}
- 调用方Friend服务开发需要调用的服务客户端接口
/**
* 调用Share服务的接口
*/
@FeignClient(value = "SHARE") // value=调用服务的ID
public interface ShareClients {
/**
* 声明调用share服务 findList接口,获取member列表
*/
@GetMapping("shareConApi/findMemberList")
public List<MemberEntity> findMemberList(@RequestParam("id") Long id);
}
- 调用方Friend调用客户端接口
@RestController
@RequestMapping("friendConApi")
public class FriendController {
private static Logger log = LoggerFactory.getLogger(FriendController.class);
@Resource
private ShareClients shareClients;
@GetMapping("invokeFindMemberList")
public List<MemberEntity> invokeFindMemberList() {
List<MemberEntity> memberList = shareClients.findMemberList(1L);
memberList.forEach(memberEntity -> log.info("Member : {}", memberEntity.toString()));
return memberList;
}
}
- 启动测试
四、OpenFeign默认超时处理
1. 默认超时处理
使用OpenFeign组件在进行服务间通信时要求调用服务必须在1s内给予响应,一旦服务执行业务逻辑时间超过1s,OpenFeign组件将直接报错。
2. 模拟超时错误
@GetMapping("findMemberList")
public List<MemberEntity> findMemberList(Long id) {
log.info("ID:{}", id);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// ... 根据业务逻辑返回member列表
List<MemberEntity> memberEntityList = new ArrayList<>();
memberEntityList.add(new MemberEntity(11L, "xiaosan", 21, new Date()));
memberEntityList.add(new MemberEntity(12L, "xiaosi", 22, new Date()));
memberEntityList.add(new MemberEntity(13L, "xiaowu", 23, new Date()));
return memberEntityList;
}
调用接口后抛出错误信息
Read timed out executing …
3. 修改超时时间
在服务调用方(我这是friend服务)application.properties中增加配置
default所有服务
# 配置default所有服务默认连接时间和超时时间,默认时间1s
feign.client.config.default.connect-timeout=3000
feign.client.config..default.read-timeout=3000
测试
指定服务修改超时
# 配置指定服务默认连接时间和超时时间,默认时间1s
feign.client.config.SHARE.connect-timeout=3000
feign.client.config.SHARE.read-timeout=3000