03-Ribbon(负载均衡)
Ribbon(负载均衡)
在 消费者(订单微服务)中配置
什么是Ribbon
Ribbon是Netflix发布的云中间层服务开源项目,其主要功能是提供客户端实现负载均衡算法。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,Ribbon是一个客户端负载均衡器,可以在配置文件中Load Balancer后面的所有机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器,我们也很容易使用Ribbon实现自定义的负载均衡算法。
Ribbon是一个基于Http端的负载均衡,通过在Configuration中配置RestTemplate来进行调用,可以自定义负载均衡的方式
服务调用
简述
Eureka内部集成了Ribbon
-
在创建RestTemplate的时候,声明@LoadBalanced注解即可开启
-
使用RestTemplate调用远程微服务:不需要拼接微服务的URL,只需以待请求的服务名替换IP地址
环境搭建
引入坐标
<!--引入EurekaClient-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置 RestTemplate
@SpringBootApplication
public class OrderRibbonServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderRibbonServiceApplication.class, args);
}
/**
* 使用spring提供的RestTemplate发送http请求到商品服务
* 1.创建RestTemplate对象交给容器管理
* 2.在使用的时候,调用其方法完成操作 (getXX,postxxx)
*
* @author: hwx
* @Date: 2020/5/26 14:19
* @return:
*/
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
yml配置
server:
port: 9002 #端口
spring:
application:
name: service-order #服务名称
#配置Eureka
eureka:
client:
service-url:
defaultZone: http://localhost:9000/eureka/
instance:
prefer-ip-address: true #使用ip地址注册
#日志
logging:
level:
root: debug
#修改ribbon的负载均衡策略, 规则为--> 你的服务名:ribbon:NFLoadBalancerRuleClassName : 策略
service-product:
ribbon:
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
ConnectTimeout: 250 # Ribbon的连接超时时间
ReadTimeout: 1000 # Ribbon的数据读取超时时间
OkToRetryOnAllOperations: true # 是否对所有操作都进行重试
MaxAutoRetriesNextServer: 1 # 切换实例的重试次数
MaxAutoRetries: 1 # 对当前实例的重试次数
访问测试
- 浏览器访问 ,出现下图所示,则配置启动成功
- 使用服务名调用测试
@RestController
@RequestMapping(value = "/order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
/**
* @desc: 通过订单系统调用商品服务, 根据id查询商品信息
* 方式一: 使用java中的urlconnection,httpclient,okhttp
*
* 注意:若启动类设置了@LoadBalanced开启ribbon后,此方法会报错,因为使用负载均衡之后,
* 需要使用服务名称进行调用,若在使用ip的话,就无法起到负载均衡的作用,因为每次都是调用同一个服务,
* 若想测试这个方法,需要注释启动类处的@LoadBalanced注解
*
* @author: hwx
* @Date: 2020/5/26 14:29
* @param: id -> 商品id
* @return:
*/
@GetMapping(value = "/buy/{id}")
public String findById(@PathVariable Integer id) {
//调用discoveryClient方法,调用服务名称获取所有的元数据
List<ServiceInstance> instances = discoveryClient.getInstances("SERVICE-PRODUCT");
//获取唯一的一个元数据
ServiceInstance instance = instances.get(0);
//根据元数据中的主机地址和端口号拼接请求微服务的URL
String product = restTemplate.getForObject("http://" + instance.getHost() + ":" + instance.getPort() + "/product/" + id, String.class);
return product;
}
}
/**
* 通过 SERVICE-PRODUCT 服务名获取 ip port ,使用ip进行调用
* 浏览器访问:http://localhost:9002/order/buy/1
*/
负载均衡
概述
Ribbon是一个典型的客户端负载均衡器,Ribbon会获取服务的所有地址,根据内部的负载均衡算法,获取本次请求的有效地址
环境搭建
准备两个商品微服务( 9001,9011 ),在IDEA中copy一个应用,修改端口号配置 -Dserver.port=9011
在订单系统中远程以负载均衡的形式调用商品服务
修改 RestTemplate Bean
加入 @LoadBalanced 注解
/**
* 使用spring提供的RestTemplate发送http请求到商品服务
* 1.创建RestTemplate对象交给容器管理
* 2.在使用的时候,调用其方法完成操作 (getXX,postxxx)
*
* 开启负载均衡
* 加入:@LoadBalanced注解 --> ribbon提供的负载均衡的注解
*
* @author: hwx
* @Date: 2020/5/26 14:19
* @return:
*/
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
yml文件中配置负载策略
规则为:服务名称:ribbon:NFLoadBalancerRuleClassName:具体策略
service-product:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #随机策略
访问测试
/**
* @desc: 基于ribbon的形式调用远程微服务
* 1.使用@LoadBalanced声明RestTemplate
* 2.使用服务名称替换ip地址
*
* 注意:启动类中设置@LoadBalanced开启ribbon后,会使用负载均衡,需要使用服务名称进行调用,
* 因为每次都是调用同一个服务,当使用的是服务名称的时候,会根据自己的算法去选择具有该服务名称的服务。
*
* @author: hwx
* @date: 2020/5/26 16:04
* @param: id ->
* @return:
*/
@RequestMapping(value = "/buy2/{id}", method = RequestMethod.GET)
public String findByServiceName(@PathVariable Integer id) {
//使用服务名称调用
String product = restTemplate.getForObject("http://SERVICE-PRODUCT/product/" + id, String.class);
return product;
}
/**
* 通过 SERVICE-PRODUCT 服务名进行调用
* 浏览器访问:http://localhost:9002/order/buy2/1
*/
重试机制
在 消费者(订单微服务)中配置
引入spring的重试组件坐标
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
<version>1.2.4.RELEASE</version>
</dependency>
对ribbon进行重试配置
service-product:
ribbon:
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
ConnectTimeout: 250 # Ribbon的连接超时时间
ReadTimeout: 1000 # Ribbon的数据读取超时时间
OkToRetryOnAllOperations: true # 是否对所有操作都进行重试
MaxAutoRetriesNextServer: 1 # 切换实例的重试次数
MaxAutoRetries: 1 # 对当前实例的重试次数