SpringCloud微服务开发(二)Nacos+OpenFeign

目录

1.注册中心

2.Nacos注册中心

3.OpenFeign

3.1快速入门

3.2连接池

3.3抽取feignClient为api

3.4日志配置

3.5OpenFeign vs Dubbo


1.注册中心

以前我们实现微服务拆分是通过Http请求实现了跨微服务的远程调用。不过这种手动发送Http请求的方式存在一些问题:假如商品微服务被调用较多,为了应对更高的并发,我们可能需要进行多实例部署,如图:

此时,每个item-service的实例其IP或端口不同,问题来了:

  • item-service这么多实例,cart-service如何知道每一个实例的地址?
  • http请求要写url地址,cart-service服务到底该调用哪个实例呢?
  • 如果在运行过程中,某一个item-service实例宕机,cart-service依然在调用该怎么办?
  • 如果并发太高,item-service临时多部署了N台实例,cart-service如何知道新实例的地址?

为了解决上述问题,就必须引入注册中心了

服务流程:

  • 服务启动时就会注册自己的服务信息(服务名、IP、端口)到注册中心
  • 调用者可以从注册中心订阅想要的服务,获取服务对应的实例列表(1个服务可能多实例部署)
  • 调用者自己对实例列表负载均衡,挑选一个实例
  • 调用者向该实例发起远程调用

当服务提供者的实例宕机或者启动新实例时,调用者如何得知呢?

  • 服务提供者会定期向注册中心发送请求,报告自己的健康状态(心跳请求)
  • 当注册中心长时间收不到提供者的心跳时,会认为该实例宕机,将其从服务的实例列表中剔除
  • 当服务有新实例启动时,会发送注册服务请求,其信息会被记录在注册中心的服务实例列表
  • 当注册中心服务列表变更时,会主动通知微服务,更新本地服务列表

2.Nacos注册中心

目前开源的注册中心框架有很多,国内比较常见的有:

  • Eureka:Netflix公司出品,目前被集成在SpringCloud当中,一般用于Java应用
  • Nacos:Alibaba公司出品,目前被集成在SpringCloudAlibaba中,一般用于Java应用
  • Consul:HashiCorp公司出品,目前集成在SpringCloud中,不限制微服务语言

以上几种注册中心都遵循SpringCloud中的API规范,因此在业务开发使用上没有太大差异。由于Nacos是国内产品,中文文档比较丰富,而且同时具备配置管理功能,因此在国内使用较多

使用指南:‌‍​‌​​⁠‌‬​‌‍‍​​​⁠‬⁠​​‬​​​​​‍​​​​‌​⁠​​​​​​​​​​day03-微服务01 - 飞书云文档

服务治理包括服务注册和服务发现,导入的依赖是相同的,这个依赖中同时包含了服务注册和发现的功能。因为任何一个微服务都可以调用别人,也可以被别人调用,即可以是调用者,也可以是提供者

<!--nacos 服务注册发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2021.0.4.0</version> <!-- 替换为你所需的具体版本 -->
</dependency>

服务调用者去订阅服务时,由于有多个实例,而真正发起调用时只需要知道一个实例的地址,因此,服务调用者必须利用负载均衡的算法,从多个实例中挑选一个去访问。常见的负载均衡算法有:

  • 随机
  • 轮询
  • IP的hash
  • 最近最少访问

最简单的随机负载均衡实现:3分钟处微服务01-14.服务治理-服务发现和负载均衡_哔哩哔哩_bilibili

3.OpenFeign

利用RestTemplate实现了服务的远程调用的方式太麻烦了,而且这种调用方式,与原本的本地方法调用差异太大,编程时的体验也不统一,一会儿远程调用,一会儿本地调用。因此,为了改变远程调用的开发模式,让远程调用像本地方法调用一样简单,这就要用到OpenFeign组件了。

其实远程调用的关键点就在于四个参数:请求方式、请求路径、请求参数、返回值类型,所以,OpenFeign就利用SpringMVC的相关注解来声明上述4个参数,然后基于动态代理帮我们生成远程调用的代码,而无需我们手动再编写‬​​​‍​​​​‬​‬⁠​‍​​​⁠​​​‬​​​​⁠⁠​⁠‌⁠‬‌​​‍​‬​‍day03-微服务01 - 飞书云文档

3.1快速入门

3.2连接池

在 OpenFeign 中,连接池(Connection Pool)是一种管理 HTTP 连接的机制,旨在重复利用现有的 HTTP 连接,以减少频繁创建和销毁连接带来的开销,提高远程调用的性能和效率。

为什么需要连接池?

  • HTTP 连接的开销:每次建立新的 HTTP 连接都需要进行 TCP 三次握手,在高并发场景下,这种开销会显著影响性能
  • 减少连接创建时间:通过重用已有的连接,可以避免重复创建和销毁连接,降低延迟
  • 提高并发性能:连接池可以同时保持多个连接,从而支持多个请求的并发处理
  • 资源管理:合理控制最大连接数,防止资源耗尽

3.3抽取feignClient为api

3.4日志配置

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

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

Feign默认的日志级别就是NONE,所以默认我们看不到请求日志

3.5OpenFeign vs Dubbo

  • Dubbo:是一种基于 Java 的 RPC 框架,基于二进制协议,提供了服务发现、服务注册、负载均衡、熔断、流量控制等功能。主要用于构建分布式系统中高性能、高可靠性的服务通信
  • OpenFeign:是 Spring Cloud 生态中的 HTTP 客户端工具,基于 Http 协议和 REST 风格的接口调用,更适合基于 HTTP 的微服务架构,提供了声明式的 REST 客户端功能

简单来说就是Dubbo 在协议灵活性和性能上占优;OpenFeign 受限于 HTTP 协议,但简单易用。

4.Http协议和二进制协议

HTTP 协议

  • 使用文本格式(如 JSON、XML、HTML)进行数据传输
  • 文本数据可读性强,方便调试和理解
  • 由于需要将数据序列化为字符串,且附带较多的头信息,体积通常较大
  • 开销较大,因为每次请求都包含 HTTP 头部信息(如方法、状态码、Headers)
  • 适合人类和机器之间的交互,但在高并发和大量小数据传输场景下效率较低

二进制协议

  • 直接使用二进制格式传输数据,数据更加紧凑,传输效率高
  • 不可读性强,需要特定的工具或解码器来分析数据
  • 减少了文本格式的序列化/反序列化开销
  • 更适合频繁的请求和响应(如 RPC 调用)
  • 适合大规模分布式系统中的高性能通信
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值