当前位置: 首页 > news >正文

服务注册nacos和OpenFerign(用于封装跨服务之间的调用方法)

服务注册和发现

注册中心原理

在微服务远程调用的过程中,包括两个角色:

  • 服务提供者:提供接口供其它微服务访问,比如item-service
  • 服务消费者:调用其它微服务提供的接口,比如cart-service

在大型微服务项目中,服务提供者的数量会非常多,为了管理这些服务就引入了注册中心的概念。注册中心、服务提供者、服务消费者三者间关系如下:
在这里插入图片描述
在这里插入图片描述

Nacos注册中心

利用nacos实现服务的治理,利用RestTemplate实现了服务的远程调用。
在这里插入图片描述
但是远程调用的代码太复杂了,而且这种调用方式,与原本的本地方法调用差异太大,编程时的体验也不统一,一会儿远程调用,一会儿本地调用。

因此,我们必须想办法改变远程调用的开发模式,让远程调用像本地方法调用一样简单。而这就要用到OpenFeign组件了。

其实远程调用的关键点就在于四个:

  • 请求方式
  • 请求路径
  • 请求参数
  • 返回值类型

OpenFeign

在这里插入图片描述
用于封装跨微服务之间的调用的方法,不用每次都手动写发现微服务列表+负载均衡+请求发送。

在cart-service服务的pom.xml中引入OpenFeign的依赖和loadBalancer依赖时,注意关闭离线模式。
在这里插入图片描述
feign替我们完成了服务拉取、负载均衡、发送http请求的所有工作,是不是看起来优雅多了。
在这里插入图片描述
此时,就不需要RestTemplate(远程调用)了,还省去了RestTemplate的注册。

连接池

连接池指的是一组预先创建的 HTTP 连接,这些连接可以被重复使用,而不是每次请求都创建一个新的连接。

​​在 Feign 中,不同的 HTTP 客户端实现对连接池的支持有所不同:

  • HttpURLConnection:这是 Java 的默认 HTTP 客户端实现,不支持连接池。每次请求都会创建一个新的连接,请求完成后连接会被关闭。这种方式在高并发场景下性能较差。
  • Apache HttpClient:这是一个功能强大的 HTTP 客户端库,支持连接池。通过配置连接池,可以复用连接,提高性能。
  • OKHttp:这是另一个流行的 HTTP 客户端库,也支持连接池。OKHttp 的连接池实现高效且易于配置,适合在高并发场景下使用。

按 Ctrl+Shift+N(Windows/Linux)或 Cmd+Shift+O(macOS),打开“查找文件”对话框。输入类名 FeignBlockingLoadBalancerClient,选择并打开该类文件。打开类文件后,按 Ctrl+F(Windows/Linux)或 Cmd+F(macOS)在该类中搜索 execute 方法,或者你可以直接按 Ctrl+Shift+F(全局搜索)来搜索整个项目中的 execute 方法。
在这里插入图片描述

抽取

如果拆分了交易微服务(trade-service),它也需要远程调用item-service中的根据id批量查询商品功能。这个需求与cart-service中是一样的。
因此,我们就需要在trade-service中再次定义ItemClient接口,这不是重复编码吗? 有什么办法能加避免重复编码呢?
避免重复编码的办法就是抽取。不过这里有两种抽取思路:

  • 思路1:抽取到微服务之外的公共module
  • 思路2:每个微服务自己抽取一个module
    在这里插入图片描述
    方案1抽取更加简单,工程结构也比较清晰,但缺点是整个项目耦合度偏高。
    方案2抽取相对麻烦,工程结构相对更复杂,但服务之间耦合度降低。

抽取之后一直报这个错:
在这里插入图片描述
解决:
在cart-service的启动类上添加声明即可,两种方式:
方式一:声明扫描包:(我采用的)
在这里插入图片描述
方式二:声明要用的FeignClient
在这里插入图片描述

日志配置

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

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

在hm-api模块下新建一个配置类,定义Feign的日志级别:
在这里插入图片描述
该配置类不用加Configuration注解:
cart-service中的启动类上已经配置了@EnableFeignClients(basePackages = "com.hmall.api.client"
在该配置类中, defaultConfiguration = DefaultFeignConfig.class),启动的时候会自动注入该配置类

http://www.dtcms.com/a/283162.html

相关文章:

  • kubernetes学习笔记(一)
  • 数据结构 双向链表(2)--双向链表的实现
  • 黄仁勋链博会演讲实录:脱掉皮衣,穿上唐装,中文开场
  • 完善评论发布功能
  • PHP面向对象编程:类与对象的基础概念与实践
  • 从0到1搭建Lazada账号矩阵:自养号测评的精细化养号全攻略
  • Linux 定时器应用示例
  • 功能测试和回归测试
  • C# WPF后台设置控件样式失效的解决方法
  • 【Vue】tailwindcss + ant-design-vue + vue-cropper 图片裁剪功能(解决遇到的坑)
  • 从规模到效率:大模型三大定律与Chinchilla定律详解
  • 实现通讯录人员选择
  • IKE学习笔记
  • Java强化:多线程及线程池
  • 从电子管到CPU
  • 基于MATLAB的决策树DT的数据分类预测方法应用
  • Android CameraX使用
  • [析]Deep reinforcement learning for drone navigation using sensor data
  • CClink IEF Basic设备数据 保存到MySQL数据库项目案例
  • 高德地图MCP服务使用案例
  • 解锁数据交换的魔法工具——Protocol Buffers
  • 矿业自动化破壁者:EtherCAT转PROFIBUS DP网关的井下实战
  • ABP VNext + EF Core 二级缓存:提升查询性能
  • Mysql系列--1、库的相关操作
  • Mybatis-2快速入门
  • @Binds/@IntoMap/@ClassKey的使用
  • C++ shared_ptr 底层实现分析
  • uniapp+vue3+鸿蒙系统的开发
  • WD5018 同步整流降压转换器核心特性与应用,电压12V降5V,2A电流输出
  • MySQL学习——面试版