ebbe
注解FeignClient的规范使⽤but
⾸先是对FeignClient⾥的常⽤属性
1. contextId ,当有多个服务调⽤⽅法不想写在⼀个接⼝⾥,就要使⽤到
2. name:指定FeignClient的名称,如果项⽬使⽤了Ribbon,name属性会作为微服务的名称,⽤于服务发现
3. url: url⼀般⽤于调试,可以⼿动指定@FeignClient调⽤的地址
4. fallback: 定义容错的处理类,当调⽤远程接⼝失败或超时时,会调⽤对应接⼝的容错逻辑,fallback指定的类必须实现
@FeignClient标记的接⼝
5. fallbackFactory: ⼯⼚类,⽤于⽣成fallback类⽰例,通过这个属性我们可以实现每个接⼝通⽤的容错逻辑,减少重复
的代码
6. path: 定义当前FeignClient的统⼀前缀
使⽤FeignClient的原因
⽆⾮让⼀个微服务的接⼝被另⼀个服务访问,微服务的⼀个特点就是业务隔离,那就要尽量的做到数据库隔离,虽 然不是真的隔离,但是要尽量在代码上做隔离。举例,系统有⼀个file-rver,是系统的公共服务,附件的下载,上传,获取内容等接⼝实现。对应操作的表是系统附件表。现在客户的信息⾥有附,正常是在客户与附件之间做连表查询,将附件信息拿到,但是在微服务⾥这样⼦做是不合规的。现在如果进⾏如下的引⽤
在controller类⾥定义的接⼝⽅法
//在controller类⾥定义的接⼝⽅法
@RequestMapping(value = "/add" ,method = RequestMethod.GET)
public Integer add(@RequestParam Integer a, @RequestParam Integer b) {
ServiceInstance instance = LocalServiceInstance();
overnight deliveryInteger r = a + b;
跌倒英语
logger.info("/add, host:" + Host() + ", rvice_id:" + ServiceId() + ", result:" + r);
学雷锋演讲稿
气球的英文单词return r;
}
使⽤@FeignClient
moxa
@FeignClient("compute-rvice")
public interface ComputeClient {
@RequestMapping(method = RequestMethod.GET, value = "/add")
Integer add(@RequestParam(value = "a") Integer a, @RequestParam(value = "b") Integer b);
}
然后在另⼀个微服务⾥的controller层调⽤
@Autowired
ComputeClient computeClient;
@RequestMapping(value = "/add", method = RequestMethod.GET)
public Integer add() {
return computeClient.add(10, 20);
}
只能说使⽤成功了,但是不规范,这是⽹上随处可见的错误规范,⼀开始我也是错误的在controll层引⽤,但是被技术经理叼了,反正就是不合规。理由很简单,给前端的接⼝不要重复。如果你这边controller调⽤原来的服务,不管是哪个微服务的,前端是可以直接访问的,那这样⼦的意义何在。接⼝给你调⽤,是让你⽤来获取有⽤的信息来处理,然后返回给前端。所以应该在rver层调⽤。
规范的使⽤@FignClient注解
tweak以公共服务中的⽂件服务和客户业务模块进⾏服务间的通信为例
在⽂件服务的api模块⾥写如下
FeignClient(contextId = "fileService", value = ServicellaneConstants.FTLE_SERNVTCE,fallbackFactory=RenoteFileFallbackFactory.class)
public interface RemoteFilervice {
/**
*上传⽂件*
* aparam file ⽂件信息*areturn结果
*/
@PostMapping(value = "/upload",consumes = MediaType.WULTIPART_FORN_DATA_VALUE)
public RcLong uplocad(CRequestParan("module ) String nodole ,ORequestParan("sunceId ) String souneId, OlequestFart(value = "file ") liltigartFile file);
此时在客户业务板块,即客户需要和附件进⾏相关信息的1对多查询,不能连表查询,那就调⽤上⾯的RemoteFilervice ,⼀开始我在客户模块⾥写了⼀个FileController,然后写接⼝,接⼝⾥调⽤,直接NO。应该在业务层⾥调⽤就好了,⽤注解@Autowired,将你需要处理的数据获取到并处理好。
接下来看看fallbackFactory,主要是为降级处理就是出错了应该返回什么。代码仅供参考,可能还会有其它 的写法
//注意FallbackFactory<;你注解对应的接⼝类名>
@component
public class RemoteFileFallbackFactory implements FallbackFactory<RemoteFileService>
private static final Logger log = Logger(RemoteFileFallbackFactory.class);
0verride
public RemoteFilervice create(Throwable throwable){
//打印出错⽇志
damages<("⽂件朋务调⽤失败:{}", Hessage());return new RemoteFilerviceo
{
Override
public R<Long> upload(String module,String sourceId,MultipartFile file){
return R.fail("上传失败:" + Message(o);
}
0verride
public byte[ ] getFileBytes(Long fileId) { return new byte[0];}
@0verride
public R getURL(Long[] ids) { return R.fail("获取⽂件URL失败:" + Hessage());}
@0verride
public R<List<SysFileApivo>> getURL(List<Long> ids) {
return R.fail("获取⽂件URL失败:" + Message());
}
};
想要怎么⽤,就动⼿实践吧
food additives