【微服务】5、声明式 HTTP 客户端 —— Feign

这篇具有很好参考价值的文章主要介绍了【微服务】5、声明式 HTTP 客户端 —— Feign。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、RestTemplate 不好的地方

Long userId = orderById.getUserId();
String url = "http://userservice/users/getUserById/" + userId;
User userById = http.getForObject(url, User.class);

✏️ 代码可读性差、编程体验不统一
✏️ 当发送网络请求时的请求参数特别复杂的时候,URL 难以维护


二、Feign 是什么

✏️ Github 地址:https://github.com/OpenFeign/feign
✏️ Feign 是一个声明式的 HTTP 客户端
✏️ 可帮助开发者优雅地发送 HTTP 请求


三、使用

✏️ 依赖

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

✏️ 启动开关 @EnableFeignClients

@EnableFeignClients // 开启声明式 HTTP 客户端 Feign 的使用
@MapperScan("com.gq.order.mapper")
@SpringBootApplication
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

✏️ 编写 Feign 客户端(声明远程调用的信息)

基于 SpringMVC 注解声明远程调用的信息:
① 服务名称:userservice
② 请求方式:GET
③ 请求路径:/user/{id}
④ 请求参数:Long id
⑤ 返回值类型:User

@FeignClient("userservice") // 服务名称
public interface UserFeignClient {
    
    @GetMapping("/users/getUserById/{id}")
    User getById(@PathVariable String id);
}

@Service
@Transactional
public class OrderServiceImpl implements OrderService {
    @Resource
    private OrderMapper orderMapper;

    @Resource
    private UserFeignClient userFeignClient;

    /**
     * 根据订单 id 查询订单
     */
    @Transactional(readOnly = true)
    @Override
    public Order getOrderById(Long orderId) {
        Order orderById = orderMapper.getOrderById(orderId);

        if (orderById != null) {
            Long userId = orderById.getUserId();

            // 使用 Feign 发起远程调用
            User userById = userFeignClient.getById(userId + "");

            orderById.setUser(userById);
        }

        return orderById;
    }
}

四、自定义 Feign 的配置

(1) Feign 的几个常见配置

【微服务】5、声明式 HTTP 客户端 —— Feign

☘️ 一般修改的都是日志级别


(2) 配置 Feign 的日志级别

① 通过配置文件

全局配置:

feign:
  client:
    config:
      default: # default 是全局配置(若写服务名称, 则是针对该微服务的配置)
        loggerLevel: FULL # 日志级别

局部配置:

feign:
  client:
    config:
      userservice: # 写服务名称表示只针对该微服务的配置
        loggerLevel: FULL # 日志级别

② Java 代码配置日志级别

必须配置下面的配置结合 Feign 的日志配置才能有效果

logging:
  level:
    com.gq: debug

📖 创建 FeignClientConfiguration

/**
 * 对 Feign 的配置(该配置类在 Feign 相关的注解中使用)
 */
public class FeignClientConfiguration {
    @Bean
    public Logger.Level feignLogLevel() {
        return Logger.Level.FULL;
    }
}

📖 若是全局配置,将 FeignClientConfiguration 配置类放在 @EnableFeignClients 注解中

// 全局配置 Feign 的日志级别
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
@MapperScan("com.gq.order.mapper")
@SpringBootApplication
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

📖 若是局部配置,将 FeignClientConfiguration 配置类放在 @FeignClient 注解中

// 局部配置 Feign 的日志级别
@FeignClient(value = "userservice", configuration = FeignClientConfiguration.class)
public interface UserFeignClient {
    @GetMapping("/users/getUserById/{id}")
    User getById(@PathVariable String id);
}

五、Feign 性能优化

(1) 性能优化介绍

📔 Feign 底层的客户端实现方案:
URLConnection: 默认实现(不支持连接池)
Apache HttpClient:支持连接池
OKHttp:支持连接池

📔 以上 OKHttpURLConnectionApache HttpClient 是几种发送 HTTP 请求的客户端工具
📔 不使用连接池性能会很差


🍒 Feign 性能优化主要包括两个方面:
① 使用支持连接池的 HTTP 请求客户端 (如 Apache HttpClient、OKHttp) 代替 URLConnection

② 日志级别最好使用 BASIC或 NONE【debug 的时候才用 FULL】


(2) 修改 Feign 底层的 HTTP 请求客户端

🎁 添加 HttpClient 依赖

	<dependency>
	    <groupId>io.github.openfeign</groupId>
	    <artifactId>feign-httpclient</artifactId>
	</dependency>

🎁 在 yaml 文件配置连接池

feign:
  client:
    config:
      default:
        loggerLevel: BASIC # 打印基本的请求和响应信息
  httpclient:
    enabled: true # 开启 Feign 对 HttpClient 的支持
    max-connections: 168
    max-connections-per-route: 39 # 每个路径的最大连接数

六、Feign 的最佳实践

(1) 方式一:继承(不好,不推荐)

🎄 给消费者的 FeignClient 和提供者的 Controller 定义统一的父接口作为标准
【微服务】5、声明式 HTTP 客户端 —— Feign

(2) 方式二:抽取

🎄 将 Feign 抽取为独立的模块
【微服务】5、声明式 HTTP 客户端 —— Feign

