Spring Cloud ( openFeign 服务发现、配置、公共client抽取 )

这篇具有很好参考价值的文章主要介绍了Spring Cloud ( openFeign 服务发现、配置、公共client抽取 )。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本章目录:

  • openFeign的引出
  • 快速入门
    • 引入依赖
    • 添加@EnableFeignClients注解
    • 编写FeignClient接口
    • 使用FeignClient中定义的方法代替RestTemplate
  • 日志配置
  • 连接池配置
  • 公共client抽取

一、openFeign的引出

先来看我们之前服务通信使用的方法:

Spring Cloud ( openFeign 服务发现、配置、公共client抽取 )

我们调用RestTemplate的getObject并手写url来完成服务调用,这样做的缺点是:

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

目前我们只有一个参数(UserID),日后参数复杂了,难道我们要拼接一个一长串的请求路径吗?

Feign可以帮我们轻松解决上述问题:

Feign是一个声明式的http客户端

官方地址:https://github.com/OpenFeign/feign

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

Spring Cloud ( openFeign 服务发现、配置、公共client抽取 )

使用feign后和我们平常的接口调用没什么区别,代码优雅简介。


二、快速入门

2.1、引入依赖

在服务消费者的pom文件内引入feign依赖

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

2.2、 添加@EnableFeignClients注解

在springBoot启动类上添加依赖

Spring Cloud ( openFeign 服务发现、配置、公共client抽取 )

2.3、 编写FeignClient接口

新建一个client包,编写UserClient类

@FeignClient("userService")
public interface UserClient {

    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

如下图,feignClient其实就是将硬编码的请求方式替换为了我们熟知的Rest风格的请求

Spring Cloud ( openFeign 服务发现、配置、公共client抽取 )

2.4、使用FeignClient中定义的方法代替RestTemplate

 把UserClient注入到service层,消费服务。

Spring Cloud ( openFeign 服务发现、配置、公共client抽取 )


三、日志配置

feign共有四个日志级别:

日志级别 打印内容
NONE(默认) 不记录任何日志
FULL 记录请求和响应的header、body和元数据。
HEADER 记录基本信息以及请求和响应标头。
BASIC 只记录请求方法和URL以及响应状态代码和执行时间。

feign日志有两种配置方式:

  • 配置Logger.Level这个Bean
  • yml文件配置

3.1、使用yml配置日志

feign:
  client:
    # 配置
    config:
      #default为全局配置,如需对指定服务记录日志,换成服务名即可
      default:
        # 控制日志Level,默认:null即NONE
        # NONE 没有日志
        # BASIC 只记录请求方法和URL以及响应状态码和执行时间
        # HEADERS 记录基本信息以及请求和响应头
        # FULL 记录请求和响应的头、正文和元数据
        loggerLevel: FULL

这里要注意的是:

feign日志记录只响应debug级别,所以我们要对Feign客户端(client)的接口的完整类名指定日志级别为:DEBUG

Spring Cloud ( openFeign 服务发现、配置、公共client抽取 )

yml配置如下:

Spring Cloud ( openFeign 服务发现、配置、公共client抽取 )

3.2、使用Logger.Level配置日志

新建一个config包,编写如下代码:

package cn.itcast.order.config;
import feign.Logger;
import org.springframework.context.annotation.Bean;

public class FeignConfig {
    @Bean
    public Logger.Level feignLogLevel(){
        return Logger.Level.FULL;
    }
}

如果是全局配置,则把它放到@EnableFeignClients这个注解中

Spring Cloud ( openFeign 服务发现、配置、公共client抽取 )

如果是对特定服务开启日志记录,则把它放到@FeignClient这个注解中

比如我要对userService服务开启日志

Spring Cloud ( openFeign 服务发现、配置、公共client抽取 )

总结如下:

Feign的日志配置:

方式一:配置文件(feign.client.config.xxx.loggerLevel)

  • 如果xxx是default则代表全局
  • 如果xxx是服务名称,例如userservice则代表某服务

方式二:java代码配置Logger.Level这个Bean

  • 如果在@EnableFeignClients注解声明则代表全局
  • 如果在@FeignClient注解中声明则代表某服务 

四、连接池配置

Feign底层的客户端实现:

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

feign默认使用URLConnection,是没有连接池的

我们都了解过线程池、数据库连接池等;它的好处是避免了频繁的创建连接和销毁的步骤。首先我们知道HTTP连接需要经过三次握手,四次挥手的过程,这是很耗费性能的

Spring Cloud ( openFeign 服务发现、配置、公共client抽取 )

 而如果我们直接采用 http 连接池,节约了大量的 3 次握手 4 次分手;这样能大大提升吞吐率。

 以下是具体实现:

4.1引入httpClient依赖

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

4.2、配置连接池

feign:
  httpclient:
    enabled: true                   #开启feign对HttpClient的支持
    max-connections: 200            #最大的连接数
    max-connections-per-route: 50   #单个路径的最大连接数
    onnections-per-route: 50        #单个路径的最大连接数

