SpringCloud之@FeignClient()注解的使⽤⽅式
⽬录
@FeignClient()注解的使⽤
@FeignClient标签的常⽤属性如下
SpringCloud服务间互相调⽤@FeignClient注解
我在FEIGN-CONSUMER
在FEIGN-CONSUMER
这是项⽬中的Controller层
@FeignClient()注解的使⽤
由于SpringCloud采⽤分布式微服务架构,难免在各个⼦模块下存在模块⽅法互相调⽤的情况。⽐如service-admin服务要调⽤service-card 服务的⽅法。
@FeignClient()注解就是为了解决这个问题的。
@FeignClient()注解的源码要求它必须在Interface接⼝上使⽤。( FeignClient注解被@Target(ElementType.TYPE)修饰,表⽰FeignClient注解的作⽤⽬标在接⼝上)
@RequestLine与其它请求不同,只需要简单写请求⽅式和路径就能达到请求其它服务的⽬的。
@FeignClient(value = "feign-server",configuration = FeignConfig.class) //需要⼀个配置⽂件
public interface TestService {
@RequestLine("POST /feign/test") //对应请求⽅式和路径
String feign(@RequestBody UserDO userDO);
}
@EnableFeignClients
@SpringBootConfiguration
public class FeignConfig {
@Bean
public Contract contract(){
return new feign.Contract.Default();
}
}
@FeignClient标签的常⽤属性如下
value: 服务名
name: 指定FeignClient的名称,如果项⽬使⽤了Ribbon,name属性会作为微服务的名称,⽤于服务发现
url: url⼀般⽤于调试,可以⼿动指定@FeignClient调⽤的地址
decode404:当发⽣http 404错误时,如果该字段位true,会调⽤decoder进⾏解码,否则抛出FeignException
configuration: Feign配置类,可以⾃定义Feign的Encoder、Decoder、LogLevel、Contract
fallback: 定义容错的处理类,当调⽤远程接⼝失败或超时时,会调⽤对应接⼝的容错逻辑,fallback指定的类必须实现@FeignClient标记的接⼝
fallbackFactory: ⼯⼚类,⽤于⽣成fallback类⽰例,通过这个属性我们可以实现每个接⼝通⽤的容错逻辑,减少重复的代码path: 定义当前FeignClient的统⼀前缀
此外还要求服务的启动类要有@EnableFeignClients 注解才能使Fegin⽣效。
SpringCloud 服务间互相调⽤ @FeignClient注解
SpringCloud搭建各种微服务之后,服务间通常存在相互调⽤的需求,SpringCloud提供了@FeignClient 注解⾮常优雅的解决了这个问题
⾸先,保证⼏个服务都在⼀个Eureka中注册成功形成服务场。
如下,我⼀共有三个服务注册在服务场中。COMPUTE-SERVICE ; FEIGN-CONSUMER ; TEST-DEMO;
我在FEIGN-CONSUMER
服务中调⽤其他两个服务的两个接⼝
分别为get带参和post不带参两个接⼝如下这个是COMPUTE-SERVICE中的get带参⽅法
@RequestMapping(value = "/add" ,method = RequestMethod.GET)
public Integer add(@RequestParam Integer a, @RequestParam Integer b) {
ServiceInstance instance = LocalServiceInstance();
Integer r = a + b;
logger.info("/add, host:" + Host() + ", service_id:" + ServiceId() + ", result:" + r);
return r;
}
如果要在FEIGN-CONSUMER 服务中调⽤这个⽅法的话,需要在 FEIGN-CONSUMER 中新建⼀个接⼝类专门调⽤某⼀⼯程中的系列接⼝
@FeignClient("compute-service")
public interface ComputeClient {
@RequestMapping(method = RequestMethod.GET, value = "/add")
Integer add(@RequestParam(value = "a") Integer a, @RequestParam(value = "b") Integer b);
}
其中,@FeignClient注解中标识出准备调⽤的是当前服务场中的哪个服务,这个服务名在⽬标服务中的配置中取
spring.application.name
接下来,在@RequestMapping中设置⽬标接⼝的接⼝类型、接⼝地址等属性。然后在下⾯定义接⼝参数以及返回参数
在FEIGN-CONSUMER
Controller层调⽤⽅法的时候
将上⾯接⼝注⼊进来,就可以直接⽤了
@Autowired
ComputeClient computeClient;
@RequestMapping(value = "/add", method = RequestMethod.GET)
public Integer add() {
return computeClient.add(10, 20);
}
当然,post⽅法同理:
这是⽬标接⼝:
@RestController
@RequestMapping("/demo")
@EnableAutoConfiguration
springcloud和springbootpublic class HelloController {
@RequestMapping(value = "/test",method = RequestMethod.POST)
String test1(){
return "hello,test1()";
}
}
这是在本项⽬定义的接⼝⽂件:
@FeignClient("test-Demo")
public interface TestDemo {
@RequestMapping(method = RequestMethod.POST, value = "/demo/test") String test();
}
这是项⽬中的Controller层
@RestController
public class ConsumerController {
@Autowired
TestDemo testDemo;
@Autowired
ComputeClient computeClient;
@RequestMapping(value = "/add", method = RequestMethod.GET)
public Integer add() {
return computeClient.add(10, 20);
}
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String test() {
st();
}
}
最终调⽤结果如下:
OK 服务间接⼝调⽤就是这样了!
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论