Http客户端--Feign简介

简介: Http客户端--Feign简介

@[TOC]

1 Feign简介

  • Feign是一个声明式的http客户端,作用就是帮助我们优雅的实现http请求的发送,解决RestTemplate的问题。

    1.1 RestTemplate发送get请求

          RestTemplateBuilder builder = new RestTemplateBuilder();
          RestTemplate restTemplate = builder.build();
          String url = "https://v2.alapi.cn/api/new/wbtop?num=100&token=4DZmP3cZ930V2z7X";
          String forObject = restTemplate.getForObject(url, String.class);
          JSONObject jsonObject = JSONObject.parseObject(forObject);
          Object data = jsonObject.get("data");
          List<WeiBoHotVO> dataJson = JSONObject.parseArray(data.toString(), WeiBoHotVO.class);
    

    1.2 RestTemplate发送post请求

  • 发送参数
          String url = "*****";
          MultiValueMap map = new LinkedMultiValueMap();
          map.add("username", username);
          map.add("password", password);
          ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, map, String.class);
          return responseEntity.getBody();
    
  • 发送json
          String url = "*****";
          Member member = new Member();
          member.setEmail(username);
          member.setPassword(password);
          ResponseEntity<Member> memberResponseEntity = restTemplate.postForEntity(url, member, Member.class);
          return memberResponseEntity.getBody();
    

    1.3 RestTemplate发送通用请求

    String url = "*****";
          HttpHeaders headers = new HttpHeaders();
          headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
          //设置访问参数
          HashMap<String, Object> params = new HashMap<>();
          params.put("username", username);
          //设置访问的Entity
          HttpEntity entity = new HttpEntity<>(params, headers);
          ResponseEntity<String> result;
          try {
         
              //发起一个POST请求
              result = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
              JSONObject data = JSONObject.parseObject(result.getBody()).getJSONObject("data");
              return data.getString("id");
          } catch (Exception e) {
         
          }
    

    2 Feign客户端的使用

    2.1 引入依赖

    <!-- SpringCloud Openfeign -->
          <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-starter-openfeign</artifactId>
          </dependency>
    

    2.2 第二步添加注解@EnableFeignClients

    @EnableFeignClients
    public @interface EnableMyFeignClients{
         
    }
    

    2.3 编写Feign客户端

    声明:服务名称、请求方式、请求路径、请求参数、返回值类型
    @FeignClient("userservice")
    public interface UserClient{
         
      @GetMapping("/user/{id}")
      User findById(@PathVariable("id" Long id));
    }
    

    3 Feign的自定义配置

  • 日志级别NONE、BASIC、HEADERS、FULL
  • 方式一:配置文件
    feign:
      client:
          config:
              default: #全局配置可以指定服务名称
                  loggerLevel: BASIC
    
  • 方式二: java代码
  • 自定义日志

    @Component
    public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserService>
    {
         
      private static final Logger log = LoggerFactory.getLogger(RemoteUserFallbackFactory.class);
    
      @Override
      public RemoteUserService create(Throwable throwable)
      {
         
          log.error("用户服务调用失败:{}", throwable.getMessage());
          return new RemoteUserService()
          {
         
              @Override
              public R<LoginUser> getUserInfo(String username, String source)
              {
         
                  return R.fail("获取用户失败:" + throwable.getMessage());
              }
    
              @Override
              public R<Boolean> registerUserInfo(SysUser sysUser, String source)
              {
         
                  return R.fail("注册用户失败:" + throwable.getMessage());
              }
          };
      }
    }
    
  • 使用自定义日志
    @FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)
    

    4 Feign的性能优化

    Feign底层的客户端实现:
  • URLConnection:默认实现,不支持连接池
  • Apache HttpClient:支持连接池
  • OKHttp:支持连接池
    性能优化主要包括:
  • 使用连接池代替默认的URLConnection

    # feign 配置
    feign:
    sentinel:
      enabled: true
    okhttp:
      enabled: true
    httpclient:
      enabled: false
    client:
      config:
        default:
          connectTimeout: 10000
          readTimeout: 10000
    compression:
      request:
        enabled: true
      response:
        enabled: true
    
  • 日志级别,最好用basic或none

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
6天前
|
JSON Java Apache
Spring Cloud Feign 使用Apache的HTTP Client替换Feign原生httpclient
Spring Cloud Feign 使用Apache的HTTP Client替换Feign原生httpclient
|
8天前
|
JSON 编解码 Go
Golang深入浅出之-HTTP客户端编程:使用net/http包发起请求
【4月更文挑战第25天】Go语言`net/http`包提供HTTP客户端和服务器功能,简化高性能网络应用开发。本文探讨如何发起HTTP请求,常见问题及解决策略。示例展示GET和POST请求的实现。注意响应体关闭、错误处理、内容类型设置、超时管理和并发控制。最佳实践包括重用`http.Client`,使用`context.Context`,处理JSON以及记录错误日志。通过实践这些技巧,提升HTTP编程技能。
22 1
|
9天前
|
Go 开发者
Golang深入浅出之-HTTP客户端编程:使用net/http包发起请求
【4月更文挑战第24天】Go语言的`net/http`包在HTTP客户端编程中扮演重要角色,但使用时需注意几个常见问题:1) 检查HTTP状态码以确保请求成功;2) 记得关闭响应体以防止资源泄漏;3) 设置超时限制,避免长时间等待;4) 根据需求处理重定向。理解这些细节能提升HTTP客户端编程的效率和质量。
15 1
|
12天前
|
JSON 测试技术 API
Python的Api自动化测试使用HTTP客户端库发送请求
【4月更文挑战第18天】在Python中进行HTTP请求和API自动化测试有多个库可选:1) `requests`是最流行的选择,支持多种请求方法和内置JSON解析;2) `http.client`是标准库的一部分,适合需要低级别控制的用户;3) `urllib`提供URL操作,适用于复杂请求;4) `httpx`拥有类似`requests`的API,提供现代特性和异步支持。根据具体需求选择,如多数情况`requests`已足够。
14 3
|
16天前
|
XML Java 数据格式
Servlet 教程 之 Servlet 客户端 HTTP 请求 3
该教程展示了如何在Servlet中处理客户端HTTP请求,特别是获取HTTP头信息。示例代码创建了一个名为`DisplayHeader`的Servlet,它扩展了`HttpServlet`并重写了`doGet`方法。在`doGet`中,使用`HttpServletRequest`的`getHeaderNames()`遍历所有头部,显示其名称和对应值。Servlet在TomcatTest项目下,通过`web.xml`配置映射到`/TomcatTest/DisplayHeader`路径。
29 14
|
16天前
|
安全 Java 网络安全
Servlet 教程 之 Servlet 客户端 HTTP 请求 2
Servlet教程介绍了如何在Servlet中处理HTTP请求,包括获取Cookie、头信息、参数、Session等。方法如:`getCookies()`、`getAttributeNames()`、`getHeaderNames()`、`getParameterNames()`等。还能获取身份验证类型、字符编码、MIME类型、请求方法、远程用户信息、URL路径、安全通道状态以及请求内容长度等。此外,可通过`getSession()`创建或获取Session,并以`Map`形式获取参数。
23 8
|
17天前
Servlet 教程 之 Servlet 客户端 HTTP 请求 1
Servlet教程讲解了客户端HTTP请求,包括各种重要头信息:Accept(定义可处理的MIME类型)、Accept-Charset(指定字符集)、Accept-Encoding(处理的编码类型)、Accept-Language(首选语言)、Authorization(身份验证)、Connection(是否支持持久连接)、Content-Length(POST数据大小)、Cookie(返回cookies)、Host(指定URL的主机和端口)、If-Modified-Since(检查页面更新)、If-Unmodified-Since(条件性操作)。
14 0
|
2月前
|
缓存 前端开发
HTTP协议基本原理简介(三)
HTTP协议基本原理简介(三)
18 1
|
2月前
|
网络协议 Linux
HTTP协议基本原理简介(二)
HTTP协议基本原理简介(二)
27 1
|
2月前
|
监控 网络安全 C++
Qt 5.14.2 网络编程揭秘:构建高效HTTP客户端与文件下载器
Qt 5.14.2 网络编程揭秘:构建高效HTTP客户端与文件下载器