05_SpringCloud整合声明式HTTP客户端-Feign

SpringCloud整合声明式HTTP客户端-Feign

文章目录

  • 一、Feign介绍
    • 1. 什么是Feign?
    • 2. Feign组件:
  • 二、基于Feign实现微服务远程调用
    • 2.1. 引入feign依赖
    • 2.2. 启动类加@EnableFeignClients注解
    • 2.3. 添加属性配置(暂无)
    • 2.4. 创建一个feign接口类
    • 2.5. 修改Ribbon调用Feign方式
      • 2.5.1. Feign调用方式
      • 2.5.2. 以前Ribbon调用方式
    • 2.6. 验证
      • 2.6.1. 启动nacos注册中心
      • 2.6.2. 启动user-center应用
      • 2.6.3. 启动content-center应用
      • 2.6.4. 浏览器访问
  • 三、细粒度自定义配置
    • 3. 自定义Feign日志级别
      • 3.1. java代码配置方式
        • 3.1.1. 创建feign配置类
        • 3.1.2. 在feign接口类上指定feign的配置类
        • 3.1.4. 添加监听feign接口的打印体日志
        • 3.1.5. 验证
      • 3.2. 属性配置方式
      • 3.2.1 添加配置信息
      • 3.2.2 重启content-center应用
  • 四、 全局配置自定义
      • 4.1. java代码方式(全局)
        • 4.1.1 在启动类上添加注解
        • 4.1.2 feign配置类
        • 4.1.3 重启content-center应用
      • 4.2. 配置属性方式(全局)
        • 4.2.1 启动类
        • 4.2.2 配置文件属性
        • 4.2.3 重启content-center应用
  • 五、 feign支持的配置项
      • 5.1. 代码方式
      • 5.2. 属性配置方式:
  • 六、 配置最佳实践总结
      • 6.1. Ribbon配置vs Feign配置
      • 6.2. Feign代码方式vs属性方式
      • 6.3. 配置优先级:
  • 七、 最佳实践:

一、Feign介绍

1. 什么是Feign?

Feign是Netfix开源的声明式HTTP客户端
Github地址:https://github.com/openfeign/feign

2. Feign组件:

接口作用默认值
Feign.BuilderFeign的入口Feign.Builder
ClientFeign底层用默认去请求和Ribbon配合时:LoadBalancerFeignClient;不和Ribbon配合时feign.Client.default
Contract契约,注解支持SpringMvcContract
Encoder编码器,用于将对象转换成http请求消息体SpringEncoder
Decoder解码器,将相应消息体转换成对象ResponseEntityDecoder
Logger日志管理器Slf4jLogger
RequestInterceptor用于为每个请求添加通用逻辑

二、基于Feign实现微服务远程调用

2.1. 引入feign依赖

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

2.2. 启动类加@EnableFeignClients注解

//扫描mybatis那些包里面的接口
@SpringBootApplication
@MapperScan("com.itmuch")
@EnableFeignClients
public class ContentCenterApplication {public static void main(String[] args) {SpringApplication.run(ContentCenterApplication.class, args);}
}

2.3. 添加属性配置(暂无)

2.4. 创建一个feign接口类

//@FeignClient(name = "应用名称")
@FeignClient(name = "user-center")
public interface UserCenterFeignClient {/*** http://localhost:8082/users/{id}* @param id* @return*/@GetMapping("/users/{id}")UserDTO finById(@PathVariable Integer id);
}

2.5. 修改Ribbon调用Feign方式

2.5.1. Feign调用方式

