热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

04负载均衡及Ribbon自定义负载均衡算法

负载均衡及Ribbonribbon是什么?SpringCloudRibbon是基于NetflixRibbon实现的一套客户端负载均衡的工具。ribbon能干吗&#x

负载均衡及Ribbon

ribbon是什么?


Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。


ribbon能干吗?


  • LB,即负载均衡(Load Balance),在微服务或分布式集群中经常用的一种应用。
  • 负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用)。
  • 常见的负载均衡软件有Nginx, Lvs等等
  • dubbo、SpringCloud中均给我们提供了负载均衡,SpringCloud的负载均衡算法可以自定义

第一步、80项目 加依赖

<dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-ribbonartifactId><version>1.4.6.RELEASEversion>dependency><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-eurekaartifactId><version>1.4.6.RELEASEversion>dependency>

第二步、80 application.xml加配置

#erueka配置
eureka:client:register-with-eureka: false #不再eureka注册自己service-url:defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

第三步、80 com.tian.springcloud.config;


  • 配置类

&#64;Configuration
public class ConfigBean { //&#64;Configuration --- spring applicationContext.xml//配置负载均衡实现Template&#64;LoadBalanced //Ribbon&#64;Beanpublic RestTemplate getRestTemplate(){return new RestTemplate();}
}

第四步、controller

&#64;Autowiredprivate RestTemplate restTemplate;//提供多种便捷访问远程http服务的方法&#xff0c;简单的restful服务模板~//这里的地址&#xff0c;一百个该市一个变量&#xff0c;通过服务名来访问//private static final String REST_URL_PREFIX&#61;"http://localhost:8001";private static final String REST_URL_PREFIX&#61;"http://SPRINGCLOUD-PROVIDER-DEPT";

第五步、主启动类加注解 &#64;EnableEurekaClient

//ribbon 和 eureka 整合以后&#xff0c;客户端可以直接调用&#xff0c;不用IP地址
&#64;SpringBootApplication
&#64;EnableEurekaClient
public class DeptConsumer_80 {public static void main(String[] args) {SpringApplication.run(DeptConsumer_80.class,args);}
}



使用Ribbon实现负载均衡

在这里插入图片描述


第一步、创建db02 db03数据库 数据和db01一样&#xff0c;db_source不一样

在这里插入图片描述


第二步、new module 8002 8003

copypom依赖
resource下面的资源
application.xml 里面更改对应的数据库和端口号和 instance-id三个application&#xff1a;name 是一样的 copy DeptMapper.xml
copy java 代码 &#xff08;dao service controller&#xff09;
改一下主启动类 即可

在这里插入图片描述


7001 8001 8002 8003 启动 80启动~


在这里插入图片描述


测试访问 轮询


在这里插入图片描述




自定义负载均衡算法


默认是轮询


在这里插入图片描述

在这里插入图片描述


所以不和主启动类放在一个包下



第一步、自定义一个算法类 TianRandomRule

package com.tian.myrule;import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;public class TianRandomRule extends AbstractLoadBalancerRule {/*每个服务&#xff0c;访问5次 换下一个服务&#xff08;3个&#xff09;* total&#61;0 默认&#61;0 如果等于5 就指向下一个服务节点* index&#61;0 默认为0 如果total&#61;5 index&#43;1* */private int total&#61;0; //被调用的次数private int currentIndex&#61;0; //当前是谁在提供服务public Server choose(ILoadBalancer lb, Object key) {if (lb &#61;&#61; null) {return null;} else {Server server &#61; null;while(server &#61;&#61; null) {if (Thread.interrupted()) {return null;}List<Server> upList &#61; lb.getReachableServers();List<Server> allList &#61; lb.getAllServers();int serverCount &#61; allList.size();if (serverCount &#61;&#61; 0) {return null;}
//-----------------if (total<5){server&#61;upList.get(currentIndex);total&#43;&#43;;}else {total&#61;0;currentIndex&#43;&#43;;if(currentIndex>upList.size()-1){currentIndex&#61;0;}}
//-------------
// int index &#61; this.chooseRandomInt(serverCount);
// server &#61; (Server)upList.get(index);if (server &#61;&#61; null) {Thread.yield();} else {if (server.isAlive()) {return server;}server &#61; null;Thread.yield();}}return server;}}protected int chooseRandomInt(int serverCount) {return ThreadLocalRandom.current().nextInt(serverCount);}public Server choose(Object key) {return this.choose(this.getLoadBalancer(), key);}public void initWithNiwsConfig(IClientConfig clientConfig) {}
}

第二步、配置到spring中~


return new TianRandomRule();


在这里插入图片描述


推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 解决java.lang.IllegalStateException: ApplicationEventMulticaster not initialized错误的方法和原因
    本文介绍了解决java.lang.IllegalStateException: ApplicationEventMulticaster not initialized错误的方法和原因。其中包括修改包名、解决service name重复、处理jar包冲突和添加maven依赖等解决方案。同时推荐了一个人工智能学习网站,该网站内容通俗易懂,风趣幽默,值得一看。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
author-avatar
美好心灵66
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有