 五、公共client抽取

上述案例,当一个服务消费者 消费 一个服务提供者,我们需要编写服务提供者的client,client内接口返回的服务提供者的实体类对象,feign配置等等信息。

那么如果这个服务提供者 被多个服务消费者 消费,难道我们要在多个服务消费者内都编写服务提供者的client吗?显然这是不合理的

对于这种情况,我们可以抽取一个moudle,专门编写服务提供者的client,pojo,config等信息。

当某个消费者服务需要使用client,只需要在pom.xml内引入该moudle依赖,然后@Autowired对应client即可。

Spring Cloud ( openFeign 服务发现、配置、公共client抽取 )

抽取一个feign-api

比如orderService需要使用UserClient

在orderService的pom.xml内引入feign-api

Spring Cloud ( openFeign 服务发现、配置、公共client抽取 )

接着更改启动类@EnableFeignClients注解内的内容

Spring Cloud ( openFeign 服务发现、配置、公共client抽取 )

然后把调用client的service层里导入的包都更改为被抽取模块(feign-api)的包

Spring Cloud ( openFeign 服务发现、配置、公共client抽取 )

现在我们使用的userClient属于feign-api,不在当前的服务中了,我们需要在当前服务重新指定日志级别

Spring Cloud ( openFeign 服务发现、配置、公共client抽取 )

这一步很重要,否则日志不会生效 

Spring Cloud ( openFeign 服务发现、配置、公共client抽取 )文章来源地址https://www.toymoban.com/news/detail-402437.html

总结:

  • 首先创建一个module,命名为feign-api,
  • 然后引入feign的starter依赖
  • 将order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中 在order-service中引入feign-api的依赖
  • 修改order-service中的所有与上述三个组件有关的import部分,改成导入feign-api中的包
  • 重启测试

到了这里,关于Spring Cloud ( openFeign 服务发现、配置、公共client抽取 )的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Zookeeper 实战 | Zookeeper 和Spring Cloud相结合解决分布式锁、服务注册与发现、配置管理

    专栏集锦,大佬们可以收藏以备不时之需: Spring Cloud 专栏: Python 专栏: Redis 专栏: TensorFlow 专栏: Logback 专栏: 量子计算: 量子计算 | 解密著名量子算法Shor算法和Grover算法 AI机器学习实战: AI机器学习实战 | 使用 Python 和 scikit-learn 库进行情感分析 AI机器学习 | 基于lib

    2024年02月05日
    浏览(89)
  • 云原生微服务 第六章 Spring Cloud中使用OpenFeign

    第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign OpenFeign 全称 Spring Cloud OpenFeign,它是 Spring 官方推出的一种声明式服务调用与负载均衡组件。我们可

    2024年02月08日
    浏览(35)
  • 【springcloud微服务】Spring Cloud Alibaba 整合dubbo与openfeign

    dubbo与springcloud都可以单独作为微服务治理框架在生产中进行使用,但使用过springcloud的同学大概了解到,springcloud生态的相关组件这些年已经逐步停更,这就导致在服务架构演进过程中的迭代断层,以至于一些新的技术组件引入困难重重,于是在国内的市场上就有了升级版的

    2024年02月07日
    浏览(64)
  • 《Spring Cloud学习笔记:Nacos配置管理 & OpenFeign & LoadBalancer & Getway》

    基于Feign的声明式远程调用(代码更优雅),用它来去代替我们之前的RestTemplate方式的远程调用 首先我们来看一下,微服务架构下关于配置文件的一些问题: 配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不

    2024年02月04日
    浏览(52)
  • Spring Cloud OpenFeign:基于Ribbon和Hystrix的声明式服务调用

    💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Spring Cloud OpenFeign是一个声明式的服务调用框架,基于Feign并整合了Ribbon和Hystrix;目标是简化分布式系统中编写服务间调用的代码,并提供一种更加优雅和便捷的方式来进行服务之间的通信 依赖导入 application.yml配置 启

    2024年02月05日
    浏览(51)
  • 微服务 – Spring Cloud – Nacos服务注册、发现

    1、引入依赖 父pom依赖 子pom依赖 2、配置文件 3、主启动类 第三部完成 打开nacos 在服务列表即可看到注册进来的服务. 4、业务类 写一个接口供服务发现者使用 1、引入依赖 2、配置文件 3、主启动类 打开nacos 在服务列表即可看到注册进来的服务. 4、发现第一个服务 并调用第一

    2024年02月11日
    浏览(91)
  • 【Spring Cloud 三】Eureka服务注册与服务发现

    【Spring Cloud一】微服务基本知识 目前公司项目使用的注册中心主要是Spring Cloud Alibaba的Nacos做的注册中心和配置中心。之前也是对Nacos的基本原理通过手写代码的方式进行了实现。出于对于Eureka的好奇所以就对Spring Cloud Neflix的Eureka进行理论学习和实践。 Eureka是一个 注册发现中

    2024年02月14日
    浏览(190)
  • 【秒懂·云原生】微服务篇 —— Spring Cloud Commons:公共抽象

    🔎这里是【秒懂·云原生】,关注我学习云原生不迷路 👍如果对你有帮助,给博主一个免费的点赞以示鼓励 欢迎各位🔎点赞👍评论收藏⭐️ 【秒懂·云原生】 目前主要更新微服务,一起学习一起进步。 主要介绍Spring Cloud Commons:公共抽象 Spring Cloud将服务发现、负载均衡和

    2024年02月03日
    浏览(39)
  • Spring Cloud Eureka:服务注册与发现

    💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Spring Cloud Eureka是Spring Cloud生态系统中的一个组件,它是用于实现服务注册与发现的服务治理组件。在微服务架构中,服务之间存在复杂的依赖关系,而Spring Cloud Eureka可以帮助解决服务之间相互查找和通信的问题 Eurek

    2024年02月09日
    浏览(57)
  • Spring Cloud Alibaba【OpenFeign实现服务降级、Dubbo实现服务生产者、 Dubbo消费者调用接口 】(三)

    目录 服务调用_OpenFeign实现服务降级 服务调用_Dubbo实现服务生产者 

    2024年02月17日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包