spring cloud之服务通信

openfeign(*)

简介

官网:https://cloud.spring.io/spring-cloud-openfeign/reference/html/

Feign是一个声明式的伪HTTP客户端(底层使用RestTemplate),它使编写web服务客户端变得更容易。使用feign,只需要创建一个接口并对其添加注解。它具有可插入的注释支持(可以使用springmvc的注解),可使用feign注解和JAX-RS注解。Feign还支持可插拔编码器和解码器。feign默认集成了Ribbon,默认实现了负载均衡的效果,并且spring cloud为feign添加了springmvc注解的支持

OpenFeign调用

  • 1.引入依赖
<!-- OpenFeign 依赖-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency><!-- 项目集成其他依赖 -->
<!-- web -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 健康检查 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- consul服务注册与发现 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
  • 2.配置文件
server.port=8787
spring.application.name=CATEGORY
# consul注册中心地址
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
  • 3.启动类添加注解@EnableFeignClients
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class CategoryApplication {}
  • 4.编写feign客户端接口,添加注解@FeignClient
@FeignClient(value = "PRODUCT") // value:服务名
@Api("商品客户端接口定义")
public interface ProductClient {@ApiOperation("简单实现OpenFeign通信")@GetMapping("/product")String product();@ApiOperation("使用拼接参数?k=v&k1=v2方式传参。需指定@RequestParam和属性value")@GetMapping("/test")String test(@RequestParam(value = "id") Integer id, @RequestParam(value = "productName") String productName);@ApiOperation("使用路劲url/{id}/{productName}传参。需指定@PathVariable和属性value")@GetMapping("/test1/{id}/{productName}")String test1(@PathVariable(value = "id") Integer id, @PathVariable(value = "productName") String productName);@ApiOperation("使用对象传递,用JSON方式")@PostMapping("/test2")String test2(@RequestBody ProductDto productDto);
}
  • 5.Category服务和Product服务进行feign调用测试
@RestController
@Slf4j
public class CategoryController {@Autowiredprivate ProductClient productClient;@GetMapping("/category")public String category() {log.info("category enter......");// 使用OpenFeign完成服务间的调用//String result = productClient.product();// 使用拼接参数?k=v&k1=v2方式传参//String result = productClient.test(12, "裙子");// 使用路劲/{id}/{productName}传参//String result = productClient.test1(12, "裙子");// 使用对象传递,用JSON方式//String result = productClient.test2(new ProductDto(12, "裙子", 37.80, new Date()));// 使用数组传参。了解即可//String result = productClient.test3(new Integer[]{1, 2, 3});// 使用集合传参。服务费需要集合定义到对象中(不能直接使用集合形参)。了解即可String result = productClient.test4(new Integer[]{1, 2, 3});return "category ok!!" + result;}
}@RestController
@Slf4j
@Api("商品服务")
public class ProductController {@Value("${server.port}")private int port;@ApiOperation("简单实现OpenFeign通信")@GetMapping("/product")public String product() {log.info("product enter......");return "product ok,当前端口号:" + port;}@ApiOperation("使用拼接参数?k=v&k1=v2方式传参")@GetMapping("/test")public String test(@RequestParam Integer id, @RequestParam String productName) {log.info("test enter....id={},productName={}", id, productName);return "product ok,当前端口号:" + port;}@ApiOperation("使用路劲url/{id}/{productName}传参")@GetMapping("/test1/{id}/{productName}")public String test1(@PathVariable Integer id, @PathVariable String productName) {log.info("test1 enter....id={},productName={}", id, productName);return "product ok,当前端口号:" + port;}@ApiOperation("使用对象传递,用JSON方式")@PostMapping("/test2")public String test2(@RequestBody ProductDto productDto) {log.info("test enter....productDto={}", productDto);return "product ok,当前端口号:" + port;}@ApiOperation("使用数组传参。了解即可")@GetMapping("/test3")public String test3(Integer[] ids) {for (Integer id : ids) {log.info("id:{}",id);}return "product ok,当前端口号:" + port;}@ApiOperation("通过集合传参,不能直接使用List等集合接收,需要用对象定义。了解即可")@GetMapping("/test4")public String test4(ProductIdsDTO productIdsDTO) {productIdsDTO.getIds().forEach(id -> log.info("id:{}", id));return "product ok,当前端口号:" + port;}
}
  • 6.feign接口传参
需要指定传参格式,OpenFeign是一个伪的HTTP客户端,底层用的RestTemplate,所以需要在feign接口中告诉它如何去传参,否则会报错1.通过?拼接传参。例如:url/?k=v&k1=k2@GetMapping("/test")String test(@RequestParam(value = "id") Integer id, @RequestParam(value = "productName") String productName);
备注:需要指定@RequestParam注解和value属性值2.通过路径传参。例如:url/{id}/{productName}@GetMapping("/test1/{id}/{productName}")String test1(@PathVariable(value = "id") Integer id, @PathVariable(value = "productName") String productName);
备注:需要指定@PathVariable注解和value属性值3.通过对象传参,推荐使用JSON格式@PostMapping("/test2")String test2(@RequestBody ProductDto productDto);
备注:需要指定@RequestBody注解4.使用数组传参和集合传参,了解即可数组传参,feign接口定义:@GetMapping("/test3")String test3(@RequestParam Integer[] ids);备注:必须指定@RequestParam注解使用集合传参,跟数组传参定义一致。但服务方形参接收定义不一样,详情见"5.feign接口测试"示例

OpenFeign接口调用超时设置

