SpringCloud(七) Feign远程调用

这篇具有很好参考价值的文章主要介绍了SpringCloud(七) Feign远程调用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一, RestTemplate远程调用存在的问题

二, Feign的远程调用

2.1 什么是Fegin

2.2 Feign的使用(代替RestTemplate)

1. 引入依赖

2. 添加注解 

3. 编写Feign的客户端

4. 测试

5. 总结 

2.3 自定义配置

1. 配置文件方式 

2. Java代码方式 

三, Feign使用优化

3.1 使用连接池

1. 引入依赖

2. 配置连接池

3. 总结

3.2 抽取Feign的Client模块进一步优化

1. 抽取 

2. 在order-service中使用feign-api

3. 重启测试

4. 解决扫描包问题 


一, RestTemplate远程调用存在的问题

SpringCloud(一) 服务架构的演变及注册RestTemplate实现服务的远程调用-CSDN博客

在这篇博客中我们学会了如何使用RestTemplate实现微服务之间的远程调用,我们来看一下利用RestTemplate发起远程调用的代码:

SpringCloud(七) Feign远程调用,SpringCloud微服务,spring cloud,spring boot,java

这种方式存在以下的问题:

  • 代码可读性差,编程体验不统一
  • 参数复杂,URL 难以维护

所以引入了Feign帮我们解决上述问题,使得远程调用的代码更加优雅.

二, Feign的远程调用

2.1 什么是Fegin

Fegin是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign

其作用就是帮助我们优雅的实现http请求的发送,解决RestTemplate中提到的问题.

SpringCloud(七) Feign远程调用,SpringCloud微服务,spring cloud,spring boot,java

2.2 Feign的使用(代替RestTemplate)

1. 引入依赖

在order-service服务的pom文件中引入feign的依赖

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

2. 添加注解 

在order-service的启动类添加注解开启Feign的功能

SpringCloud(七) Feign远程调用,SpringCloud微服务,spring cloud,spring boot,java

3. 编写Feign的客户端

在order-service新建一个接口,内容如下:

SpringCloud(七) Feign远程调用,SpringCloud微服务,spring cloud,spring boot,java

package cn.itcast.order.client;

import cn.itcast.order.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient("userservice")
public interface UserClient {
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

这个客户端是基于SpringMVC的注解来声明远程调用的信息,比如:

  • 服务名称:userservice
  • 请求方式:GET
  • 请求路径:/user/{id}
  • 请求参数:Long id
  • 返回值类型:User 

这样,Feign就可以帮助我们发送http请求,无需自己使用RestTemplate来发送了.

4. 测试

修改order-service的OrderController类中的queryOrderById方法,使用Feign客户端代替RestTemplate:

SpringCloud(七) Feign远程调用,SpringCloud微服务,spring cloud,spring boot,java

SpringCloud(七) Feign远程调用,SpringCloud微服务,spring cloud,spring boot,java

5. 总结 

使用Feign的步骤:

  1. 引入依赖
  2. 添加@EnableFeignClients注解
  3. 编写FeignClient接口
  4. 使用FeignClient中定义的方法代替RestTemplate

2.3 自定义配置

Feign支持很多的自定义配置,如下表所示:

类型 作用 说明
feign.Logger.Leve 修改日志级别 包含四种不同的级别:NONE、BASIC、HEADERS、FULL
feign.codec.Decoder 响应结果的解析器 http远程调用的结果做解析,例如解析json字符串为java对象
feign.codec.Encoder 请求参数编码 将请求参数编码,便于通过http请求发送
feign. Contract 支持的注解格式 默认是SpringMVC的注解
feign. Retryer 失败重试机制 请求失败的重试机制,默认是没有,不过会使用Ribbon的重试

一般情况下,默认值就能满足我们使用,如果要自定义时,只需要创建自定义的@Bean覆盖默认Bean即可,下面以日志为例来演示如何自定义配置.

1. 配置文件方式 

基于配置文件修改Feign的日志级别可以针对单个服务:

feign:  
  client:
    config: 
      userservice: # 针对某个微服务的配置
        loggerLevel: FULL #  日志级别 

也可以针对所有服务:

feign:  
  client:
    config: 
      default: # 针对某个微服务的配置
        loggerLevel: FULL #  日志级别 

而日志的级别分为四种:

