03-Ribbon(负载均衡)

Ribbon(负载均衡)

在 消费者(订单微服务)中配置

什么是Ribbon

  1. Ribbon是Netflix发布的云中间层服务开源项目,其主要功能是提供客户端实现负载均衡算法。Ribbon客户端组件提供一系列完善的配置项如连接超时重试等。简单的说,Ribbon是一个客户端负载均衡器,可以在配置文件中Load Balancer后面的所有机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器,我们也很容易使用Ribbon实现自定义的负载均衡算法。

  2. 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 # 对当前实例的重试次数
访问测试
  • 浏览器访问 ,出现下图所示,则配置启动成功

3-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 # 对当前实例的重试次数

Ribbon源码

3-2

posted @ 2021-07-19 15:40  爱码士很优秀  阅读(55)  评论(0编辑  收藏  举报