微服务间调用

一、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.rhkb.cn/news/411303.html

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

相关文章

【C++ Primer Plus习题】6.4

问题: 解答: #include <iostream> using namespace std;const int strsize 40; const int usersize 40;typedef struct _Bop {char fullname[strsize];char title[strsize];char bopname[strsize];int preference; }Bop;Bop bop_user[usersize] {{"Wimp Macho&q…

使用Python调用JavaScript进行网页自动化操作

随着互联网技术的飞速发展&#xff0c;网页自动化操作在数据抓取、用户界面测试、内容管理等多个领域变得越来越重要。Python作为一种流行的编程语言&#xff0c;因其简洁的语法和强大的库支持&#xff0c;成为了许多开发者进行网页自动化的首选工具。然而&#xff0c;面对动态…

【C++ Primer Plus习题】6.8

问题: 解答: #include <iostream> #include <fstream> #include <string> using namespace std;int main() {string filename;ifstream stream;char read_char;int count0;cout << "请输入要打开的文件:";getline(cin, filename);stream.op…

微分方程(Blanchard Differential Equations 4th)中文版Section5.1

平衡点分析 从第3章的工作中,我们能够对线性系统的解有定性和解析的理解。不幸的是,非线性系统通常不容易使用我们开发的解析和代数技术来分析,但我们可以利用线性系统的数学来理解非线性系统在其平衡点附近的行为。 Van der Pol 方程 为了说明如何分析平衡点附近解的行为…

输电线路分布式故障诊断系统:分布式智慧网络的构建

输电线路分布式故障诊断系统&#xff1a;分布式智慧网络的构建 今天&#xff0c;就让深圳鼎信智慧科技陪大家一起走进输电线路分布式故障定位系统的世界&#xff1a; 1、系统架构&#xff1a;分布式智慧网络的构建 输电线路分布式故障定位系统主要由三大核心部分组成&#x…

数据结构(6.4_2)——最短路径问题_BFS算法

最短路径问题 BFS求无权图的单源最短路径 原代码 改造visit函数后

Elastic日志分析

目录 介绍步骤 介绍 Elasticsearch 是在 Apache Lucene 上构建的分布式搜索和分析引擎。Elasticsearch常用于日志分析、全文搜索、安全智能、业务分析和运维智能使用案例。 可以使用 JSON 文档形式或通过 API 等将数据发送到 Elasticsearch。 Elasticsearch 自动存储原始文档…

Launcher3 长按Hotseat图标,显示删除角标(红底白杠杠用于删除图标或者显示应用未读消息数量)

基于Android 13,Launcher3实现需求&#xff1a; 1. 长按Hotseat的图标显示红色删除角标 2. 点击角标&#xff0c;删除图标并保存到Database 3.点击其他地方&#xff0c;取消编辑hotseat图标模式 实现效果&#xff1a; 实现原理&#xff1a; 图标是由BubbleTextView来是实现…

数据库系统入门指南

数据库系统入门指南 数据库系统是现代信息技术的重要组成部分。本文将介绍数据库、数据库管理系统、数据库应用系统以及相关概念&#xff0c;帮助初学者快速上手。 什么是数据库&#xff1f; 数据库是一个有组织、可共享的数据集合。它存储在计算机中&#xff0c;数据按一定…

idea import配置

简介 本文记录idea中import相关配置&#xff1a;自动导入依赖、自动删除无用依赖、避免自动导入*包 自动导入依赖 在编辑代码时&#xff0c;当只有一个具有匹配名称的可导入声明时&#xff0c;会自动添加导入 File -> Settings -> Editor -> General -> Auto Imp…

FL Studio24苹果mac电脑破解绿色版安装包下载

FL Studio 24最新版本&#xff0c;这可不仅仅是一个音乐制作软件的升级&#xff0c;它是音乐创作爱好者的福音&#xff0c;是专业制作人的心头好。那么&#xff0c;它究竟有哪些魔力&#xff0c;能让这么多人为之疯狂呢&#xff1f; 我们来看看它的界面。FL Studio 24的界面设…

Nginx: 负载均衡基础配置, 加权轮序, hash算法, ip_hash算法, least_conn算法

负载均衡 在真正的反向代理场景中&#xff0c;必然涉及到的一个概念&#xff0c;就是负载均衡所谓负载均衡&#xff0c;也就是将Nginx的请求发送给后端的多台应用程序服务器通常的应用程序服务器&#xff0c;后面的每台服务器都是一个同等的角色&#xff0c;提供相同的功能 用…

类与ES6类之间的继承

前言 ● 下面是之前学习ES6 classes的代码 class PersonCl {constructor(fullName, birthYear) {this.fullName fullName;this.birthYear birthYear;}calcAge() {console.log(2037 - this.birthYear);}greet() {console.log(你好${this.fullName});}get age() {return 2037…

debian12 - openssh-9.6.P1的编译安装(真机 - 联想G480)

文章目录 debian12 - openssh-9.6.P1的编译安装(真机 - 联想G480)概述笔记G480上安装debian12配置debian12现在用WindTerm_2.6.0按照telnet方式去连接试试配置debian12中的telnet安装telnet服务查看所有服务当前ssh, telnet状态准备更新openssl3.2和openssh在真机上更新openssl…

自动分词代码

代码 from wordsegment import load, segment# 加载模型 load()# 示例 actions ["seeyoulater","turnleft","turnr" ]segmented_actions [segment(action) for action in actions] segmented_actions [" ".join(action) for actio…

云计算概述

云计算的产生以及发展 分布式计算&#xff1a;包含了云计算和网格计算 云计算&#xff1a;以数据为中心进行的计算 网格计算&#xff1a;以计算为中心进行的计算 诞生-1999 初期的发展-2007-2008 加速发展-2009-2014 日渐成熟阶段-2015-目前 云计算的种类 公有云-第三方提供…

chapter08-面向对象编程——(chapter08作业)——day10

343-作业01 package chapter08.homeworks;public class Homework01 {public static void main(String[] args) {/*1.定义一个Person类{name, age, job},初始化Person对象数组&#xff0c;有3个person对象&#xff0c;并按照age从大到小进行排序,提示&#xff0c;使用冒泡排序 H…

Day50 | 108.冗余连接 109.冗余连接II

108.冗余连接 108. 冗余连接 题目 题目描述 树可以看成是一个图&#xff08;拥有 n 个节点和 n - 1 条边的连通无环无向图&#xff09;。 现给定一个拥有 n 个节点&#xff08;节点标号是从 1 到 n&#xff09;和 n 条边的连通无向图&#xff0c;请找出一条可以删除的边&…

一个简单的CRM客户信息管理系统,提供客户,线索,公海,联系人,跟进信息和数据统计功能(附源码)

前言 在当今快速发展的商业环境中&#xff0c;企业管理面临着种种挑战&#xff0c;尤其是如何有效管理和维护客户关系成为了一个关键问题。现有的一些处理方案往往存在功能分散、操作复杂、数据孤岛等痛点&#xff0c;这不仅影响了工作效率&#xff0c;也难以满足企业对客户关…

使用kafka完成数据的实时同步,同步到es中。(使用kafka实现自动上下架 upper、lower)

文章目录 1、发送消息 KafkaService2、生产者 service-album -> AlbumInfoServiceImpl2.1、新增 saveAlbumInfo()2.2、更新 updateAlbumInfo()2.3、删除 removeAlbumInfo() 3、消费者 service-search - > AlbumListener.java 上架&#xff1a;新增专辑到 es下架&#xff…