Feign远程调用

2023-05-16

目录

Feign替代RestTemplate

1)引入依赖

2)添加注解

3)编写Feign的客户端

                        Load balancer does not have available server for client: userserivce报错

4)测试

自定义配置

配置文件方式

Java代码方式

Feign使用优化

1)引入依赖

2)配置连接池

最佳实践

继承方式

抽取方式

实现基于抽取的最佳实践

        1)抽取

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

        3)重启测试

        4)解决扫描包问题


我们以前利用RestTemplate发起远程调用的代码:

 

Feign是一个声明式的http客户端,官方地址:GitHub - OpenFeign/feign: Feign makes writing java http clients easier

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

 

Feign替代RestTemplate

1)引入依赖

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

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

2)添加注解

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

3)编写Feign的客户端

package cn.itcast.order.clients;

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;

/**
 * @author Dobby
 * @version 1.0
 */
@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来发送了。

这里注意一个问题

由于之前的实验会有一个报错内容

Load balancer does not have available server for client: userserivce报错

实际上nacos是无法找到对应的区域进行负载均衡(个人的理解)

因此需要找到使用服务的配置文件

应该找到orderservice的yaml文件

解决办法:

需要将orderservice(需要服务的),userservice(提供服务的)需要在同一个命名空间(服务列表)下

4)测试

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

    
//    利用feign调用
    @Autowired
    private UserClient userClient;


    public Order queryOrderById(Long orderId) {
            
        Order order = orderMapper.findById(orderId);

        User user = userClient.findById(order.getUserId());

        order.setUser(user);
        // 4.返回
        return order;
    }
    

自定义配置

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

 

一般情况下,默认值就能满足我们使用,如果要自定义时,只需要创建自定义的@Bean覆盖默认Bean即可。

配置文件方式

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

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

也可以针对所有服务:

feign:  
  client:
    config: 
      default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL #  日志级别 

而日志的级别分为四种:

  • NONE:不记录任何日志信息,这是默认值。

  • BASIC:仅记录请求的方法,URL以及响应状态码和执行时间

  • HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息

  • FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。Java代码方式

Java代码方式

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

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

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

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class) 

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

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

Feign使用优化

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

  1. URLConnection:默认实现,不支持连接池
  2. Apache HttpClient :支持连接池
  3. 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 # 每个路径的最大连接数

接下来,在FeignClientFactoryBean中的loadBalance方法中打断点:

 Debug方式启动order-service服务,可以看到这里的client,底层就是Apache HttpClient:

总结,Feign的优化:

1.日志级别尽量用basic

2.使用HttpClient或OKHttp代替URLConnection

① 引入feign-httpClient依赖

② 配置文件开启httpClient功能,设置连接池参数

最佳实践

所谓最近实践,就是使用过程中总结的经验,最好的一种使用方式。

自习观察可以发现,Feign的客户端与服务提供者的controller代码非常相似:

feign客户端:

 UserController:

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

继承方式

一样的代码可以通过继承来共享:

1)定义一个API接口,利用定义方法,并基于SpringMVC注解做声明。

2)Feign客户端和Controller都集成改接口

优点:

  • 简单

  • 实现了代码共享

缺点:

  • 服务提供方、服务消费方紧耦合

  • 参数列表中的注解映射并不会继承,因此Controller中必须再次声明方法、参数列表、注解

抽取方式

        将Feign的Client抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用。

        例如,将UserClient、User、Feign的默认配置都抽取到一个feign-api包中,所有微服务引用该依赖包,即可直接使用。

 

实现基于抽取的最佳实践

1)抽取

 项目结构:

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

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

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

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)重启测试

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

4)解决扫描包问题

方式一:

指定Feign应该扫描的包:

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

方式二:

指定需要加载的Client接口:

@EnableFeignClients(clients = {UserClient.class})

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Feign远程调用 的相关文章

