SpringCloud Alibaba(上):注册中心-nacos、负载均衡-ribbon、远程调用-feign

Nacos

概念:Nacos是阿里巴巴推出的一款新开源项目,它是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos致力于帮助用户发现、配置和管理微服务,它提供了一组简单易用的特性集,包括动态服务发现、服务配置、服务元数据及流量管理,帮助用户更敏捷和容易地构建、交付和管理微服务平台。Nacos是构建以"服务"为中心的现代应用架构(例如微服务范式、云原生范式)的服务基础设施。

在定位上,Nacos是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它提供了强大的功能和简单易用的特性集,帮助用户快速实现动态服务发现、服务配置、服务元数据及流量管理。

在原理上,Nacos通过注册中心实现服务的注册与发现,通过配置管理模块实现配置的动态获取和更新,通过服务管理模块实现服务的元数据管理和流量管理。

在使用上,Nacos可以与Spring, Spring Boot, Spring Cloud等框架集成,可以代替Spring Cloud Eureka和Spring Cloud Config。

要在 Nacos 中使用注册中心功能,需要按照以下步骤进行:

  1. 在项目的 pom.xml 文件中添加 Nacos 的相关依赖。
  2. 在项目的 application.yml 或 application.properties 文件中配置 Nacos 注册中心的相关参数,例如 Nacos 的地址、端口、用户名、密码等。
  3. 在项目的主程序中添加 @EnableDiscoveryClient 注解来启用服务注册和发现功能。
  4. 在项目的服务类中添加 @Service 和 @Autowired 注解来声明服务和注入依赖。
  5. 在项目的客户端类中添加 @RibbonClient 和 @FeignClient 注解来声明客户端和调用服务。

Ribbon

概念:Ribbon是一个基于Netflix的开源项目,它是一个客户端的负载均衡工具。Ribbon提供了完善的配置,例如超时、重试等,并且支持多种负载均衡算法,例如轮询、随机、最少连接算法等。

在概念上,负载均衡是指将客户端的请求分配到多个服务器上,以实现高可用性和高性能。Ribbon作为负载均衡器,通过客户端向Ribbon发送请求,然后Ribbon根据负载均衡算法选择一个服务器,并将请求转发给该服务器。如果该服务器无法响应请求,Ribbon会自动选择另一个服务器,并将请求转发给它。

在定位上,Ribbon是Spring Cloud生态系统中的一部分,它主要用于客户端的负载均衡。

在原理上,Ribbon的工作原理是基于权重的轮询算法。它将所有服务器分配一个权重值,并根据权重值来决定每个服务器被选择的概率。例如,如果服务器A的权重值为2,服务器B的权重值为1,那么在轮询过程中,服务器A被选择的概率是2/3,服务器B被选择的概率是1/3。此外,Ribbon还支持多种负载均衡算法,例如随机算法、最少连接算法、IP哈希算法等。这些算法可以根据不同的场景选择合适的负载均衡策略,以提高系统的性能和可用性。

在使用上,Ribbon可以与Spring Cloud集成,通过合理地配置权重和选择合适的负载均衡算法,可以帮助我们实现高可用性和高性能的分布式系统。同时,Ribbon也支持自定义的负载均衡策略,用户可以根据自己的需求实现自定义的负载均衡算法。

要在 Spring Cloud 中使用 Ribbon 实现负载均衡,需要按照以下步骤进行:

  1. 在项目的 pom.xml 文件中添加 Spring Cloud 和 Ribbon 的相关依赖。
  2. 在项目的 application.yml 或 application.properties 文件中配置 Ribbon 相关的参数,例如 Ribbon 的服务器列表、轮询间隔等。
  3. 在项目的主程序中添加 @EnableDiscoveryClient 注解来启用 Nacos客户端功能。
  4. 在项目的服务类中添加 @Service 和 @Autowired 注解来声明服务和注入依赖。
  5. 在项目的客户端类中添加 @FeignClient 注解来声明客户端和调用服务。

Feign

概念:Feign是一个声明式的Web Service客户端,它使得写HTTP客户端变得更简单。Feign的口号是"Feign makes Java HTTP clients dead simple",它的核心注解和方法极简主义以及使用可插拔的编码器和解码器,使得编写HTTP客户端变得更简单。

在概念上,Feign是一种轻量级的RESTful的HTTP服务客户端,它以Java接口注解的方式调用Http请求,类似于Dubbo,服务消费者拿到服务提供者的接口,然后像调用本地接口方法一样去调用,实际发出的是远程的请求。

在定位上,Feign是Spring Cloud生态系统中的一部分,它主要用于服务的远程调用。

