微服务间调用

一、restTemplate

1、先将restTemplate注册成为一个bean

@Configuration
public class RemoteCallConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}

2、实现代码

private void handleCartItems(List<CartVO> vos) {// TODO 1.获取商品idSet<Long> itemIds = vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());// 2.查询商品// List<ItemDTO> items = itemService.queryItemByIds(itemIds);// 2.1.利用RestTemplate发起http请求,得到http的响应ResponseEntity<List<ItemDTO>> response = restTemplate.exchange("http://localhost:8081/items?ids={ids}",HttpMethod.GET,null,new ParameterizedTypeReference<List<ItemDTO>>() {},Map.of("ids", CollUtil.join(itemIds, ","))); // 2.2.解析响应if(!response.getStatusCode().is2xxSuccessful()){// 查询失败,直接结束return;}List<ItemDTO> items = response.getBody();if (CollUtils.isEmpty(items)) {return;}// 3.转为 id 到 item的mapMap<Long, ItemDTO> itemMap = items.stream().collect(Collectors.toMap(ItemDTO::getId, Function.identity()));// 4.写入vofor (CartVO v : vos) {ItemDTO item = itemMap.get(v.getItemId());if (item == null) {continue;}v.setNewPrice(item.getPrice());v.setStatus(item.getStatus());v.setStock(item.getStock());}
}

二、openFeign

1、 引入依赖

  <!--openFeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--负载均衡器--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>

2、启用OpenFeign

SpringBoot启动类,加上注解@EnableFeignClients

3、编写openFeign客户端

//item-service微服务名称
@FeignClient("item-service")
public interface ItemClient {//yml中的,nacos配置的ip和端口(nacos,可以看我这个专栏),会自动拼上路径//ip+端口/items/ids= x,x , x,@GetMapping("/items")List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);
}

这里只需要声明接口,无需实现方法。接口中的几个关键信息:

  • @FeignClient(“item-service”) :声明服务名称
  • @GetMapping :声明请求方式
  • @GetMapping(“/items”) :声明请求路径
  • @RequestParam(“ids”) Collection ids :声明请求参数
  • List :返回值类型

有了上述信息,OpenFeign就可以利用动态代理帮我们实现这个方法,发送一个GET请求,携带ids为请求参数,并自动将返回值处理为List。
我们只需要直接调用这个方法,即可实现远程调用了。

4、使用接口

1、注入ItemClient
2、调用ItemClient 中的方法,接收返回值

5、连接池

Feign底层发起http请求,依赖于其它的框架。其底层支持的http客户端实现包括:

  • HttpURLConnection:默认实现,不支持连接池
  • Apache HttpClient :支持连接池
  • OKHttp:支持连接池
    因此我们通常会使用带有连接池的客户端来代替默认的HttpURLConnection。比如,我们使用OK Http.

引入依赖

<!--OK http 的依赖 -->
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-okhttp</artifactId>
</dependency>

开启连接池

feign:okhttp:enabled: true # 开启OKHttp功能

6、openFeign最佳实践

思路分析

  • 思路1:抽取到微服务之外的公共module
  • 思路2:每个微服务自己抽取一个module


方案1抽取更加简单,工程结构也比较清晰,但缺点是整个项目耦合度偏高。
方案2抽取相对麻烦,工程结构相对更复杂,但服务之间耦合度降低。

正常小型微服务项目可以选择,耦合度偏高的maven聚合工程

新建一个微服务module

新建之后,引入openFeign需要的坐标,以及负载均衡坐标,服务建立完毕后;
服务建立完毕后,在消费者的微服务模块,引入maven坐标,即可调用里面的方法;

消费者启动类扫描对应包

1、@EnableFeignClients(basePackages=“消费者调用生产者对应的报名”)
2、@EnableFeignClients(clients={生产者的字节码文件(也就是[a.class])})
例子:@EnableFeignClients(clients={A.class})

7、日志输出

OpenFeign只会在FeignClient所在包的日志级别为DEBUG时,才会输出日志。而且其日志级别有4级:

  • NONE:不记录任何日志信息,这是默认值。
  • BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
  • HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
  • FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。
    Feign默认的日志级别就是NONE,所以默认我们看不到请求日志。
