SpringCloud之feign

feign的使用

    • 一、概述
    • 二、feign的使用流程
      • [2.1 在pom文件中添加依赖](#2.1 在pom文件中添加依赖)
      • [2.2 feign的配置](#2.2 feign的配置)
        • [2.2.1 修改日志级别](#2.2.1 修改日志级别)
          • [2.2.1.1 在yml中配置](#2.2.1.1 在yml中配置)
          • [2.2.1.2 在代码中写配置类](#2.2.1.2 在代码中写配置类)
        • [2.2.2 响应结果解析器](#2.2.2 响应结果解析器)
        • [2.2.3 请求参数编码](#2.2.3 请求参数编码)
        • [2.2.4 支持的注解格式](#2.2.4 支持的注解格式)
        • [2.2.5 失败的重试机制](#2.2.5 失败的重试机制)
      • [2.3 Nacos支持Feign,可以直接在接口基础上实现负载均衡效果](#2.3 Nacos支持Feign,可以直接在接口基础上实现负载均衡效果)

一、概述

Feign是一个声明式HTTP客户端,它使HTTP API请求变得更简单和更优雅。它基于注解,在创建动态代理时解析接口方法,并将其映射到HTTP请求。我们只需要编写Java接口并添加注解,就可以轻松地使用Feign处理HTTP请求。

SpringCloud对Feign进行了增强,使Feign支持了SpringMVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。

Feign还提供了可插拔的编码器和解码器,以将Java对象转换为HTTP请求、响应和错误

二、feign的使用流程

2.1 在pom文件中添加依赖

当模块A要调用模块B的方法时,要在调用者中加入Feign的依赖,要在调用者的启动类上添加注解 @EnableFeignClients

java 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.2 feign的配置

2.2.1 修改日志级别

feign.Logger.Level : 包含四种不同的级别:NONE、BASIC、HEADERS、FULL

java 复制代码
NONE:没有任何日志,也是默认配置;

BASIC:可以记录http请求什么时候发送,什么时候结束,耗时多久等基本信息;

HEADERS:除了BASIC中含有的以外,还包含请求头和响应头; 

FULL:是最全面的,除了HEADERS中包含的以外,还包含请求体信息和响应体信息。
2.2.1.1 在yml中配置
java 复制代码
feign:  
  client:
    config: 
      userservice: # 针对某个微服务的配置
      #default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL #  日志级别 
2.2.1.2 在代码中写配置类
java 复制代码
public class DefaultFeignConfiguration {
    @Bean
    public Logger.Level logLevel(){
        return Logger.Level.BASIC;
    }
}

想要局部生效时,就在Feign的具体的接口上的注解上添加configuration = FeignConfiguration.class

java 复制代码
@FeignClient(value = "userservice",configuration = DefaultFeignConfiguration.class)
public interface TopoClient {
  /**
     * 获取关联拓扑
     * @param param
     * @return
     */
    @PostMapping("/api/topo/cmnet/getSerchCmNetTopo")
    public BTopo getSerchCmNetTopo(@RequestBody QueryRelParam param);
}

全局生效,在启动类添加EnableFeignClients注解 设置defaultConfiguration 属性;如果只有一个client可以使用clients=类.class,如果多个可以直接扫包

java 复制代码
@EnableFeignClients(basePackages = {"com.softwaregroup.communication.topo"}, defaultConfiguration = DefaultFeignConfiguration.class)
2.2.2 响应结果解析器

feign.codec.Decoder: http远程调用的结果做解析,例如解析json字符串为java对象

2.2.3 请求参数编码

feign.codec.Encoder: 将请求参数编码,便于通过http请求发送

2.2.4 支持的注解格式

feign. Contract : 默认是SpringMVC的注解

2.2.5 失败的重试机制

feign. Retryer : 请求失败的重试机制,默认是没有,不过会使用Ribbon的重试

2.3 Nacos支持Feign,可以直接在接口基础上实现负载均衡效果

微服务名称:nrms-topo-ip

启动项目主类

java 复制代码
@SpringCloudApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = {"com.softwaregroup.communication.topo"})

@Slf4j
public class TopoDataPluginDataNetwork {
}

CmNetClientFeign

java 复制代码
@FeignClient(name = "nrms-topo-cmnet",
        configuration = FeignClientsConfiguration.class)
public interface CmNetClientFeign {

    /**
     * 获取关联拓扑
     * @param param
     * @return
     */
    @PostMapping("/api/topo/getSerchTopo")
    public BTopo getSerchTopo(@RequestBody QueryRelParam param);
    }

注意!

因为我们大部分项目都需要进行权限认证,当接口调用别的微服务接口时,也需要把请求头传过去可以通过Interceptor(拦截器)实现

java 复制代码
/**
 * @author:  zhang
 * @date:  Created in 2024/7/9 20:24
 * 文件说明:  <p>Feign 调用增强请求头,防止登录信息无法传递而被服务拦截
 */
@Component
public class FeignInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        //获取客户端访问的请求
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if(requestAttributes != null){
            HttpServletRequest request = requestAttributes.getRequest();
            if (request != null) {
                String cookie = request.getHeader("Cookie");
                String token = request.getHeader("Authorization");

                //同步到 feign 请求中
                requestTemplate.header("Cookie", cookie);
                requestTemplate.header("Authorization", token);
                return;
            }
        }
    }
}

调用CmNetClientFeign 接口

java 复制代码
在控制层中引入cmNetClientFeign便可以直接通过cmNetClientFeign调用另一个微服务的接口
  @Resource
    private CmNetClientFeign cmNetClientFeign;

具体实现控制层

该微服务名:nrms-topo-cmnet

java 复制代码
@RestController
@RequestMapping("/api")
@Slf4j
public class CmNetController {
 @PostMapping("/topo/getSerchTopo")
    public BTopo getSerchCmNetTopo(@RequestBody QueryRelParam param) {
        return cmNetService.getSerchCmNetTopo(param);
    }
}
相关推荐
甄超锋7 分钟前
Java Maven更换国内源
java·开发语言·spring boot·spring·spring cloud·tomcat·maven
sniper_fandc6 小时前
Spring Cloud系列—Alibaba Sentinel授权与规则管理及推送
spring cloud·sentinel
泉城老铁1 天前
Spring Boot中实现多线程6种方式,提高架构性能
spring boot·后端·spring cloud
一颗星的征途2 天前
java循环分页查询数据,任何把查询到的数据,分批处理,多线程提交到数据库清洗数据
java·数据库·mysql·spring cloud
Hello World呀2 天前
springcloud负载均衡测试类
spring·spring cloud·负载均衡
布朗克1683 天前
Spring Boot项目通过Feign调用三方接口的详细教程
java·spring boot·feign
麦兜*3 天前
Spring Boot调用优化版AI推理微服务 集成 NVIDIA NIM指南
java·人工智能·spring boot·后端·spring cloud·微服务·ai编程
tanxiaomi5 天前
学习分库分表的前置知识:高可用系统架构理论与实践
java·mysql·spring cloud·系统架构·springboot
蓝眸少年CY5 天前
(第三篇)spring cloud之Zookeeper注册中心
spring·spring cloud·zookeeper
weixin_429326095 天前
Spring Cloud-面试题(49)
后端·spring·spring cloud