@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ShareServiceImpl implements IShareService {private final ShareMapper shareMapper;private final UserCenterFeignClient userCenterFeignClient;@Overridepublic ShareDTO findById(Integer id) {//获取分享详情Share share = this.shareMapper.selectByPrimaryKey(id);//发布人idInteger userId = share.getUserId();//怎么调用用户微服务的/users/{userId}呢?
//      Feign重构后UserDTO userDTO = userCenterFeignClient.finById(userId);//消息的装配ShareDTO shareDTO = new ShareDTO();BeanUtils.copyProperties(share, shareDTO);shareDTO.setWxNickname(userDTO.getWxNickname());return shareDTO;}
}

2.5.2. 以前Ribbon调用方式

@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ShareServiceImpl implements IShareService {private final ShareMapper shareMapper;private final RestTemplate restTemplate;@Overridepublic ShareDTO findById(Integer id) {//获取分享详情Share share = this.shareMapper.selectByPrimaryKey(id);//发布人idInteger userId = share.getUserId();//怎么调用用户微服务的/users/{userId}呢?//Ribbo重构后UserDTO userDTO = this.restTemplate.getForObject("http://user-center/users/{userId}", UserDTO.class, userId);//消息的装配ShareDTO shareDTO = new ShareDTO();BeanUtils.copyProperties(share, shareDTO);shareDTO.setWxNickname(userDTO.getWxNickname());return shareDTO;}

2.6. 验证

2.6.1. 启动nacos注册中心

在这里插入图片描述
在这里插入图片描述

2.6.2. 启动user-center应用

在这里插入图片描述
在这里插入图片描述

2.6.3. 启动content-center应用

在这里插入图片描述
在这里插入图片描述

2.6.4. 浏览器访问

访问:http://localhost:8082/shares/2
在这里插入图片描述

三、细粒度自定义配置

3. 自定义Feign日志级别

级别打印内容
NONE(默认值)不记录任何日志
BASIC请求方法、URL、响应状态码以及执行时间
HEADERS记录BASIC级别的基础上,记录请求和相应的header
FULL记录请求响应的header、body和元数据

3.1. java代码配置方式

3.1.1. 创建feign配置类

/*** feign的配置类* 这个类别加@Configuration注解,* 否则必须挪到@ComponentScan能扫描的包以外*/
public class UserCenterFeignConfiguration {@Beanpublic Logger.Level level(){
//        让feign打印所有的请求细节return Logger.Level.FULL;}
}

3.1.2. 在feign接口类上指定feign的配置类

@FeignClient(name = "user-center",configuration = UserCenterFeignConfiguration.class)
public interface UserCenterFeignClient {/*** http://localhost:8082/users/{id}* @param id* @return*/@GetMapping("/users/{id}")UserDTO finById(@PathVariable Integer id);
}

3.1.4. 添加监听feign接口的打印体日志

logging:level:com.itmuch.contentcenter.feignclient.UserCenterFeignClient: debug

3.1.5. 验证

访问:http://localhost:8082/shares/2
在这里插入图片描述
在这里插入图片描述

3.2. 属性配置方式

3.2.1 添加配置信息

  • feign接口:
@FeignClient(name = "user-center")
public interface UserCenterFeignClient {/*** http://localhost:8082/users/{id}* @param id* @return*/@GetMapping("/users/{id}")UserDTO finById(@PathVariable Integer id);
}
  • application.yml添加配置信息
##监听feign接口的日志
logging:level:com.itmuch.contentcenter.feignclient.UserCenterFeignClient: debug
#feign 细粒度日志级别属性配置形式
feign:client:config:user-center:     #想要调用微服务的应用名称loggerLevel: full

3.2.2 重启content-center应用

访问:http://localhost:8082/shares/2
在这里插入图片描述
在这里插入图片描述

四、 全局配置自定义

4.1. java代码方式(全局)

4.1.1 在启动类上添加注解

@EnableFeignClients(defaultConfiguration = GlobalFeignConfiguration.class)
defaultConfiguration 指向feign的配置类即可

//扫描mybatis那些包里面的接口
@SpringBootApplication
@MapperScan("com.itmuch")
@EnableFeignClients(defaultConfiguration = GlobalFeignConfiguration.class)
public class ContentCenterApplication {public static void main(String[] args) {SpringApplication.run(ContentCenterApplication.class, args);}}

4.1.2 feign配置类

/*** feign的配置类* 这个类别加@Configuration注解,* 否则必须挪到@ComponentScan能扫描的包以外*/
public class GlobalFeignConfiguration {@Beanpublic Logger.Level level(){
//        让feign打印所有的请求细节return Logger.Level.FULL;}
}

4.1.3 重启content-center应用

访问:http://localhost:8082/shares/2
在这里插入图片描述
在这里插入图片描述

4.2. 配置属性方式(全局)

4.2.1 启动类

@SpringBootApplication
@MapperScan("com.itmuch")
@EnableFeignClients
public class ContentCenterApplication {public static void main(String[] args) {SpringApplication.run(ContentCenterApplication.class, args);}

4.2.2 配置文件属性

##监听feign接口的日志
logging:level:com.itmuch.contentcenter.feignclient.UserCenterFeignClient: debug
#feign 全局日志级别属性配置形式
feign:client:config:default:loggerLevel: full

4.2.3 重启content-center应用

访问:http://localhost:8082/shares/2
在这里插入图片描述
在这里插入图片描述

五、 feign支持的配置项

5.1. 代码方式

配置项作用
Logger.level置顶日志级别
Retryer指定充实策略
ErrorDecoder指定错误解码器
Request.Options超时时间
Conection<Requestinterception>拦截器
SetterFactory用于设置Hystrix的配置属性,Feign整合Hystrix才会用

5.2. 属性配置方式:

feign:client:config:<feignName>:connectTimeout: 5000 #连接超时时间readdTimeout: 5000 #连接超时时间loggerLevel: fullerrorDecoder: com.example.SimpleErrorDecoder #错误解码器retryer: com.example.SimpleRetryer #重试策略requestInterceptors:- com.example.FooRequestInterceptor #拦截器#是否对404错误码解码#处理逻辑详见feign.SynchronousMethodHander #executeAndDecodedecode404: falseencoder: com.example.SimpleEncoder #编码器decoder: com.example.SimpleDecoder  #解码器contract: com.example.SimpleContract #契约

六、 配置最佳实践总结

6.1. Ribbon配置vs Feign配置

方式粒度RibbonFeign
代码局部@RibbonClient(Configuration=xx.class) X必须加@Configuration且必须放在父子上下文无法扫描的包@FenginClient(configuration=Y.class) Y的@Configuration可选,如果有,不许放在父子上下文无法扫描的包即可
方式全局@RibbonClients(defaultConfiguration)@EnableFeignClients//(defaultConfiguration = GlobalFeignConfiguration.class)
属性局部.ribbon.NFLoadBalancerClassNamefeign.client.config..loggerLevel
方式全局feign.client.config.default.loggerLevel

6.2. Feign代码方式vs属性方式

配置方式优点缺点
代码配置基于代码灵活如果Feign的配置类加了@Configuration注解需要注意父子上下文,线上修改需要重新打包、发布
属性配置易上手,配置更加直观,线上修改不需要重新打包、发布优先级更高极端场景下没有代码配置灵活

6.3. 配置优先级:

全局代码<全局属性<细粒度代码<细粒度属性

七、 最佳实践:

尽量使用属性配置,属性配置实现不了了的阿情况下在考虑用代码配置
在同一个微服务内尽量保持单一性,比如同一使用属性配置,不要两种方式混用,增加定位代码的复杂性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jonathan Bryce说:OpenStack属于全世界,并不属于一个公司,也不会属于一个国家……...

戳蓝字“CSDN云计算”关注我们哦&#xff01;“openstack这个软件是属于全世界的&#xff0c;并不属于一个公司&#xff0c;也不会属于一个国家。”这是OpenStack基金会创始人兼执行总监 Jonathan Bryce在访谈中一再强调的&#xff0c;也是让阿晶到如今依然记忆犹新的一句话。在…

html中给div设置的属性怎么样才能拿得到_前端基础高频面试题(更新中)

页面渲染的全过程输入url后&#xff0c;先拿到html文件&#xff0c;html下载完以后会开始对它进行解析html在解析的过程中&#xff0c;如果文本里有外部资源链接&#xff0c;比如css、js和img时&#xff0c;会立即启用其他线程下载这些静态资源。特殊的是当遇到js文件的时候&am…

怎么去除idea中代码的波浪线(黄色警告线)

windows中安装的idea中找到Preferences然后执行以下操作: 2.mac系统下的idea:为了减少一定量的重复代码&#xff0c;提醒开发人员注意&#xff0c;但是如果有时几行代码的重复没必要扔到一个统一的地方处理&#xff0c;这是总是提醒&#xff0c;干扰视线。这里根据个人习惯&am…

打脸!IEEE突然宣布解除对华为编辑和同行评审活动的限制;AWS 发生故障,因多处光缆被挖断,历经11小时完全修复……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 消失的台北电脑展&#xff0…

分布式mysql proxy_mysqlda: 基于核心业务对象切分的Proxy模式的分布式MySQL数据库中间件...

mysqlda - MySQL数据库中间件1. 概述1.1. 数据分布式切分方式分布式架构中最难解决的是数据分布式问题&#xff0c;大部分数据库中间件都以分库分表作为切分方式&#xff0c;好处是通用&#xff0c;但也存在以下问题&#xff1a;扩容过程需要以切片为单位在库间移动数据。扩容规…

企业级实战01_ActiveMQ 下载、安装、运行、实战需求

ActiveMQ 下载、安装、运行、实战需求 文章目录一、ActiveMQ简介1. 什么是ActiveMQ&#xff1f;2. ActiveMQ能干什么&#xff1f;3. ActiveMQ特点4. MOM基本功能5. MOM主要特点6. MOM的应用场景_前7. MOM的应用场景_后二、ActiveMQ下载/安装2.1 ActiveMQ下载2.2 ActiveMQ安装环…

刚出炉!AI指数报告:AI人才需求暴涨35倍,薪酬问鼎No.1

2017年~2018年&#xff0c;是人工智能大火的时候。你会发现&#xff0c;跟朋友聊天不谈人工智能&#xff0c;聊天的bigger都上不去。国家支持的朝阳行业&#xff0c;顶级高薪吸引&#xff0c;让甚至许多不是计算机出身的小白&#xff0c;都按捺不住&#xff0c;投身“学海”。而…

企业实战01_Linux下安装ActiveMQ并设置开机启动

文章目录一、MQ常用命令二、防火墙常用命令三、MQ安装3.1. 在root权限下操作&#xff0c;赋予目录权限3.2. 给运行程序赋予可执行权限3.3. 配置环境变量四、MQ添加开机启动4.1. 添加开机启动至初始化目录4.2. 添加MQ内容如下4.3. 将activemq添加至配置文件4.4. 查看服务是否添加…

SDN精华问答 | 使用SDN的一个例子

SDN火热了好一阵子&#xff0c;无论运营商、政府企业、投资机构&#xff0c;一段时间&#xff0c;不知道SDN、不能甩几个SDN相关的名词术语&#xff0c;似乎都落后于时代了。今天&#xff0c;就来看看关于SDN的精华问答吧。1Q&#xff1a;为什么会出现SDN呢&#xff1f; A&…

企业级实战02_SpringMVC整合ActiveMQ 实战需求

SpringMVC整合ActiveMQ 文章目录一、Spring整合ActiveMQ实战1.1. 创建一个父工程&#xff1a;1.2. 引入依赖1.3. 创建一个子项目生产者1.4. 创建一个spring配置文件4. 创建一个点对点的生产者监听5. 创建一个topic的生产者监听四、Spring整合ActiveMQ实战1. 创建一个消费者工程…

苹果WWDC前瞻之iOS 13更新最受关注;微软发布基于区块链的去中心化身份识别系统;小米成立了新集团质量办公室……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go SpaceX猎鹰9号火箭发射&…

企业级实战03_真实项目实战SpringMVC整合ActiveMQ

创建2个工程&#xff0c;生产者和消费者 测试点对点和广播发送常见类型的消息例如&#xff1a;文本(String)、对象(Object) 文本转Long String text “123”; Long.parseLong(text) 数组转集合 Arrays.toArray(list) 引入依赖 <?xml version"1.0" enco…

新一代私有云来了!看透基于开源生态的产品化

戳蓝字“CSDN云计算”关注我们哦&#xff01;文 | 易捷行云&#xff08;EasyStack&#xff09;创始人 陈喜伦来源 | 开源云中文社区进入云计算大时代&#xff0c;中大客户和产业互联网化是云计算的主战场&#xff0c;获取企业级客户是主旋律。对企业级客户来说以新一代私有云为…

mysql 用户管理表_mysql用户管理

msyql用户定义&#xff1a;使用某个用户 从哪个(些)地址访问我的数据库主机范围单独IP&#xff1a;10.0.0.200一个网段:10.0.0.% --->10.0.0.1-->10.0.0.254一个地址范围&#xff1a;10.0.0.5% ---->50-59用户的功能&#xff1a;1、用来登录mysql数据库2、用来管理数据…

8月有望推出5G套餐,资费或低于4G价格;为专利技术,华为5000万美元收购技术公司;AMD和三星宣布合作……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 宝宝树孕育APP新增即时交互功…

从数组随机抽取5个不重复_Power Query 如何保证随机抽取元素不重复

继续昨天的话题&#xff0c;昨天我们实现完全的随抽取列表元素&#xff0c;有一个问题就是可能几次会抽取同一个位置的元素&#xff1a;1-50中随机抽取5个数值&#xff0c;点击刷新&#xff0c;就会出现不同的结果&#xff0c;如上图可能会出现两个相同的数值&#xff0c;如何确…

vba上传指定文件ftp服务器

文章目录一、需求分析&#xff1a;二、操作流程&#xff1a;2.1 【开发工具】-【宏】2.2 【宏】-【编辑】2.3 【把脚本复制进去】2.4 脚本如下2.5 修改位置2.5.1 修改sheet名称和表格一致2.5.2 修改Cells(2,3)2.5.3 修改4 to 1002.5.4 修改Cells(i,3)2.5.5 修改发ftp信息2.5.6 …

云存储精华问答 | 云存储是如何工作的?

云存储是一种网上在线存储&#xff08;英语&#xff1a;Cloud storage&#xff09;的模式&#xff0c;即把数据存放在通常由第三方托管的多台虚拟服务器&#xff0c;而非专属的服务器上。今天就让我们来看看关于云陈存储的精华问答吧。1Q&#xff1a;云存储是如何分类的&#x…

mysql如何实现管理权限分离_基于SpringCloud+vue(ElementUI)+mySQL前后端分离设计之--搭建权限管理系统...

权限图&#xff1a;pom.xmlxsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">4.0.0com.serverauthority0.0.1-SNAPSHOTjarauthorityauthority project for Spring Bootorg.springframework.bootspring-boot-s…