logging:level:监控日志包名:debug

通用的module中定义日志级别

public class DefaultFeignConfig {@Beanpublic Logger.Level feignLogLevel(){return Logger.Level.FULL;}
}

消费者启动类加注解

平时不建议开启,在出现错误时候,可以开启排查错误

@EnableFeignClients(defaultConfiguration = DefaultFeignConfig.class)

三、httpClient

可以看我之前苍穹外卖的博客

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

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

相关文章

python requests 常用小工具,代码片,速查,整理

起因(目的): 爬虫其实是很零碎的事情。 小工具&#xff0c; 就像是小螺丝一样&#xff0c; 有空整理一下工具箱。 过程: 自定义请求头&#xff0c;将 Accept-Language 设置为美国的英语。 尤其爬国外的网站&#xff0c; 不然会出现很奇怪的中文。 headers {# 将 Accept-La…

Nginx使用alias代理PHP项目提示FastCGI sent in stderr: “Primary script unknown“ 问题完美解决

踩坑记录 为了方便运营推广,我们有一个需求就是用一个域名达到访问两个PHP项目的目的,本来想着这很简单,就是一个代理解决问题,于是便非常潇洒的分分钟配置了一下,如下: server {listen 80;server_name ab.com;index index.html index.htm index.php index.shtml;root /…

【网络安全】服务基础第一阶段——第八节:Windows系统管理基础---- Web服务与虚拟主机

目录 一、WWW概述 1.1 HTML 1.2 URI与URL 1.2.1 URL&#xff08;统一资源标识符&#xff0c;Uniform Resource Locator&#xff09; 1.3 HTTP 1.3.1 HTTP请求&#xff1a; 1.3.2 HTTP响应 1.3.3 状态码 1.4常见Web URL格式 实验一、网站搭建 1&#xff09;访问失败可…

如何基于numpy和scipy实现曲面的最大梯度计算与显示

大家在做三维可视化研究过程中,经常需要做三维曲面的绘制和相交分析,在不知道三维曲面方程的情况下,如何基于曲面散点数据计算曲面的最大梯度点和梯度线的三维可视化是大家基于曲面分析研究中的重点关注的问题,本文在python环境下,基于numpy、pandas、scipy和matplotlib等…

超详细Git基本命令使用(二)

&#x1f600;前言 本篇博文是关于 Git基本命令的使用&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f6…

【C++】list的使用和list的模拟实现和迭代器失效问题

目录 一、list 的简单介绍 二、list 的基本使用 &#x1f389;list的构造 &#x1f389;list iterator 的使用 &#x1f389;list capacity &#x1f389;list element access &#x1f389;list modifiers &#x1f389;list operator 三、list 的模拟实现 &#x…

【一个简单的整数问题】

问题 TLE代码 #include <bits/stdc.h> using namespace std; const int N 1e510; int b[N]; void add(int l, int r, int d) {b[r1] - d;b[l] d; } int query(int x) {int retval 0;for(int i 1; i < x; i){retval b[i];}return retval; } int main() {int n, m…

C++基础面试题 | 介绍C++中三种智能指针的使用场景?

月落乌啼霜满天&#xff0c;江枫渔火对愁眠。 - 《枫桥夜泊 / 夜泊枫江》(张继) 回答重点 在C中的智能指针利用RAII实现内存分配的管理&#xff0c;避免内存泄漏和其他与动态内存分配相关的问题。C11中提供了三种主要的智能指针&#xff1a;std::unique_ptr、std::shared_ptr和…

【软件测试】测试分类

系列文章目录 第一章 【软件测试】常见的开发模型和测试模型 第二章 【软件测试】bug以及测试用例的设计方法 文章目录 系列文章目录前言一、按照测试目标进行分类二、按照执行方式分类三、按照测试方法四、按照测试阶段分类五、按照实施组织分类总结 前言 在前文中简单了解了…

【编程底层思考】线程阻塞时一定会释放cpu吗

线程阻塞时是否释放CPU取决于阻塞的原因和操作系统的行为。以下是一些具体情况&#xff1a; 1. 阻塞等待资源&#xff1a;当线程因为等待某个资源&#xff08;如锁、信号量、条件变量等&#xff09;而阻塞时&#xff0c;它通常会释放CPU&#xff0c;以便其他线程可以运行。在这…

MATLAB绘图基础4:MATLAB函数

参考书&#xff1a;《 M A T L A B {\rm MATLAB} MATLAB与学术图表绘制》(关东升)。 4.函数 4.1 定义函数 创建新函数文件 % 1.函数文件&#xff1a; % 1.1 函数文件包含一个或多个函数的定义; % 1.2 函数文件包含函数头,用于指定函数名称和输入参数,如:function output func…

掌握测试的艺术:深入探索Python的pytest库

文章目录 **掌握测试的艺术&#xff1a;深入探索Python的pytest库**背景&#xff1a;为什么选择pytest&#xff1f;pytest是什么&#xff1f;如何安装pytest&#xff1f;5个简单的库函数使用方法1. pytest.main()2. pytest.skip()3. pytest.mark.parametrize()4. pytest.raises…

python 地理抠图

python 地理抠图 在Python中进行地理抠图&#xff0c;可以使用geopandas库&#xff0c;它是基于pandas的地理空间数据处理库。以下是一个简单的例子&#xff0c;展示如何根据一个多边形区域来抠出该区域内的地理数据。 首先&#xff0c;安装必要的库&#xff08;如果尚未安装&…

力扣1425.带限制的子序列和

力扣1425.带限制的子序列和 单调队列优化dp f[i] 表示在数组的前 i 个数中进行选择&#xff0c;并且恰好选择了第 i 个数&#xff0c;可以得到的最大和状态转移&#xff1a;f[i] max(max(f[j]) , 0) nums[i];单调队列优化&#xff1a;储存前K个f[i]&#xff0c;并且单调&…

Go 语言生产服务故障案例精析

大多数 Go 开发者都停留在简单的增删改查层面,对 Go 语言本身掌握程度不够,对常用依赖或者开源组件掌握不够,在开发项目过程中总会不经意间引入一些千奇百怪的问题,并且在遇到线上问题时往往束手无策。下面列举一些线上问题以及相应的解决思路,希望大家能从这些问题中吸取…

Debian 安装 OpenSSH 服务器

Debian 安装 OpenSSH 服务器 先查看装了没安装 OpenSSH 服务器软件包启动 SSH 服务&#xff1a;查看服务状态修改 SSH 配置&#xff08;测试机可跳过&#xff09;连接测试文件收发 lrzsz 先查看装了没 apt-cache policy openssh-server安装 OpenSSH 服务器软件包 更新软件包列…

Notion 详细使用基础教程

1. 引言 什么是Notion? Notion是一款集笔记、任务管理、知识库和协作工具于一体的生产力应用。它被广泛用于个人和团队的日常工作和学习中。与传统的生产力工具不同&#xff0c;Notion提供了高度的自定义功能&#xff0c;允许用户根据自己的需求创建独特的工作流&#xff0c;…

(1)冒泡排序和其优化

一 冒泡排序 1.1 冒泡排序概念 冒泡排序&#xff08;Bubble Sort&#xff09;是一种交换排序&#xff0c;基本思想是&#xff1a;两两比较相邻记录的关键字&#xff0c;如果反序则交换&#xff0c;直到没有反序记录位置。 假设要对无序数列{2,3,4,5,6,7,8,1}排序&#xff1a;…

VastBase——执行计划

一、SQL的执行过程 1.词法分析 从查询语句中识别出系统支持的关键字、标识符、运算符、终结符等&#xff0c;确定每个词固有的特性。 以如下这个查询为例&#xff1a; select name from test_0717 where id > 1; 该SQL语句可以划分的关键字、标识符、运算符、常量等…

深入理解linux内核hung_task机制,最全!原创!

背景 最近的一个项目里&#xff0c;发生的问题近乎多半都是hangdetect的问题&#xff0c;之前一直对这种问题总是一知半解&#xff0c;发现主要是因为对此种维测方案(hangdetect/hangtask/watchdog/hungdetect)的理解不够深刻&#xff0c;而更深层次的原因是对于内核的各种机(…