  • NONE:不记录任何日志信息,这是默认值
  • Basic:仅记录请求的方法,URL以及响应状态码和执行时间
  • HEADERS:在BASCI的基础上,额外记录了请求和响应头信息
  • FULL:记录所有请求和响应的明细,包括头信息,请求体,元数据

以BASIC为例:

先修改配置文件

SpringCloud(七) Feign远程调用,SpringCloud微服务,spring cloud,spring boot,java

重新访问查看日志信息 

SpringCloud(七) Feign远程调用,SpringCloud微服务,spring cloud,spring boot,java

2. Java代码方式 

也可以基于Java代码来修改日志级别,先声明一个类,然后声明一个Logger.Level对象:

public class DefaultFeignConfiguration  {
    @Bean
    public Logger.Level feignLogLevel(){
        return Logger.Level.BASIC; // 日志级别为BASIC
    }
}

SpringCloud(七) Feign远程调用,SpringCloud微服务,spring cloud,spring boot,java

 如果要全局生效,将其放到启动类的@EnableFeignClients这个注解中:

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class) 

如果是局部生效,则把它方到对应的@FeignClient这个注解中:

@FeignClient(value = "userservice", configuration = DefaultFeignConfiguration .class)

三, Feign使用优化

3.1 使用连接池

Feign底层发起http请求,依赖于其他的框架,其底层客户端实现包括:

  • URLConnection:默认实现,不支持连接池
  • Apache HttpClient:支持连接池
  • OKHttp:支持连接池

因此,提高Feign的性能主要手段就是使用连接池代替默认的URLConnection

这里我们用Apache HttpClient来演示:

1. 引入依赖

在order-service的pom文件中引入Apache的HttpClient依赖:

<!--httpClient的依赖 -->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>

2. 配置连接池

在order-service的application.yml中添加配置:

feign:
  client:
    config:
      default: # default全局的配置
        loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
  httpclient:
    enabled: true # 开启feign对HttpClient的支持
    max-connections: 200 # 最大的连接数
    max-connections-per-route: 50 # 每个路径的最大连接数

此时,启动order-service服务,其底层就是使用的Apache的HttpClient了.

3. 总结

Feign的优化:

  1. 日志级别尽量使用basic
  2. 使用HttpClient或OKHttp代替URLConnection
    1. 引入feign-httpClient依赖
    2. 配置文件开启httpClient功能,设置连接池参数

3.2 抽取Feign的Client模块进一步优化

通过代码我们可以发现,Feign的客户端与服务提供者的controller代码非常相似:

SpringCloud(七) Feign远程调用,SpringCloud微服务,spring cloud,spring boot,java

SpringCloud(七) Feign远程调用,SpringCloud微服务,spring cloud,spring boot,java

有没有一种办法简化这种重复的代码编写呢?

答案是肯定的;可以将Feign的Client抽取为独立模块,并且把接口有关的POJO,默认的Feign配置都放到这个模块中,提供给所有消费者使用;例如:将UserClient,User,Feign的默认配置都抽取到一个feign-api包中,所有微服务引入该依赖包,即可直接使用.

 SpringCloud(七) Feign远程调用,SpringCloud微服务,spring cloud,spring boot,java

1. 抽取 

首先创建一个module,命名为feign-api:

SpringCloud(七) Feign远程调用,SpringCloud微服务,spring cloud,spring boot,java

项目结构:

SpringCloud(七) Feign远程调用,SpringCloud微服务,spring cloud,spring boot,java 

在feign-api中然后引入feign的starter依赖

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

然后,order-service中编写的UserClient,User,DefaultFeignConfiguration都复制到feign-api项目中

SpringCloud(七) Feign远程调用,SpringCloud微服务,spring cloud,spring boot,java

2. 在order-service中使用feign-api

首先,删除order-service中的UserClient,User,DefaultFeignConfiguration等类或接口;

在order-service的pom文件中中引入feign-api的依赖:

<dependency>
    <groupId>cn.itcast.demo</groupId>
    <artifactId>feign-api</artifactId>
    <version>1.0</version>
</dependency>

 修改order-service中的所有与上述三个组件有关的导包部分,改成导入feign-api中的包

3. 重启测试

重启之后发现服务报错了:

SpringCloud(七) Feign远程调用,SpringCloud微服务,spring cloud,spring boot,java

这是因为UserController现在在cn.itcast.feign.clients包下,而order-service的@EnableFeignClient注解是在cn.itcast.order包下,不在同一个包,无法扫描到UserClient.

4. 解决扫描包问题 

方式一:

指定Feign应该扫描的包:

@EnableFeignClients(basePackages = "cn.itcast.feign.clients")

方式二:

指定需要加载的Client接口(使用的更多):文章来源地址https://www.toymoban.com/news/detail-740278.html

@EnableFeignClients(clients = {UserClient.class})

