当前位置:首页 > 服务端 > 微服务:SpringCloud 使用Feign组件

微服务:SpringCloud 使用Feign组件

2022年11月10日 11:15:06服务端12

一、之前项目存在的问题

我们这样去调用微服务:

微服务:SpringCloud 使用Feign组件 _ JavaClub全栈架构师技术笔记

 是不是感觉不好啊,怎么可能去拼字符串呢?low爆了对吧。我们的Feign组件就是解决这个问题滴!

二、Feign组件

1、简介

Feign Netflflix 开发的声明式,模板化的 HTTP 客户端,其灵感来自 Retrofifit,JAXRS-2.0 以及 WebSocket.
  • Feign 可帮助我们更加便捷,优雅的调用 HTTP API
  • SpringCloud 中,使用 Feign 非常简单 —— 创建一个接口,并在接口上添加一些注解,代码就完成了
  • Feign 支持多种注解,例如 Feign 自带的注解或者 JAX-RS 注解等。
  • SpringCloud Feign 进行了增强,使 Feign 支持了 SpringMVC 注解,并整合了 Ribbon Eureka,从而让 Feign 的使用更加方便。

2、项目中实现

微服务:SpringCloud 使用Feign组件 _ JavaClub全栈架构师技术笔记
 

项目仍然是这个项目。

首先我们在order-service这里面加入一些依赖。

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

创建一个类

微服务:SpringCloud 使用Feign组件 _ JavaClub全栈架构师技术笔记

package com.springcloud.demo.feign;

import com.springcloud.demo.entity.Product;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@FeignClient(name = "service-product")
public interface ProductFeginClient {

    @RequestMapping(value = "/product/{id}", method = RequestMethod.GET)
    public Product findById(@PathVariable("id") Long id);
}
这里的@FeignClient中的name就是指定对应的服务,然后方法的requestMapping就是对应的地址,实际上跟我们直接拼url差不多,但是这个就相当于做了一个分离。
 
创建一个 Feign 接口,此接口是在 Feign 中调用微服务的核心接口

 

  • 定义各参数绑定时,@PathVariable@RequestParam@RequestHeader等可以指定参数属 性,在Feign中绑定参数必须通过value属性来指明具体的参数名,不然会抛出异常。
  • @FeignClient :注解通过 name 指定需要调用的微服务的名称,用于创建 Ribbon 的负载均衡器。 所以Ribbon 会把 shop - service - product 解析为注册中心的服务。
@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private ProductFeginClient productFeginClient;

    @RequestMapping(value = "/buy/{id}", method = RequestMethod.GET)
    public Product findById(@PathVariable Long id) {
        Product product = productFeginClient.findById(id);
        return product;
    }

}

直接注入调用。启动测试。可以成功!!!

微服务:SpringCloud 使用Feign组件 _ JavaClub全栈架构师技术笔记

Ribbon 是一个基于 HTTP TCP 客户端 的负载均衡的工具。它可以 在客户端 配置 RibbonServerList(服务端列表),使用 HttpClient RestTemplate 模拟 http 请求,步骤相当繁琐。
 
Feign 是在 Ribbon 的基础上进行了一次改进,是一个使用起来更加方便的 HTTP 客户端。采用接口的 方式, 只需要创建一个接口,然后在上面添加注解即可 ,将需要调用的其他服务的方法定义成抽象方 法即可, 不需要自己构建http 请求。然后就像是调用自身工程的方法调用,而感觉不到是调用远程方 法,使得编写客户端变得非常容易

 

3、实现负载均衡

Feign 中本身已经集成了 Ribbon 依赖和自动配置,因此我们不需要额外引入依赖,也不需要再注册 RestTemplate 对象。另外,我们可以像上节课中讲的那样去配置 Ribbon ,可以通过 ribbon.xx 来进行全局配置。
 
不需要任何设置,默认是轮询的机制。
 
 
Feign 的高级配置
Spring Cloud Edgware 开始, Feign 支持使用属性自定义 Feign 。对于一个指定名称的 Feign
Client (例如该 Feign Client 的名称为 feignName ), Feign 支持如下配置项:
feign:
  client:
    config:
      feignName: #定义FeginClient的名称
      # 相当于Request.Options
      connectTimeOut: 5000
      # 相当于Request.Options
      readTimeout: 5000
      # 配置Feign的日志级别,相当于代码配置方式中的Logger
      loggerLevel: full
      # Feign的错误解码器,相当于代码配置方式中的ErrorDecoder
      errorDecoder: com.example.SimpleErrorDecoder
      # 配置重试,相当于代码配置方式中的Retryer
      retryer: com.example.SimpleRetryer
      # 配置拦截器,相当于代码配置方式中的RequestInterceptor
      requestInterceptors:
        - com.example.FooRequestInterceptor
        - com.example.BarRequestInterceptor
      decode404: false
  • feignName FeginClient 的名称
  • connectTimeout : 建立链接的超时时长
  • readTimeout : 读取超时时长
  • loggerLevel: Fegin 的日志级别
  • errorDecoder Feign 的错误解码器
  • retryer : 配置重试
  • requestInterceptors : 添加请求拦截器
  • decode404 : 配置熔断不处理 404 异常

4、请求压缩