当定义的 FeignClient 不在 SpringBootApplication 的扫描包范围时,FeignClient 将无法使用(解决方法如下)

🚀 指定 FeignClient 所在包

@EnableFeignClients(basePackages = {"com.guoqing.feign"})

【微服务】5、声明式 HTTP 客户端 —— Feign

🚀 指定 FeignClient 字节码文章来源地址https://www.toymoban.com/news/detail-410996.html

@EnableFeignClients(clients = {UserFeignClient.class})

到了这里,关于【微服务】5、声明式 HTTP 客户端 —— Feign的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot 3.0 新特性,内置声明式HTTP客户端

    从 Spring 6 和 Spring Boot 3 开始,Spring 框架支持将远程 HTTP 服务代理成带有特定注解的 Java http interface。类似的库,如 OpenFeign 和 Retrofit 仍然可以使用,但 http interface 为 Spring 框架添加内置支持。 声明式 http 客户端主旨是使得编写 java http 客户端更容易。为了贯彻这个理念,采用

    2024年02月01日
    浏览(58)
  • Http远程调用(feign客户端通过POST传递FORM格式数据)

    目录       feign实现http远程调用(正文)       解决方案: 在正式讲解HTTP远程调用时,我们先来了解一下缺省方法的定义。 写在前面: 缺省参数可传可不传,可以传多个但他们必须是相同的类型 每个方法中缺省参数只能定义一个,并且只能在参数的最后定义; 缺省参

    2023年04月08日
    浏览(43)
  • Spring Cloud - HTTP 客户端 Feign 、自定义配置、优化、最佳实践

    目录 一、OpenFeign 是什么,有什么用呢? 二、OpenFeign 客户端的使用 2.1、远程调用 1.引入依赖 2.在order-service(发起远程调用的微服务)的启动类添加注解开启Feign的功能 3.编写 OpenFeign 客户端 4.通过 OpenFeign 客户端发起远程调用 2.2、自定义 OpenFeign 配置 1.配置文件方式 2.j

    2024年02月16日
    浏览(42)
  • 十二、Feign客户端整合Hystrix服务保护

    目录 1、项目pom文件中引入feign客户端依赖 2、编写feign客户端接口,并配置fallback回调方法的类 3、编写controller,使用feign客户端进行RPC远程过程调用

    2024年02月05日
    浏览(42)
  • 【Spring Cloud】如何把Feign默认的HTTP客户端URLConnection更换成支持连接池的Apache HttpClient或OKHttp

    本次示例代码的文件结构如下图所示。 Feign 发送 HTTP 请求时,底层会使用到别的客户端。下面列出常用的 3 种 HTTP 客户端。 HTTP客户端 特点 URLConnection Feign 的默认实现,不支持连接池 Apache HttpClient 支持连接池 OKHttp 支持连接池 其中, URLConnection 是 Feign 默认使用的 HTTP 客户端

    2024年02月14日
    浏览(54)
  • Forest-声明式HTTP客户端框架-集成到SpringBoot实现调用第三方restful api并实现接口数据转换

    声明式HTTP客户端API框架,让Java发送HTTP/HTTPS请求不再难。它比OkHttp和HttpClient更高层, 是封装调用第三方restful api client接口的好帮手,是retrofit和feign之外另一个选择。 通过在接口上声明注解的方式配置HTTP请求接口。 官网: Forest   代码地址: forest: 声明式HTTP客户端API框架,让

    2024年02月04日
    浏览(115)
  • Nginx HTTP/3服务器-客户端环境搭建

    一、 NGINX 服务器介绍: NGINX是一个高性能的开源Web服务器,也可用作反向代理服务器、负载均衡器和HTTP缓存。它由俄罗斯的程序员Igor Sysoev创建,并于2004年首次公开发布。NGINX的设计重点是高性能、高并发和低内存消耗,使其成为了现代Web架构中的关键组件之一。 NGINX的一些

    2024年03月11日
    浏览(58)
  • 使用Go语言的HTTP客户端和服务器

    使用Go语言进行HTTP客户端和服务器开发是一种高效且强大的方式。Go语言的标准库提供了对HTTP协议的全面支持,使得创建HTTP客户端和服务器变得简单。 首先,让我们来看一下如何创建一个简单的HTTP服务器。在Go中,可以使用 net/http 包来创建HTTP服务器。以下是一个简单的示例

    2024年01月16日
    浏览(50)
  • 使用HTTP/2实现服务端主动推送消息给客户端

    77. 使用HTTP/2实现服务端主动推送消息给客户端 HTTP/2 协议的服务器主动推送机制是通过服务器在接收到客户端请求后,主动向客户端推送相关资源的方式来实现的。下面将详细解释如何在服务器端和客户端实现 HTTP/2 的服务器主动推送,并给出相应的代码示例。 客户端实现:

    2024年02月11日
    浏览(63)
  • Netty理论与实践(二) 创建http客户端 服务端

    1. 使用echo服务器模拟http 通过上一篇文章中的echo服务器程序来模拟一次HTTP请求。 接收消息的代码如下: 我们通过postman直接访问echo服务器: 请求成功,echo服务器接收到了本次HTTP请求,控制台打印内容如下: 上面的原理很容易理解,postman通过tcp建立与服务器localhost:8001的连

    2024年02月16日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包