到了这里,关于SpringCloud(七) Feign远程调用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Spring Cloud】基于 Feign 实现远程调用,深入探索 Feign 的自定义配置、性能优化以及最佳实践方案

    在微服务架构中,服务之间的通信是至关重要的,而远程调用则成为实现这种通信的一种常见方式。在 Java 中,使用 RestTemplate 是一种传统的远程调用方式,但它存在一些问题,如代码可读性差、编程体验不一致以及参数复杂URL难以维护等。 在本文中,我们将探讨如何通过使

    2024年02月04日
    浏览(54)
  • 39.SpringCloud—配置管理nacos、远程调用Feign、服务网关Gateway

    目录 一、SpringCloud。 (1)Nacos配置管理。 (1.1)nacos中添加配置文件、微服务引入依赖,并配置bootstrap.yml文件。 (1.2)获取配置文件信息,实现热更新。 (1.3)多环境配置共享。 (1.4)多服务共享配置。 (2)http客户端Feign。 (2.1)RestTemplate方式调用存在的问题。 (2.2)

    2024年02月10日
    浏览(73)
  • SpringCloud实用篇2——Nacos配置管理 Feign远程调用 Gateway服务网关

    Nacos除了可以做注册中心,同样可以做配置管理来使用。 当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。 Nacos一方面可以将配置集中管理,另一方可以

    2024年02月13日
    浏览(53)
  • Spring Cloud Alibaba全家桶(四)——微服务调用组件Feign

    本文小新为大家带来 微服务调用组件Feign 的相关知识,具体内容包含 什么是Feign , Spring Cloud Alibaba快速整合OpenFeign , Spring Cloud Feign的自定义配置及使用 (包括: 日志配置 、 契约配置 、 自定义拦截器实现认证逻辑 、 超时时间配置 、 客户端组件配置 、 GZIP 压缩配置 )等

    2024年02月19日
    浏览(46)
  • 使用Feign进行微服务之间的接口调用:Spring Cloud Alibaba中的声明式服务调用

            Feign是一个声明式的 HTTP客户端框架 ,用于简化微服务架构中服务之间的通信。它是Spring Cloud框架的一部分,旨在提供一种优雅且易于使用的方式来定义和调用HTTP请求。         Feign的设计目标是让服务之间的通信变得更加简单和直观。通常情况下,在微服务

    2024年02月15日
    浏览(41)
  • SpringCloud --- Feign远程调用

    先来看我们以前利用RestTemplate发起远程调用的代码: 存在下面的问题: 代码可读性差,编程体验不统一 参数复杂URL难以维护 Feign是一个声明式的http客户端,官方地址:GitHub - OpenFeign/feign: Feign makes writing java http clients easier 其作用就是帮助我们优雅的实现http请求的发送,解决

    2024年02月05日
    浏览(39)
  • SpringCloud-基于Feign远程调用

    Spring Cloud 是一个用于构建分布式系统的开发工具包,它提供了一系列的微服务组件,其中之一就是 Feign。Feign 是一种声明式的 Web 服务客户端,它简化了在 Spring Cloud 中进行远程调用的过程。本文将介绍如何在 Spring Cloud 中使用 Feign 进行远程调用。 我们在 Spring Cloud 项目的

    2024年02月21日
    浏览(57)
  • SpringCLoud——Feign的远程调用

    来看一下之前我们使用RestTemplate调用时编写的Contrriller代码: //        2. 利用RestTemplate发起HTTP请求 //        2.1 url 地址         String url = \\\"http://userserver/user/\\\" + order.getUserId(); //        2.2 发送http请求,实现远程调用         User user = restTemplate.getForObject(url,

    2024年02月07日
    浏览(39)
  • SpringCloud(七) Feign远程调用

    目录 一, RestTemplate远程调用存在的问题 二, Feign的远程调用 2.1 什么是Fegin 2.2 Feign的使用(代替RestTemplate) 1. 引入依赖 2. 添加注解  3. 编写Feign的客户端 4. 测试 5. 总结  2.3 自定义配置 1. 配置文件方式  2. Java代码方式  三, Feign使用优化 3.1 使用连接池 1. 引入依赖 2. 配置连接池

    2024年02月06日
    浏览(40)
  • SpringCloud Alibaba(一)微服务简介+Nacos的安装部署与使用+Nacos集成springboot实现服务注册+Feign实现服务之间的远程调用+负载均衡+领域划分

    目录 一.认识微服务 1.0.学习目标 1.1.单体架构 单体架构的优缺点如下: 1.2.分布式架构 分布式架构的优缺点: 1.3.微服务 微服务的架构特征: 1.4.SpringCloud 1.5Nacos注册中心 1.6.总结 二、Nacos基本使用安装部署+服务注册 (一)linux安装包方式单节点安装部署 1. jdk安装配置 2. na

    2024年02月09日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包