Java HttpClient FeignClient

来源:互联网 发布:c语言顺序表的初始化 编辑:程序博客网 时间:2024/06/04 20:09

介绍:借用github上对Feign介绍的一句话——用Feign写HTTP客户端更轻松


Feign的入门可以完全参考github上的介绍

github Feign地址

https://github.com/OpenFeign/feign


还有一个比较不错的例子,里面有使用Feign自定义encoder和decoder来操作多媒体的demo

Feign-Client-Test

https://github.com/pcan/feign-client-test


Feign的内部机制是使用RestTemplate来实现

本文主要介绍SpringCloud项目里Feign作为客户端使用的一些知识点,以及常用的一些需求和场景。

需要注意的是单独使用Feign和SpringCloud里面使用Feign很多地方不一样。


SpringCloud里面只需添加如下引用即可

<dependency>   <groupId>org.springframework.cloud</groupId>   <artifactId>spring-cloud-starter-feign</artifactId></dependency>

在启动的Application上面加注解
@EnableFeignClients


Feign在SpringCloud集成Eureka的情况下可以直接使用@FeignClient(name="servicename") ,name是集成的服务名

当然,也可以在不调用服务的情况下使用Feign,下面上一段代码

@FeignClient(name = "bClientApi", url = "${apiclient.bclient.url}", fallback = IAuthRemoteService.BClientFallback.class,configuration = RemoteApiConfig.class)public interface IAuthRemoteService {    /**     * B端企业认证(code:1成功 0失败)     * @param dto     * @return     */    @RequestMapping(value = "/qual/company/authe", method = RequestMethod.POST)    Result companyAuth(@RequestBody CompanyAuthRemoteDTO dto, @RequestHeader("cookie") String cookie);       @Component    @Slf4j    class BClientFallback implements IAuthRemoteService{        @Override        public Result companyAuth(CompanyAuthRemoteDTO dto, String cookie) {            log.error("B端企业认证接口异常" + JSON.toJSONString(dto) + cookie);            return ResultGenerator.genFailResult("B端企业认证接口异常");        }            }}


name在新版本的Feign里面是必须的,可以不是service,而通过url指定,url支持占位符。


fallback是当HTTP请求发生异常时的回调,具体实现逻辑在该类继承的方法里面。

fallback只是在接口异常时执行类里面的实现,无法抓取具体的异常信息。

如果在FeignClient调用接口,接口服务出现异常的情况下需要提取异常信息,可以使用fallbackFactory.

具体示例如下

@FeignClient(value = "bClient", url = "${interfase.user.management}", fallbackFactory = IBClientServiceFallBackFactory.class)public interface IBClientService {    /**     * 获取B端账户企业信息     *     * @return     */    @RequestMapping(value = "/qual/company", method = RequestMethod.GET)    Result<BCompanyAuthInfo> getCompanyAuthInfo(@RequestHeader("cookie") String cookie);}
@Slf4j@Componentclass IBClientServiceFallBackFactory implements FallbackFactory<IBClientService> {    @Override    public IBClientService create(Throwable cause) {        return new IBClientService() {            @Override            public Result<BCompanyAuthInfo> getCompanyAuthInfo(String cookie) {                log.error("获取B端企业认证信息失败" + cookie + cause.getMessage());                Result<BCompanyAuthInfo> res = new Result<>();                res.setCode(ResultCode.FAIL.getCode());                res.setMessage("获取B端企业认证信息失败" + cause.getMessage());                return res;            }        };    }}


原生的Feign里面请求头的注解是打在方法上面,@Header(),Spring 集成后通过@RequestHeader给方法传参的方式实现,这点要注意。


configuration是Feign的配置信息,可以包括Feign客户端设置、编码解码、日志、Builder。


Spring集成的Feign在不同情况下由不同的组件生成,如果支持Hystrix断路器则交由它来生成Feign

如果不想断路器生成Feign而交由自己控制,则可以在configuration里面如下配置:

@Configurationpublic class FooConfiguration {    @Bean@Scope("prototype")public Feign.Builder feignBuilder() {return Feign.builder();}}


Feign的日志可以通过修改配置文件来实现,下面是对应的level:

logging.level.project.user.UserClient: DEBUG
  • NONE,无记录(DEFAULT)。

  • BASIC,只记录请求方法和URL以及响应状态代码和执行时间。

  • HEADERS,记录基本信息以及请求和响应标头。

  • FULL,记录请求和响应的头文件,正文和元数据


如果不想让Feign使用默认的RestTemplate调用HttpClient作为客户端可以通过将feign.okhttp.enabledfeign.httpclient.enabled设置为true,并将它们放在类路径上来使用OkHttpClient和ApacheHttpClient feign客户端。



原创粉丝点击