  • OpenFeign接口调用,超时时间默认为1秒,当服务方执行时间超过1秒时,会报错
There was an unexpected error (type=Internal Server Error, status=500).
Read timed out executing GET http://PRODUCT/product
  • 修改OpenFeign默认超时时间配置
# 修改某个服务(PRODUCT)的OpenFeign默认超时时间(默认为1秒)
# PRODUCT:服务名。指定服务连接超时,单位毫秒
feign.client.config.PRODUCT.connect-timeout=3000
# PRODUCT:服务名。指定服务等待超时,单位毫秒
feign.client.config.PRODUCT.read-timeout=3000# 修改所有服务的OpenFeifn默认超时时间(默认为1秒)
#feign.client.config.default.connect-timeout=3000
#feign.client.config.default.read-timeout=3000

OpenFeign调用日志

  • OpenFeign日志级别
- feign对日志的处理非常灵活,可以为每个feign客户端指定日志记录策略,feign日志的打印只会DEBUG级别做出响应- 可以为feign客户端配置各自的logger.level对象,日志级别有如下几种- NONE:不记录任何日志(默认)- BASIC:仅记录请求方法,url,响应状态码及执行时间- HEADERS:记录BASIC级别的基础上,记录请求和响应的header- FULL:记录请求和响应的header,body及元数据
  • 开启日志打印
# 开启某个feign客户端(PRODUCT)的日志打印
# feign.client.config.PRODUCT.logger-level=full
# 开启所有的feign客户端的日志打印
feign.client.config.default.logger-level=full# 指定包路径日志打印级别(指定feign客户端的包日志级别必须是debug)
logging.level.com.coolw.cloud.study.feign=debug日志信息如:
22-01-12 22:51:04.139 DEBUG 8324 --- [nio-8787-exec-1] c.coolw.cloud.study.feign.ProductClient  : [ProductClient#product] ---> GET http://PRODUCT/product HTTP/1.1
2022-01-12 22:51:04.139 DEBUG 8324 --- [nio-8787-exec-1] c.coolw.cloud.study.feign.ProductClient  : [ProductClient#product] ---> END HTTP (0-byte body)......2022-01-12 22:51:05.410 DEBUG 8324 --- [nio-8787-exec-1] c.coolw.cloud.study.feign.ProductClient  : [ProductClient#product] <--- HTTP/1.1 200 (1267ms)
2022-01-12 22:51:05.410 DEBUG 8324 --- [nio-8787-exec-1] c.coolw.cloud.study.feign.ProductClient  : [ProductClient#product] connection: keep-alive
2022-01-12 22:51:05.410 DEBUG 8324 --- [nio-8787-exec-1] c.coolw.cloud.study.feign.ProductClient  : [ProductClient#product] content-length: 33
2022-01-12 22:51:05.410 DEBUG 8324 --- [nio-8787-exec-1] c.coolw.cloud.study.feign.ProductClient  : [ProductClient#product] content-type: text/plain;charset=UTF-8
2022-01-12 22:51:05.411 DEBUG 8324 --- [nio-8787-exec-1] c.coolw.cloud.study.feign.ProductClient  : [ProductClient#product] date: Wed, 12 Jan 2022 14:51:05 GMT
2022-01-12 22:51:05.411 DEBUG 8324 --- [nio-8787-exec-1] c.coolw.cloud.study.feign.ProductClient  : [ProductClient#product] keep-alive: timeout=60
2022-01-12 22:51:05.411 DEBUG 8324 --- [nio-8787-exec-1] c.coolw.cloud.study.feign.ProductClient  : [ProductClient#product] 
2022-01-12 22:51:05.413 DEBUG 8324 --- [nio-8787-exec-1] c.coolw.cloud.study.feign.ProductClient  : [ProductClient#product] product ok,当前端口号:8788
2022-01-12 22:51:05.413 DEBUG 8324 --- [nio-8787-exec-1] c.coolw.cloud.study.feign.ProductClient  : [ProductClient#product] <--- END HTTP (33-byte body)

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

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

相关文章

Windows Center 检查sts证书

for i in $(/usr/lib/vmware-vmafd/bin/vecs-cli store list); do echo STORE $i

如何在 Windows 10/11 上高质量地将 WAV 转换为 MP3

WAV 几乎完全准确地存储了录音硬件所听到的内容&#xff0c;这使得它变得很大并占用了更多的存储空间。因此&#xff0c;WAV 格式在作为电子邮件附件发送、保存在便携式音频播放器上、通过蓝牙或互联网从一台设备传输到另一台设备等时可能无法正常工作。 如果您遇到 WAV 问题&…

数据库数据恢复—MSSQL报错“附加数据库错误823”如何恢复数据?

数据库故障&分析&#xff1a; MSSQL Server数据库比较常见的报错是“附加数据库错误823”。如果数据库有备份&#xff0c;只需要还原备份即可&#xff1b;如果无备份或者备份不可用&#xff0c;则需要使用专业的数据恢复手段去恢复数据。 MSSQL Server数据库出现“823”的报…

1.jvm基本知识

目录 概述jvm虚拟机三问jvm是什么&#xff1f;java 和 jvm 的关系 为什么学jvm怎么学习为什么jvm调优?什么时候jvm调优调优调什么 结束 概述 相关文章在此总结如下&#xff1a; 文章地址jvm类加载系统地址双亲委派模型与打破双亲委派地址运行时数据区地址运行时数据区-字符串…

理工ubuntu20.04电脑配置记录

8188gu无线网卡配置 首先下载github上的文件&#xff0c;进入文件夹 安装make命令 1. 查看usb无线网卡 sudo lsusb|grep 8188 2. 环境准备 sudo apt-get install git make build-essential git dkms linux-headers-$(uname -r) 3. 编译安装 git clone https://github.com…

敏感数据是什么?包含哪些?如何保障安全?

最近看到不少小伙伴在问&#xff0c;敏感数据是什么&#xff1f;包含哪些&#xff1f;如何保障安全&#xff1f;这里我们小编就给大家一一解答一下&#xff0c;仅供参考哦&#xff01; 敏感数据是什么&#xff1f; 敏感数据&#xff0c;是指泄漏后可能会给社会或个人带来严重危…

UE5、CesiumForUnreal实现加载GeoJson绘制墙体(Wall)功能(StaticMesh方式)

文章目录 1.实现目标2.实现过程2.1 实现原理2.2 具体代码2.3 应用测试2.3.1 流动材质2.3.2 蓝图测试3.参考资料1.实现目标 与上一篇以StaticMesh方式实现面类似,本文通过读取GeoJson数据,在UE中以StaticMeshComponent的形式绘制出墙体数据,并支持Editor和Runtime,在Editor下…

C#中.NET Framework 4.8控制台应用通过EF访问已建数据库

目录 一、创建.NET Framework 4.8控制台应用 二、建立数据库 1. 在SSMS中建立数据库Blogging 2.在VS上新建数据库连接 三、安装EF程序包 四、自动生成EF模型和上下文 1.Blog.cs类的模型 2.Post.cs类的模型 3.BloggingContext.cs数据库上下文 五、编写应用程序吧 我们…

流量分析(5.5信息安全铁人三项赛数据赛题解)

黑客通过外部的web服务器攻击到企业内部的系统中&#xff0c;并留下了web后门&#xff0c;通过外部服务器对内部进行了攻击。 目录 黑客攻击的第一个受害主机的网卡IP地址 黑客对URL的哪一个参数实施了SQL注入 第一个受害主机网站数据库的表前缀(加上下划线 例如abc_) 第一…

哔哩哔哩自动引流软件的运行分享,以及涉及到技术与核心代码分享

先来看实操成果&#xff0c;↑↑需要的同学可看我名字↖↖↖↖↖&#xff0c;或评论888无偿分享 大家好&#xff0c;我是一名专注于自动引流软件研发的技术专家。今天&#xff0c;我将与大家分享自动引流软件涉及到的技术与核心代码&#xff0c;希望能为大家提供一些有价值的参…

【postgresql】查看数据中表的信息

切换到postgresql数据库&#xff0c;各种不适应吧。 有个需求需要查询数据表的各种信息。 下面我们一起学习吧。 ●PostgreSQL: Documentation PostgreSQL: Documentation ●pg_namespace 存储名字空间。名字空间是 SQL 模式下层的结构&#xff1a;每个名字空间有独立的关系…

Java排序算法之基数排序

基数排序&#xff08;Radix Sort&#xff09;是一种线性时间复杂度的排序算法&#xff0c;其时间复杂度为O(d(nk))&#xff0c;其中d是数字的位数&#xff0c;k是进制数。基数排序是一种非比较排序算法&#xff0c;它按照数位的大小来进行排序。它可以处理正整数、负整数和小数…

kubectl 常用命令搜集 —— 筑梦之路

集群信息&#xff1a; 1. 显示 Kubernetes 版本&#xff1a;kubectl version 2. 显示集群信息&#xff1a;kubectl cluster-info 3. 列出集群中的所有节点&#xff1a;kubectl get nodes 4. 查看一个具体的节点详情&#xff1a;kubectl describe node <node-name> 5.…

csh 脚本批量处理文件并将文件扔给程序

文章目录 前言程序批量造 case 并将 cmd 扔给程序运行批量收集数据汇总 前言 Linux下我们经常会写一些shell脚本来辅助我们学习或者工作&#xff0c;从而提高效率。 之前就写过一篇博客&#xff1a;Linux下利用shell脚本批量产生内容有规律变化的文件 程序 批量造 case 并将…

国际阿里云:无法访问ECS实例中的服务的排查方法!!!

操作场景 无法访问ECS实例中的服务可能有以下原因&#xff1a; 可能原因 排查方案 ECS实例的安全组未开放相应端口 检查ECS实例安全组规则 ECS实例中&#xff0c;该服务未启动/开启或服务对应端口未被监听 检查服务状态及端口监听状态 ECS实例内防火墙设置错误 检查ECS…

linux中mysql下mysqldump命令常见用法详解

linux中mysql下mysqldump命令常见用法详解 一、导出1、数据库db级2、数据表级3. 主要导出参数 二、 导入1. 常用导入方法2. 导入示例 三、 拼出部分对象创建语句1. 导出视图创建语句2. 导出其他对象 一、导出 1、数据库db级 导出所有db结构和数据 mysqldump -uroot -p -A >…

计算机网络基础导览

入门 一看就懂&#xff0c;原来这就是计算机网络-CSDN博客一看就懂&#xff0c;把“百度”搬回家-CSDN博客 理论基础 以太网数据帧-CSDN博客 扩展 用互联网思维打造物流网&#xff08;别人笑我太疯癫&#xff0c;我把自己当成仙&#xff09;-CSDN博客

玩转ChatGPT:ARIMA模型定制GPT-1.0

一、写在前面 好久不更新咯&#xff01; OpenAI又推出了GPT的一系列重大更新&#xff0c;其中GPTs深得我心啊。 GPTs允许用户创建自定义的ChatGPT版本&#xff0c;以满足自己各种特定需求。其核心理念在于&#xff0c;用户可以为不同的场景和任务创建定制化的ChatGPT。这意味…

2023云计算发展趋势

目录 一、云计算是什么&#xff1f; 二、云计算发展趋势 三、总结 一、云计算是什么&#xff1f; 云计算是一种基于互联网的计算方式&#xff0c;通过网络连接的方式提供计算能力、存储服务、应用程序和数据资源。它通常通过虚拟化技术实现多个计算机资源的池化&#xff0c;…

【NodeJS】Nodejs安装及环境配置

下载安装包 网址&#xff1a;https://nodejs.org/en 安装程序 1.下载完成后&#xff0c;双击安装包&#xff0c;进行安装&#xff0c;一路默认配置 nxet 即可&#xff0c;安装路劲给默认在C盘&#xff0c;或者选择其他位置&#xff0c;当前教程默认C盘 2.下图根据本身的…