软件开发定制[Spring Cloud] Ribbon介绍与定义负载均衡

✨✨个人主页:

📚📚系列专栏: 📖 📖  📖 📖 

                           📖📖📖📖

                           📖📖📖📖  

💖💖软件开发定制如果文章对你有所帮助软件开发定制请留下三连✨✨

 衔接上篇: 

🌿Ribbon介绍

Spring Cloud Ribbon是基于Netflix Ribbon软件开发定制实现的一套软件开发定制客户端负载均衡的工具,软件开发定制主要功能是提供客户端软件开发定制的软件负载均衡算法和服务调用。

如果使用的RestTemplate进行服务调用,那么创建RestTemplate的方法上面加@LoadBalanced注解就会开启Ribbon的负载均衡,Ribbon负载均衡有7种规则,默认轮询。

🍂Ribbon使用

创建子模块spring-cloud-ribbon(c服务)

添加依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-openfeign</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>com.alibaba.cloud</groupId>
  7. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  8. <!--<version>2.2.1.RELEASE</version>-->
  9. </dependency>
  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
  4. </dependency>

application.properties 创建c服务

  1. server.port=8072
  2. spring.application.name=nacos-c
  3. spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

Feign客户端调用a服务

  1. @FeignClient(name="nacos-a")
  2. public interface AServiceClient extends IUserService {
  3. }

测试接口c服务调用a服务

  1. @RestController
  2. public class TestController {
  3. @Autowired
  4. private AServiceClient aServiceClient;
  5. @GetMapping("/test")
  6. public String callA(){
  7. return aServiceClient.getName(100);
  8. }
  9. @GetMapping("/test2")
  10. public String callA2(@RequestParam Integer time){
  11. return aServiceClient.getSleep(time);
  12. }
  13. }

修改子模块user-api,然后打包package,安装install(目的放到本地仓库)

  1. public interface IUserService {
  2. //通过用户Id返回用户名称 /user/name?id=12
  3. @GetMapping("/user/name")
  4. String getName(@RequestParam Integer id);
  5. //通过用户Id返回用户金额 /user/amount?id=12
  6. @GetMapping("/user/amount")
  7. Integer getAmount(@RequestParam Integer id);
  8. //通过Id返回动态睡眠 /user/sleep?time=12
  9. @GetMapping("/user/sleep")
  10. String getSleep(@RequestParam Integer time);
  11. }

修改子模块spring-cloud-nacos-a,然后打包package,运行jar包,并指定两个端口(8069/8070)

  1. @RestController
  2. public class UserServiceController implements IUserService {
  3. @Value("${server.port}")
  4. private String port;
  5. @Override
  6. public String getName(Integer id) {
  7. return StrUtil.format("nacos a({}) 返回的id: {}" ,this.port,id);
  8. }
  9. @Override
  10. public Integer getAmount(Integer id) {
  11. return id*100;
  12. }
  13. @Override
  14. public String getSleep(Integer time) {
  15. //模拟time秒后读取数据资源
  16. ThreadUtil.sleep(time*1000);
  17. return StrUtil.format("nacos a({}) 睡眠了 {} 秒",this.port ,time);
  18. }
  19. }

 开始访问c服务test接口,可以看到调用一次就换一个端口

 其实这就是Ribbon实现的客户端负载均衡算法和服务调用,默认是轮询规则

🍁Ribbon负载均衡规则

Ribbon负载均衡有7种规则,默认轮询。

参考文章:

🌾修改负载均衡规则 

建立自定义配置类

如下定义随机策略,那么调用一次就会随机换一个端口

  1. @RestController
  2. public class MyRuleConfig {
  3. @Bean
  4. public IRule rule(){
  5. //定义随机策略
  6. //return new RandomRule();
  7. }
  8. }

需要什么策略就new什么策略的,当然了除了这7种外我们也可以自定义策略

自定义规则类

修改权重

要想自定义规则,只需要继承AbstractLoadBalancerRule类即可,然后安装自定义的规则定义choose方法

  1. public class MyRule extends AbstractLoadBalancerRule {
  2. //注入Nacos提供的NacosDiscoveryProperties,来获取Nacos服务的属性(例如ip,权重等)
  3. @Autowired
  4. private NacosDiscoveryProperties nacosDiscoveryProperties;
  5. //juc包下,线程安全的Integer
  6. private static AtomicInteger count = new AtomicInteger(0);
  7. @Override
  8. //自动抛异常
  9. @SneakyThrows
  10. public Server choose(Object o) {
  11. //获取负载均衡器
  12. BaseLoadBalancer loadBalancer = (BaseLoadBalancer) this.getLoadBalancer();
  13. //获取服务名
  14. String serverName = loadBalancer.getName();
  15. //命名服务实例
  16. NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
  17. //根据服务名获取所有服务实例,开启订阅
  18. List<Instance> allInstances = namingService.getAllInstances(serverName, true);
  19. //获取权重最大的实例
  20. Instance maxInstance = allInstances.stream().max(Comparator.comparing(Instance::getWeight)).get();
  21. //获取权重最小的实例
  22. Instance minInstance = allInstances.stream().min(Comparator.comparing(Instance::getWeight)).get();
  23. //初始化服务器
  24. Server server = null;
  25. //访问次数
  26. int count2 = count.addAndGet(1);
  27. //对访问次数取模
  28. int mod = count2 % 5;
  29. //余数为0时,选择端口为8069的服务器,否则选择8070服务器
  30. if (mod == 0) {
  31. //8069 权重3
  32. server = new Server(minInstance.getIp(), minInstance.getPort());
  33. } else {
  34. //8070 权重9
  35. server = new Server(maxInstance.getIp(), maxInstance.getPort());
  36. }
  37. return server;
  38. }
  39. @Override
  40. public void initWithNiwsConfig(IClientConfig iClientConfig) {
  41. }
  42. }

配置类添加注解@RibbonClients

  1. @RestController
  2. //@RibbonClients(defaultConfiguration = MyRule.class) //全局服务设置负载规则
  3. //@RibbonClient(name = "nacos-a",configuration = MyRule.class) //某个服务,设置负载规则
  4. //默认轮询
  5. public class MyRuleConfig {
  6. @Bean
  7. public IRule rule(){
  8. //定义随机策略
  9. //return new RandomRule();
  10. //自定义策略:可以new,也可以用@RibbonClient注解
  11. return new MyRule();
  12. }
  13. }

🍃设置超时时间 

application.properties

  1. #Ribbon相关配置
  2. ##建立连接的超时时间
  3. ribbon.ConnectionTimeout=5000
  4. ##连接成功后,读取资源数据时的超时配置
  5. ribbon.ReadTimeout = 3000

访问c服务test2接口,测试读取资源数据超时配置

可以看到超过配置时间,就会报错

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发