Spring Cloud 服务调用Ribbon组件

在Spring Cloud中如果已经实现了服务的注册和服务发现。当启动某个服务的时候,可以通过HTTP的形式将信息(服务IP,端口等)注册到注册中心,并且可以通过SpringCloud提供的工具获取注册中心的服务列表。但是服务之间的调用还存在很多的问题,比如如何更加方便的调用微服务,多个微服务的提供者【集群】如何选择,如何负载均衡等。 为了解决这些问题,Ribbon技术应运而生。

Ribbon概述

Ribbon是 Netflix 发布的一个负载均衡器,有助于控制 HTTP 和 TCP客户端行为。在 SpringCloud 中, Eureka一般配合Ribbon进行使用,Ribbon提供了客户端负载均衡的功能,Ribbon利用从Eureka中读取到的服务信息,在调用服务节点提供的服务时,会合理的进行负载。在SpringCloud中可以将注册中心和Ribbon配合使用,Ribbon自动的从注册中心中获取服务提供者的列表信息,并基于内置的负载均衡算法,请求服务 。

Ribbon的主要作用

服务调用

基于Ribbon实现服务调用, 是通过拉取到的所有服务列表组成(服务名-请求路径的)映射关系。借助 RestTemplate 实现最终的服务调用

负载均衡

当有多个服务提供者时,Ribbon可以根据负载均衡的算法自动的选择需要调用的服务地址

Ribbon的使用

不论是基于Eureka的注册中心还是基于Consul的注册中心,Spring Cloud Ribbon统一进行了封装,所以对于服务调用,两者的方式是一样的

坐标依赖

在 Spring Cloud 提供的服务发现的jar中以及包含了Ribbon的依赖。所以这里不需要导入任何额外的坐标

修改消费者

在创建RestTemplate的方法上添加 @LoadBalanced 注解,并使用RestTemplate完成服务调用

/** 
  * 基于Ribbon的服务调用与负载均衡 
 */ 
@LoadBalanced 
@Bean 
public RestTemplate getRestTemplate() {    
	return new RestTemplate(); 
}
Ribbon的负载均衡策略

Ribbon内置了多种负载均衡策略

  • 顶级接口为 com.netflix.loadbalancer.IRule
  • 默认实现类是 ZoneAvoidanceRule,根据 zone 选择服务列表,然后轮询

IRule 实现类如下
在这里插入图片描述

AbstractLoadBalancerRule (com.netflix.loadbalancer)
ClientConfigEnabledRoundRobinRule (com.netflix.loadbalancer)
// 最佳策略。遍历所有的服务实例,过滤掉故障实例,并返回请求数小的实例返回
BestAvailableRule (com.netflix.loadbalancer)
PredicateBasedRule (com.netflix.loadbalancer)
// 可用过滤策略。过滤掉故障和请 求数超过阈值的服务实例,再从剩下的实力中轮询调用
AvailabilityFilteringRule (com.netflix.loadbalancer)
ZoneAvoidanceRule (com.netflix.loadbalancer)
RandomRule (com.netflix.loadbalancer) // 随机策略
RetryRule (com.netflix.loadbalancer) // 重试策略
RoundRobinRule (com.netflix.loadbalancer) // 以轮询的方式进行负载均
ResponseTimeWeightedRule (com.netflix.loadbalancer)
// 权重策略。会计算每个服务的权重,越高的被调用的可能性越大
WeightedResponseTimeRule (com.netflix.loadbalancer)
负载均衡自定义方式
  • 代码方式:配置灵活,但修改时需要重新打包发布
  • 配置方式:直观,方便,无需重新打包发布,但是无法做全局配置
##需要调用的微服务名称 
shop-service-item:  
	ribbon:    
		NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
饥饿加载【默认懒加载】
  • 开启饥饿加载
  • 指定饥饿加载的微服务名称
ribbon:
	eager-load:
		enabled:true # 开启饥饿加载
		clients: # user-service # 指定对 user-service 这个服务饥饿加载
			- user-service
			- order-service
策略选择:
  1. 如果每个机器配置一样,则建议不修改策略 (推荐)
  2. 如果部分机器配置强,则可以改为 WeightedResponseTimeRule
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud Nacos是一个非常流行的微服务注册中心和配置中心,而Ribbon则是一个负载均衡组件。结合起来,可以实现服务自动发现和负载均衡。 下面是一个简单的示例: 1. 在pom.xml文件中添加依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> ``` 2. 在application.properties或application.yml中配置Nacos和Ribbon: ```yaml # Nacos配置 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 # Ribbon配置 service-provider.ribbon.listOfServers=localhost:8081,localhost:8082 service-provider.ribbon.NIWSServerListClassName=com.netflix.loadbalancer.ConfigurationBasedServerList ``` 3. 创建一个Ribbon的配置类,用于自定义负载均衡策略等: ```java @Configuration public class RibbonConfig { @Bean public IRule ribbonRule() { return new RandomRule(); // 随机负载均衡策略 } @Bean public IPing ribbonPing() { return new PingUrl(false, "/health"); // 检查服务健康状态的URL } } ``` 4. 在服务消费方的代码中,注入RestTemplate对象,并使用@LoadBalanced注解: ```java @RestController public class ConsumerController { @Autowired private RestTemplate restTemplate; @GetMapping("/hello") public String hello() { String url = "http://service-provider/hello"; return restTemplate.getForObject(url, String.class); } @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } } ``` 在这里,我们使用了"http://service-provider/hello"作为服务提供方的URL,而不是具体的IP和端口。这是因为Ribbon会根据服务自动选择一个可用的实例。 以上就是使用Spring Cloud Nacos和Ribbon调用服务的基本步骤。需要注意的是,在使用Nacos作为注册中心时,服务提供方需要在启动时注册自己。可以参考Nacos的官方文档或者Spring Cloud官方文档进行配置和使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值