OpenFeign在实际工作使用场景
本来在实际工作接触微服务项目使用到openfeign,不同的项目可能有不同的使用方式,下面是3种常见的使用场景
使用场景1:在各自的微服务定义Client
在各自的微服务定义Client,什么意思呢?
比如说目前有3个微服务,A,B服务是消费者,C服务是生产者。A和B都要去调用C的 interface1 接口,于是各自在自己项目里创建一个Client类,来达到目的。
1. 好处:各服务的开发人员的耦合性降低,不需要去管其他微服务是否也调用interface1 接口
2. 坏处:代码出现冗余
大致的Client类代码如下:
@FeignClient("cloud-payment-service")
@Component
public interface PaymentClient {
@GetMapping("/payment/get/{id}")
public CommonResult getPaymentById(@PathVariable("id") Long id);
}
使用场景2:在common模块定义Client
在common模块定义Client,恰好是解决代码出现冗余的情况,其他微服务只需要引入common模块就可以,达到共用Client的目的,大致代码如下:
@Component
@FeignClient("cloud-payment-service")
public interface PaymentApi {
@GetMapping("/payment/get/{id}")
public CommonResult getPaymentById(@PathVariable("id") Long id);
}
生产者服务接口:
@RestController
@Slf4j
public class PaymentController {
private DiscoveryClient discoveryClient;//获取注册中心上面的多个服务信息
@GetMapping("/payment/get/{id}")
public CommonResult getPaymentById(@PathVariable("id") Long id) {
....
}
}
和场景1的不同点在于所属模块的位置不一样而已,这种比较好点。
使用场景3:在common模块定义ClientApi,然后消费者继承ClientAPi,生产者服务实现ClientAPi
话不多说,直接上代码完事了:
- common模块定义ClientApi:
@RequestMapping("/storage/historyData")
public interface HistoryDataApi {
@PostMapping("/listHistoryDatas")
List<HistoryDataDTO> listHistoryDatas(@RequestBody HistoryDataSearch historyDataSearch);
}
- 生产者服务去实现该接口:
@RestController
public class HistoryDataController implements HistoryDataApi {
@Autowired
private IHistoryDataService iHistoryDataService;
@Override
public List<HistoryDataDTO> listHistoryDatas(HistoryDataSearch historyDataSearch) {
return iHistoryDataService.listHistoryDatas(historyDataSearch);
}
}
- 消费者服务创建Client接口去继承ClientApi:
@FeignClient("cloud-payment-service")
public interface HistoryDataClient extends HistoryDataApi {
}
总结
具体3种使用情况,看个人项目的情况决定,这种东西说不准的