随机推荐

  • Windows将多个TXT文档合并

    1 终端进入多个文档目录 type txt gt gt D hebing1 txt 复制这段命令到终端
  • Linux系统编程之--文件操作

    前言 xff1a Linux系统之下皆文件 1 缓冲区文件操作 普通文件 xff08 TXT MP3 MP4 xff09 缓冲区 xff1a 文件的读写并不是直接操作文件的 xff0c 而是操作缓冲区的 xff08 RAM xff09 例如
  • Linux interfaces配置静态ip(开机自启动)

    编辑 xff1a vim etc network interfaces 基本配置如下 xff1a eth0会在系统启动时被自动配置 auto eth0 eth0接口具有一个静态 xff08 static xff09 IP配置 iface e
  • 超详细Windows10 Tomcat 9安装与配置

    文章目录 附Eclipse配置Tomcat教程一 Tomcat下载二 配置环境变量三 启动Tomcat四 测试Tomcat是否启动成功 附Eclipse配置Tomcat教程 超详细Ecilpse配置Tomcat教程 一 Tomcat下载 首
  • VS2019左侧 黄、绿线条 以及 错误波浪线 隐藏

    VS2019左侧黄线 绿线 选项 gt 文本编译器 gt 常规 gt 跟踪更改 xff08 T xff09 选中后在代码左侧会出现黄绿线条 错误波浪线 选项 gt 文本编译器 gt 常规 gt 显示错误波形曲线 xff08 E xff09
  • Zemax光学设计(十)——变焦镜头设计

    变焦镜头原理 在基础光学理论中像面大小 视场和焦距三者有 如下关系 xff1a 变焦镜头的变焦倍数为长焦距和短焦距比值 xff0c 也称为倍率 在变焦过程中镜头的相对孔径保持不变 xff0c 但对于实际的高变倍比系统 xff0c 由于外形尺
  • Spring Boot注解的运行原理

    Spring Boot 是一个基于 Spring Framework 的开源框架 xff0c 通过简化配置和开发过程 xff0c 使 Spring 应用程序的开发变得更加快速和便捷 在 Spring Boot 中 xff0c 注解是非常重要
  • 在Ubuntu 18.04上安装Git

    步骤1 首先 xff0c 通过运行以下命令确保您的系统和apt包列表完全更新 xff1a apt get update y apt get upgrade y 第2步 在Ubuntu 18 04上安装Git 现在让我们安装git xff1a
  • python中‘‘‘ ‘‘‘ 的作用

    在python中 39 有下面两个作用 xff1a 1 保留原样输出 代码块就是 email message span class token operator 61 span span class token triple quoted
  • 1.4 配置通过FTP进行文件操作

  • Python编程——列表输入字典再转为DataFrame

    导入依赖库 import pandas as pd 设置两个列表 alpha list 61 1 2 3 4 5 beta list 61 2 3 4 5 6 some dict 61 设置空字典 some dict 39 a 39 61
  • 【毕设】基于SpringBoot的医院管理系统的设计和实现

    毕设 基于SpringBoot的医院管理系统的设计和实现 xff1a 本次毕设是基于SpringBoot的前后端分离医院管理系统 xff0c 毕设中包括开题任务书 开题报告 项目系统 毕设论文 相应的答辩PPT 项目演示基本业务操作流程 毕
  • Android S GTS 常见的 fail 项

    此文章只是一篇总结 xff0c 针对 MTK 平台近期的 GTS 做个简单的整理回顾 xff0c 后期不断扩展 GTS GtsJniUncompressHostTestCases com google android gts jniunco
  • 正则表达式底层实现 matcher.find

    matcher find 完成的任务 xff08 考虑分组 xff09 什么是分组 xff0c 比如 d d d d 正则表达式中有 表示分组 第1个 表示第1组 第2个 表示第2组 1 根据指定的规则 定位满足规则的子字符串 比如 19
  • MyBatisPlus配置与实现

    目录 基于SpringBoot使用MyBatisPlus 标准数据层开发 Lombok 分页功能 DQL编程控制 构建条件查询 null判定 查询投影 聚合查询 分组查询 查询条件 模糊查询 排序查询 映射匹配兼容性 DML编程控制 id生
  • 深入理解SpringApplication.run(PeaApplication.class,args)(1)

    运行流程 xff1a 前言 本篇将对SpringApplication run xff09 方法进行源码溯源 xff0c 深入理解该方法 在进入该方法后 xff0c 把第一个class参数转化为数组类型 xff0c 调用同名方法 这里有2个
  • Nacos注册中心

    国内公司一般都推崇阿里巴巴的技术 xff0c 比如注册中心 xff0c SpringCloudAlibaba也推出了一个名为Nacos的注册中心 认识和安装Nacos Nacos是阿里巴巴的产品 xff0c 现在是SpringCloud中的
  • Activity的启动和结束

    onCreate xff1a 创建活动 此时会把页面布局加载进内存 xff0c 进入了初始状态 onStart xff1a 开启活动 此时会把活动页面显示在屏幕上 xff0c 进入了就绪状态 onResume xff1a 恢复活动 此时活动
  • Nacos集群搭建

    官方给出的Nacos集群图 xff1a 其中包含3个nacos节点 xff0c 然后一个负载均衡器代理3个Nacos 这里负载均衡器可以使用nginx 我们计划的集群结构 xff1a 2 搭建集群 搭建集群的基本步骤 xff1a 搭建数据库
  • Feign远程调用

    目录 Feign替代RestTemplate 1 xff09 引入依赖 2 xff09 添加注解 3 xff09 编写Feign的客户端 Load balancer does not have available server for cl