Nacos
概念:Nacos是阿里巴巴推出的一款新开源项目,它是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos致力于帮助用户发现、配置和管理微服务,它提供了一组简单易用的特性集,包括动态服务发现、服务配置、服务元数据及流量管理,帮助用户更敏捷和容易地构建、交付和管理微服务平台。Nacos是构建以"服务"为中心的现代应用架构(例如微服务范式、云原生范式)的服务基础设施。
在定位上,Nacos是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它提供了强大的功能和简单易用的特性集,帮助用户快速实现动态服务发现、服务配置、服务元数据及流量管理。
在原理上,Nacos通过注册中心实现服务的注册与发现,通过配置管理模块实现配置的动态获取和更新,通过服务管理模块实现服务的元数据管理和流量管理。
在使用上,Nacos可以与Spring, Spring Boot, Spring Cloud等框架集成,可以代替Spring Cloud Eureka和Spring Cloud Config。
要在 Nacos 中使用注册中心功能,需要按照以下步骤进行:
- 在项目的 pom.xml 文件中添加 Nacos 的相关依赖。
- 在项目的 application.yml 或 application.properties 文件中配置 Nacos 注册中心的相关参数,例如 Nacos 的地址、端口、用户名、密码等。
- 在项目的主程序中添加 @EnableDiscoveryClient 注解来启用服务注册和发现功能。
- 在项目的服务类中添加 @Service 和 @Autowired 注解来声明服务和注入依赖。
- 在项目的客户端类中添加 @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 实现负载均衡,需要按照以下步骤进行:
- 在项目的 pom.xml 文件中添加 Spring Cloud 和 Ribbon 的相关依赖。
- 在项目的 application.yml 或 application.properties 文件中配置 Ribbon 相关的参数,例如 Ribbon 的服务器列表、轮询间隔等。
- 在项目的主程序中添加 @EnableDiscoveryClient 注解来启用 Nacos客户端功能。
- 在项目的服务类中添加 @Service 和 @Autowired 注解来声明服务和注入依赖。
- 在项目的客户端类中添加 @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 实现远程调用,需要按照以下步骤进行:
- 在项目的 pom.xml 文件中添加 Spring Cloud 和 Feign 的相关依赖。
- 在项目的 application.yml 或 application.properties 文件中配置 Feign 相关的参数,例如 Feign 的客户端名称、超时时间等。
- 在项目的主程序中添加 @EnableFeignClients 注解来启用 Feign 客户端功能。
- 在项目的服务接口中添加 @FeignClient 注解来声明服务接口和指定远程服务的 URL。
- 在项目的客户端类中注入服务接口,并通过服务接口来调用远程服务的方法
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 #操作时间