Spring Cloud Feign 支持对请求和响应进行 GZIP 压缩,以减少通信过程中的性能损耗。通过下面的参数 即可开启请求与响应的压缩功能:
feign:
  compression:
    request:
      # 开启请求压缩
      enabled: true
    response:
      # 开启响应压缩
      enabled: true

 

 
同时,我们也可以对请求的数据类型,以及触发压缩的大小下限进行设置:
 
feign:
  compression:
    request:
      # 开启请求压缩
      enabled: true
      # 设置压缩的数据类型
      mime-types: text/html,application/xml,application/json
      # 设置触发压缩的大小下限
      min-request-size: 2048
注:上面的数据类型、压缩大小下限均为默认值。
 
 

5、日志级别

在消费者那设置

# 设置服务的日志
# NONE:不输出日志
# BASIC:用于生产环境测试追踪问题
# HEADERS:basic的基础上+ 请求头和响应头信息
# FULL:记录所有
feign:
  client:
    config:
      service-product:
        loggerLevel: FULL

logging:
  level:
    com.springcloud.demo.feign.ProductFeginClient: debug

重新启动项目。访问接口,打印输出

微服务:SpringCloud 使用Feign组件 _ JavaClub全栈架构师技术笔记

源码的话,拿到之前文章的项目,修改一下就可以了

 

 

 

 

 

 

 

作者:借汝之光,得以光明
来源链接:https://blog.csdn.net/weixin_44588495/article/details/106352908

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/server/69264.html

分享给朋友:

“微服务:SpringCloud 使用Feign组件” 的相关文章

SpringBoot项目改为SpringCloud项目使用nacos作为注册中心

SpringBoot项目改为SpringCloud项目使用nacos作为注册中心

本章讲解的是在不改变原有业务的情况下将springboot改为springcloud项目使用nacos作为注册中心 首先在官网下载好nacos注册中心,在bin目录中startup.cmd文件为启动命令默认端口号是8888 接下来修改原有项目依赖...

SpringBoot整合Dubbo与zookeeper纯注解版

SpringBoot整合Dubbo与zookeeper纯注解版

一、Dubbo和zk的作用 上回讲到,Dubbo作为一款优秀的RPC框架,封装了dubbo-provider(提供者)和dubbo-consumer(消费者),而provider和consumer之间需要通过注册中心来作为可发现的服务目录。而zookeeper(此处简称zk)提供了服务接口注...

SpringCloud之断路器Hystrix

SpringCloud之断路器Hystrix

一、Hystrix是什么 之前文章讲过,SpringCloud中加入了断路器功能,当请求接口时,服务提供者出现宕机问题,没有一个好的容错机制的情况下,是有可能造成雪崩效应,造成整个服务瘫痪,从而导致系统挂掉。Hystrix是Netflix提供的一个延迟和容错库,可以在服务出现问题时,进行及时...

前后端分离,SpringBoot如何实现验证码操作

前后端分离,SpringBoot如何实现验证码操作

验证码的功能是防止非法用户恶意去访问登录接口而设置的一个功能,今天我们就来看看在前后端分离的项目中,SpringBoot是如何提供服务的。SpringBoot版本本文基于的Spring Boot的版本是2.6.7 。引入依赖captcha一款超简单的验证码生成,还挺好玩的.还有中文验证码,动态验证码...

Spring Boot+微信小程序

Spring Boot+微信小程序

1. 前言 微信小程序开发平台,提供有一类 API,可以让开发者获取到微信登录用户的个人数据。这类 API 统称为开放接口。 Tip:微信小程序开发平台,会把微信登录用户的个人信息分为明文数据和敏感数据。 明文数据也称为公开数据,开发者可以直接获取到,如登...

SpringBoot整合 mybatisPlus

SpringBoot整合 mybatisPlus

引言 最近在准备一期SpringBoot整合大全系列文章,同时也会有视频放出(视频还在酝酿中),如果大家觉得有帮助,记得点赞加收藏哦。 话不多说,咱们直接进入正题。 ​ 代码已经上传到码云:https://gitee.com/lezaiclu...

SpringCloud 实战|7.SpringCloud 整合Sentinel

SpringCloud 实战|7.SpringCloud 整合Sentinel

手把手教你从0开始搭建spring cloud alibaba 脚手架,关注公众号“AI码师” 获取项目完整源码 引言 这一期主要是整合sentinel,实现流控、降级和授权功能 开整 引入依赖 在comm...

Springboot 整合 Dubbo/ZooKeeper 详解 SOA 案例

Springboot 整合 Dubbo/ZooKeeper 详解 SOA 案例

摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!...

项目ITP(四) javaweb http json 交互 in action (服务端 spring 手机端 提供各种工具类)勿喷!

项目ITP(四) javaweb http json 交互 in action (服务端 spring 手机端 提供各种工具类)勿喷!

前言   系列文章:[传送门]   洗了个澡,准备写篇博客。然后看书了。时间 3 7 分。我慢慢规律生活,向目标靠近。                       &n...

异常Error creating bean with name 'shiroFilter' defined in file [D:\apache-tomcat-7.0.54\wtpwebapps\shiro-ssm4\WEB-INF\classes\spring-shiro.xml]: Cannot resolve reference to bean 'securityManager' while

异常Error creating bean with name 'shiroFilter' defined in file [D:\apache-tomcat-7.0.54\wtpwebapps\shiro-ssm4\WEB-INF\classes\spring-shiro.xml]: Cannot resolve reference to bean 'securityManager' while

严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener org.sp...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。