Spring注解之@FeignClient注解使⽤⽅法
声明接⼝时在代码中通过@Resource注⼊容器之后即可使⽤。@FeignClient注解的常⽤属性如下:
value/name:value和name的作⽤⼀样,⽤于指定FeignClient的名称;如果没有配置url,⽽且项⽬使⽤了Eureka、nacos或
者ribbon,name属性会作为微服务的名称,⽤于服务发现。反之,只是⼀个名称。此属性和 spring.application.name 对应。
url:⼀般⽤于调试,作⽤是指定@FeignClient调⽤的API地址,⽽⾮从服务中⼼获取。
url和name都可以使⽤占位符,⽐如:@FeignClient(name = “your.feign.name",url="${your.feign.url}”);
decode404:当发⽣http 404错误时,如果该字段为true,会调⽤decoder进⾏解码;否则,抛出FeignException。
configuration:Feign配置类,作⽤是⾃定义Feign的Encoder、Decoder、LogLevel、Contract。
fallback:定义容错的处理类,当调⽤远程接⼝失败或超时时,会调⽤对应接⼝的容错逻辑,fallback指定的类必须实现@FeignClient 标记的接⼝。
fallbackFactory:⼯⼚类,⽤于⽣成fallback类实例,实现每个接⼝通⽤的容错逻辑,减少重复的代码。
path:定义当前FeignClient的统⼀前缀。
contextId:为某个接⼝设置单独的超时,与与config⾥的属性对应。
添加依赖和启动注解
spring-boot-starter-parent版本是2.5.0,需要添加的maven坐标:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>3.0.4-SNAPSHOT</version>
</dependency>
添加启动注解:
@SpringBootApplication
@EnableFeignClients//添加这个注解
public class XXXXApplication {
public static void main(String[] args) {
SpringApplication.run(XXXXApplication.class, args);
}
}
沙场秋点兵
⾸先,在yaml⽂件中配置常量self.github.url=api.github,然后,创建接⼝类,此接⼝类定义了需要调⽤的⽬标服务中的⽅法,⽤Feign 官⽅⽂档中调⽤GitHub服务的例⼦来举例。
import com.swagger.demo.bean.Contributor;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import java.util.List;
//@FeignClient(name = "github", url = "api.github")
@FeignClient(name = "github", url = "${self.github.url}",
fallback = GithubFeignClient.MyDefaultFallback.class)
public interface GithubFeignClient {
@GetMapping(value = "/repos/{owner}/{repo}/contributors")
ResponseEntity<List<Contributor>> listContributors(
@PathVariable("owner") String owner,
@PathVariable("repo") String repo);
/**
* 容错处理类,当调⽤失败时,简单返回空list
*/
@Component
class MyDefaultFallback implements GithubFeignClient {
@Override
public ResponseEntity<List<Contributor>> listContributors(
@PathVariable("owner") String owner,
@PathVariable("repo") String repo) {
return new ResponseEntity(new ArrayList<>(), HttpStatus.BAD_REQUEST);
}
}
}
// --------- 新增实体类 -----------
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Setter
@Getter
spring怎么读取yaml@ToString
public class Contributor {
/
**
* 作者
*/
private String login;
/**
* 贡献次数
*/
private int contributions;
}
上述被注释的、使⽤注解@FeignClient的⽅法也可以使⽤。MyDefaultFallback类是容错类。下⾯创建⼀个controller:
import com.swagger.demo.bean.Contributor;
import com.swagger.demo.bean.GithubDTO;
import com.swagger.demo.service.GithubFeignClient;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@RestController
@RequestMapping("/github")
public class GithubClientController {
@Resource
private GithubFeignClient githubFeignClient;
@PostMapping("/listContributors")
public ResponseEntity<List<Contributor>> listContributors(@RequestBody GithubDTO githubDTO) {
return githubFeignClient.Owner(), Feign());
}
}
创建idea http类型的测试⽤例:
### 查询github 贡献者信息
POST localhost:8087/wiener/github/listContributors
Content-Type: application/json
{
"owner": "openFeign",
"feign": "feign"
}
启动服务,执⾏如上测试⽤例,执⾏结果如下所⽰,说明服务调⽤成功:
last-modified: Tue, 01 Feb 2022 03:52:53 GMT
link: <api.github/repositories/10981994/contributors?page=2>; rel="next", <api.github/repositories/10981994/contributors?page=6>; rel="last" [
{
"login": "adriancole",
"contributions": 135
},
{
"login": "velo",
"contributions": 126
},
{
"login": "kdavisk6",
"contributions": 121
},
{
"login": "snyk-bot",
"contributions": 45
},
{
"login": "quidryan",
"contributions": 43
},
{
"login": "rspieldenner",
"contributions": 14
},
{
"login": "davidmc24",
"contributions": 12
},
{
"login": "radio-rogal",
"contributions": 12
},
{
"login": "ahus1",
"contributions": 6
},
{
"login": "spencergibb",
"contributions": 5
},
{
"login": "ashleyfrieze",
"contributions": 5
},
{
"login": "allenxwang",
"contributions": 5
},
{
"login": "gimbimloki",
"contributions": 4
},
{
"login": "jkschneider",
"contributions": 4
},
{
"login": "nmiyake",
"contributions": 4
},
{
"login": "rfalke",
"contributions": 4
},
{
"login": "SimY4",
"contributions": 3
},
{
"login": "bstick12",
"contributions": 3
},
{
"login": "mstrYoda",
"contributions": 3
},
{
"login": "jacob-meacham",    "contributions": 3
},
{
"login": "pnepywoda",
"contributions": 3
},
{
"login": "santhosh-tekuri",    "contributions": 3
},
{
"login": "jerzykrlk",
"contributions": 3
},
{
"login": "Augustine-C",
"contributions": 2
},
{
"login": "benmanbs",
"contributions": 2
},
{
"login": "schlosna",
"contributions": 2
},
{
"login": "dharmeshjogadia",
"contributions": 2
},
{
"login": "edio",
"contributions": 2
},
{
"login": "androidfred",
"contributions": 2
},
{
"login": "stromnet",
"contributions": 2
}
]
⼩结
  以上就是这篇⽂章的全部内容了,希望本⽂对⼤家的学习或者⼯作具有⼀定的参考和学习价值;如果有疑问,⼤家可以在评论区留⾔交流,也希望⼤家多多点赞关注。谢谢⼤家对的⽀持!
Reference

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。