在原理上,Feign通过动态代理的方式将接口的方法映射到HTTP请求上,然后通过HTTP客户端发送请求,最终获取到响应结果。在使用Feign进行远程调用时,我们需要定义一个接口,该接口中定义了需要调用的方法。接口中的方法可以使用注解来指定请求的URL、请求方法、请求参数等信息。例如,我们可以使用@FeignClient注解来指定需要调用的服务名称和服务地址等信息。

在使用上,Feign可以通过引入相关的依赖包来使用。在配置上可以通过添加注解和编写Feign的客户端代码来实现远程调用。同时也可以根据实际需要自定义配置和优化Feign的使用。

要在 Spring Cloud 中使用 Feign 实现远程调用,需要按照以下步骤进行:

  1. 在项目的 pom.xml 文件中添加 Spring Cloud 和 Feign 的相关依赖。
  2. 在项目的 application.yml 或 application.properties 文件中配置 Feign 相关的参数,例如 Feign 的客户端名称、超时时间等。
  3. 在项目的主程序中添加 @EnableFeignClients 注解来启用 Feign 客户端功能。
  4. 在项目的服务接口中添加 @FeignClient 注解来声明服务接口和指定远程服务的 URL。
  5. 在项目的客户端类中注入服务接口,并通过服务接口来调用远程服务的方法

Feign拓展

1>@FeignClient 中name为服务提供者在nacos上注册的服务名, 否则报错

java 复制代码
Load balancer does not have available server for client:xxxx-service

2>@GetMapping("/products/{pid}") 指定接口路径,必须跟服务提供者提供接口url一样,否则报错

java 复制代码
feign.FeignException$NotFound: [404] during [GET] to [http://xxx-service/xxx] 

3> 定义接口参数:如果使用了参数路径方式访问,需要使用@PathVariable("pid") 明确指定路径参数,否则报错

java 复制代码
feign.FeignException$NotFound: [404] during [GET] to [http://xxx-service/xxx] 

4>定义接口参数:如果使用普通方式访问,参数需要使用@RequestParam标记,否则报错

java 复制代码
feign.FeignException$MethodNotAllowed: [405] during [GET] to [http://xxxx-service/xxxx?xxx=1]

5>定义接口参数:如果是对象参数,参数需要使用@RequestBody标记(注意fegin接口,controller接口都要),否则报错

java 复制代码
参数无法获取

6>定义接口参数:如果是对象,可以使用@SpringQueryMap替换上面的@RequestBody

7>定义接口参数:如果需要进行文件上传,需要使用@RequestPart注解标记

8>Feign接口调用默认连接时间是1s,如果电脑较慢,开发中可以配置长一点时间

注意:后面学sentinel 时候,不要配置,会影响观测效果

yaml 复制代码
feign:
  client:
    config:
      default:
        connectTimeout: 5000  #连接时间,单位毫秒
        readTimeout: 5000     #操作时间
相关推荐
生活真难14 小时前
SpringCloud - 任务调度 - xxl-job
后端·spring·spring cloud
Devin~Y21 小时前
大厂Java面试实录:Spring Boot/Cloud + Redis/Kafka + JWT + RAG/Agent(小Y翻车版)
java·spring boot·redis·spring cloud·kafka·spring security·jwt
南部余额21 小时前
Spring Cloud LoadBalancer 详解:客户端负载均衡的原理与实践
spring·spring cloud·负载均衡·微服务架构·轮询算法·loadbanlancer
梵得儿SHI1 天前
SpringCloud 进阶拓展:分布式事务终极解决方案 Seata AT/TCC 模式全栈实战(含生产级避坑指南)
分布式·spring·spring cloud·seata·分布式事务·tcc·tc集群部署
ℳ₯㎕ddzོꦿ࿐1 天前
实战篇:结合 GitLab CI/CD 实现 Spring Cloud 微服务自动化部署与防坑指南
spring cloud·ci/cd·gitlab
蓝眸少年CY2 天前
(第十五篇)spring cloud之Sentinel实现熔断与限流
数据库·spring cloud·sentinel
huipeng9262 天前
GateWay使用详解
java·spring boot·spring cloud·微服务·gateway
huipeng9262 天前
分布式服务部署详解
java·开发语言·spring cloud·微服务
.柒宇.3 天前
SpringCloud微服务入门教程
spring·spring cloud·微服务
.生产的驴3 天前
SpringBoot 大文件分片上传 文件切片、断点续传与性能优化 切片技术与优化方案 文件高效上传
java·服务器·spring boot·后端·spring·spring cloud·状态模式