SpringCloud(8)Ribbon负载均衡
一:学习目标
①什么是Ribbon,②Ribbon解决了什么问题,③负载均衡不同方案的区别,④Ribbon负载均衡策略,⑤Ribbon入门案列,⑥Ribbon点对点直连(跳过负载均衡,在测试的时候更加方便),⑦Ribbon负载均衡策略设置.
二:什么是Ribbon
(就是我们消费方进行调用服务的时候(服务是好多个),这个时候我们需要从这么多服务中挑选)选择哪个结点(怎么分散的选取对应的服务提供方呢)
我们本来有注册中心,服务提供方,服务消费方;
服务提供方将服务提供方将服务注册到注册中心后,我们的服务消费方从注册中心中拉取列表,(重点)这个时候我们的消费方就远程调用提供方(我们的Ribbon就在这个实现负载均衡)
①:Ribbon 是一个基于 HTTP 和 TCP 的 客服端 负载均衡工具,它是基于 Netflflix Ribbon 实现的。它不像 Spring Cloud 服务注册中心、配置中心、API 网关那样独立部署,但是它几乎存在于每个 Spring Cloud微服务中。包括 Feign 提供的声明式服务调用也是基于该 Ribbon 实现的。Ribbon 默认提供很多种负载均衡算法,例如轮询、随机等等。甚至包含自定义的负载均衡算法。
三:负载均衡不同方案的区别
|
|
四:Ribbon负载均衡策略
①轮询策略(默认)
⑥我们修改一下我们的consumer中的impl类
将//负载均衡器 Ribbon 负载均衡器
@Autowired
private LoadBalancerClient loadBalancerClient;设置这个当做我们的连接
public order selectOrderById(Integer id) { return new order(id,"order-001","中国",319940D,selectProductListBydiscoveryClient1()); } private List<product> selectProductListBydiscoveryClient1(){ StringBuffer sb=null; //获取服务列表 这里没有了获取服务列表 //根据服务名称获取服务 ServiceInstance si=loadBalancerClient.choose("SERVICE-PRODUCT"); if (si==null) return null; sb=new StringBuffer(); sb.append("http://"+si.getHost()+":"+si.getPort()+"/product/list"); //为了测试我们的Ribbon策略,打印出来我们具体调用的是哪个生产者 System.out.println("sb.tostring:"+sb.toString()); //ResponseEntity : 封装了返回数据 ResponseEntity<List<product>> response=restTemplate.exchange( sb.toString(), HttpMethod.GET, null, new ParameterizedTypeReference<List<product>>(){} ); return response.getBody(); }
记得把启动类的负载均衡去掉:
⑦启动consumer应用
在输入
查看我们的console输出台(调用的是prover的):
再次请求一下结果(请求的是prover02):
再多次请求一下(默认采用的是轮询策略):
六:Ribbon负载均衡策略设置
①全局的:在启动类或配置类中注入负载均衡策略对象。所有服务请求均使用该策略。
我们在启动类中注入Bean,全局都是以这种方式进行远程调用(我们使用的是随机策略)
//@EnableEurekaClient //@EnableEurekaClient 注解,目前版本如果配置了Client注册中心,默认会开启该注解 @SpringBootApplication public class ServiceConsumerApplication { //这里直接注入负载均衡的策略,我们这里使用的是随机 @Bean public RandomRule randomRule(){ return new RandomRule(); } @Bean // @LoadBalanced //负载均衡注解 public RestTemplate restTemplate(){ return new RestTemplate(); } public static void main( String[] args ) { SpringApplication.run(ServiceConsumerApplication.class,args); } }
现在进行访问(这是随机访问的结果):
②局部(设置配置文件,看具体的哪个微服务用什么策略)这个是在消费者的配置文件写具体生产者的策略
我们进行访问(这里的策略是随机的策略):
七:Ribbon点对点直连(没有从注册中心拉取,直接通过Ribbon点对点直连)
指的是我们的消费者跳过注册中心,直接去请求生产者(一般在我们的测试环境中用)
①先打开consumer中的pom文件中,将eureka-client的注销掉
②把consumer中的yml文件中的eureka也注销掉
③接下来我们把Ribbon的依赖拉进来(我们用的是Ribbon直连的)
④我们现在要直连,直连的服务是哪几个呢,需要在yml中配置一下
⑤将显示的Eureka关闭,因为默认是开启的
⑥:现在只需要启动服务提供者和服务消费者
现在我们的prover与prover02 都是报错的,因为我们没有Eureka启动,所以会报错,当我们启动consumer后,我们进行访问: