赞
踩
SpringCloud详解01
SpringCloud详解02
接上篇SpringCloud详解02,本篇记录Ribbon的使用
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。
简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。
简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的高可用。
Ribbon本地负载均衡客户端 VS Nginx服务端负载均衡区别
Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求,即负载均衡是由服务端实现的。
Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。
Ribbon只是一个客户端的负载均衡器工具,实现起来非常的简单,我们只需要在注入RestTemplate的bean上加上@LoadBalanced就可以了
//消费方应该调用生产方的服务
@RequestMapping("getUsers")
public JsonResult getUsers(){
//由于使用了@LoadBalanced,这里需要通过服务的名称来发送网络请求,在nacos管理界面查看服务名
String url = "http://provider/user-provider/findAll";
JsonResult jsonResult = restTemplate.getForObject(url, JsonResult.class);
System.out.println(jsonResult);
return jsonResult;
}
首先把Springboot的启动改为允许多个启动
然后端口号7070启动,为了方便观察,我们在服务提供方的controller中加了一句控制台输出语句,输出当前端口,然后分别将7071,7072启动,
7070
7071
7072
接着启动消费方8081
查看控制台,此时开启了4个启动类
最后,我们将三个服务提供方控制台清空,去浏览器访问消费方的controller方法,连续访问6次,查看控制台
结果如下:
Ribbon默认使用的是轮询,前端发来6次请求,那么服务提供方,每个服务端都分别接到两次。
Ribbon提供了一个很重要的接口叫做IRule,其中定义了很多的负载均衡策略,默认的是轮询的方式,以下是Ribbon的负载均衡策略
我们需要在消费方的WebConfig中添加以下代码:
//创建对象实现改变Ribbon的负载均衡策略,随机规则
@Bean
public IRule getRule() {
return new RandomRule();
}
然后重启消费方,再次访问6次
7070:
7071:
7072:
轮询实现成功
Feign 和 Ribbon 是 Spring Cloud 的 Netflix 中提供的两个实现软负载均衡的组件,Ribbon 和 Feign 都是用于调用其他服务的,方式不同,Feign 则是在 Ribbon 的基础上进行了一次改进,采用接口的方式,将需要调用的其他服务的方法定义成抽象方法即可,不需要自己构建 http 请求,不过要注意的是抽象方法的注解、方法名要和提供服务的方法对应上
在springcloudalibaba-micro-service-consumer-8080的pom.xml中添加依赖
<!-- Feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
在启动类上加上@EnableFeignClients注解,开启Feign
创建UserService
package com.lzl.service; import com.lzl.dto.UserDto; import com.lzl.utils.JsonResult; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.*; /** * --效率,是成功的核心关键-- * * @Author lzl * @Date 2023/3/15 16:23 */ @Service @FeignClient("provider")//服务名,需要在nacos界面查看服务列表 public interface UserService { @RequestMapping("/user-provider/findAll") JsonResult findAll(); }
注意要加上@FeignClient(“provider”)注解,values为服务提供方yml文件中配置的服务名,也可以在nacos界面查看
创建FeignUserController
package com.lzl.controller; import com.lzl.dto.UserDto; import com.lzl.service.UserService; import com.lzl.utils.JsonResult; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; /** * --效率,是成功的核心关键-- * * @Author lzl * @Date 2023/3/15 16:25 */ @RestController @RequestMapping("feign") public class FeignUserController { @Autowired private UserService userService; @RequestMapping("findAll") public JsonResult findAll(){ return userService.findAll(); } }
启动多个provider服务提供方,测试
成功
本篇主要记录了SpringCloud中的负载均衡组件,其中,Ribbon基本上已经弃用了,更多的开发者还是选择Feign这种直接通过接口调用的方式,重点是,SpringCloud的服务负载均衡和Nginx的负载均衡不是一种东西,不要混淆,下篇继续
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。