一. 什么是Ribbon?
-
Ribbon是一个基于HTTP和TCP客户端的负载均衡器。Feign中也使用Ribbon。
-
Ribbon可以在通过客户端中配置的ribbonServerList服务端列表去轮询访问以达到均衡负载的作用。
-
当Ribbon与Eureka联合使用时,ribbonServerList会被DiscoveryEnabledNIWSServerList重写,扩展成从Eureka注册中心中获取服务端列表。同时它也会用NIWSDiscoveryPing来取代IPing,它将职责委托给Eureka来确定服务端是否已经启动。
二. 使用Ribbon
-
在pom.xml中添加依赖
<dependencies>
...
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
</dependencies>
-
配置application.yml,指定Eureka注册中心地址
server:
port: 8781
#指定注册中心地址
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
#服务的名称
spring:
application:
name: order-service
-
创建应用启动类
-
添加RestTemplate
-
添加两个注解
-
@SpringBootApplication
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
-
在调用其他服务的地方使用RestTemplate(一般是service的实现类中)
@Service
public class ProductOrderServiceImpl implements ProductOrderService {
@Autowired
private RestTemplate restTemplate;
// @Autowired
// private LoadBalancerClient loadBalancer;
@Override
public ProductOrder getProductOrder(int userId, int productId) {
Map<String,Object> productMap = restTemplate.getForObject("http://product-service/api/v1/product/find?id="+productId, Map.class);
//调用方式二(主函数可以不加@LoadBalanced)
// ServiceInstance instance = loadBalancer.choose("product-service");
// String url = String.format("http://%s:%s/api/v1/product/find?id="+productId,instance.getHost(),instance.getPort());
// RestTemplate restTemplate = new RestTemplate();
// Map<String,Object> productMap = restTemplate.getForObject(url, Map.class);
ProductOrder productOrder = new ProductOrder();
productOrder.setCreateTime(new Date());
productOrder.setUserId(userId);
productOrder.setTradeNo(UUID.randomUUID().toString());
productOrder.setProductName(productMap.get("name").toString());
productOrder.setPrice(Integer.parseInt(productMap.get("price").toString()));
return productOrder;
}
}
三. Ribbon负载均衡源码分析及策略调整
-
Ribbon负载均衡@LoadBalance分析
-
首先从注册中心获取provider的列表
-
通过一定的策略选择其中一个节点
-
再返回给restTemplate调用
-
-
策略调整
-
方式:在application.yml里面,自定义负载均衡策略
-
策略选择
-
如果每个机器配置一样,则建议不修改策略 (推荐)
-
如果部分机器配置强,则可以改为 WeightedResponseTimeRule
-
application.yml:
#自定义负载均衡策略
product-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
本文详细介绍了Ribbon作为HTTP和TCP客户端的负载均衡器的工作原理,包括如何与Eureka配合使用,实现服务发现和负载均衡。并通过实例展示了如何在Spring Cloud项目中配置和使用Ribbon,最后分析了Ribbon的源码和负载均衡策略调整方法。
&spm=1001.2101.3001.5002&articleId=102958908&d=1&t=3&u=13b469f10a304329b68ca152983dd1bf)
1018

被折叠的 条评论
为什么被折叠?



