SpringCloud中的Ribbon负载均衡详细解读

 更新时间:2023年11月09日 08:53:19   作者:爱敲代码的小楚  
这篇文章主要介绍了SpringCloud中的Ribbon负载均衡详细解读,当系统面临大量的用户访问,负载过高的时候,通常会增加服务器数量来进行横向扩展(集群),多个服务器的负载需要均衡,以免出现服务器负载不均衡,部分服务器负载较大,部分服务器负载较小的情况,需要的朋友可以参考下

负载均衡

当系统面临大量的用户访问,负载过高的时候,通常会增加服务器数量来进行横向扩展(集群),多个服务器的负载需要均衡,以免出现服务器负载不均衡,部分服务器负载较大,部分服务器负载较小的情况。通过负载均衡,使得集群中服务器的负载保持在稳定高效的状态,从而提高整个系统的处理能力。

软件负载均衡:nginx,lvs

硬件负载均衡:F5

第一层可以用DNS,配置多个A记录,让DNS做第一层分发。

第二层用比较流行的是反向代理,核心原理:代理根据一定规则,将http请求转发到服务器集群的单一服务器上。

软件负载均衡分为:服务端(集中式),客户端。

服务端负载均衡:在客户端和服务端中间使用代理,nginx。

客户端负载均衡:根据自己的情况做负载。Ribbon就是。

客户端负载均衡和服务端负载均衡最大的区别在于服务端地址列表的存储位置,以及负载算法在哪里

客户端负载均衡

在客户端负载均衡中,所有的客户端节点都有一份自己要访问的服务端地址列表,这些列表统统都是从服务注册中心获取的;

服务端负载均衡

在服务端负载均衡中,客户端节点只知道单一服务代理的地址,服务代理则知道所有服务端的地址。

介绍:

Ribbon是Netflix开发的客户端负载均衡器,为Ribbon配置服务提供者地址列表后,Ribbon就可以基于某种负载均衡策略算法,自动地帮助服务消费者去请求 提供者。Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等。我们也可以实现自定义负载均衡算法。

Ribbon作为Spring Cloud的负载均衡机制的实现,

  • Ribbon可以单独使用,作为一个独立的负载均衡组件。只是需要我们手动配置 服务地址列表。
  • Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表(DiscoveryClient),并基于负载均衡算法,请求其中一个服务提供者实例。
  • Ribbon与OpenFeign和RestTemplate进行无缝对接,让二者具有负载均衡的能力。OpenFeign默认集成了ribbon。

Ribbon组成

  • ribbon-core: 核心的通用性代码。api一些配置。
  • ribbon-eureka:基于eureka封装的模块,能快速集成eureka。
  • ribbon-examples:学习示例。
  • ribbon-httpclient:基于apache httpClient封装的rest客户端,集成了负载均衡模块,可以直接在项目中使用。
  • ribbon-loadbalancer:负载均衡模块。
  • ribbon-transport:基于netty实现多协议的支持。比如http,tcp,udp等。

利用Eureka手写负载均衡

代码

	@Autowired
	DiscoveryClient discoveryClient;
	
	AtomicInteger atomicInteger = new AtomicInteger();
	
	@GetMapping("/client7")
	public Object client7() {
		
		
		List<ServiceInstance> instances = discoveryClient.getInstances("provider");
		
		
		// 随机
		int nextInt = new Random().nextInt(instances.size());
		
	
		// 自定义轮训算法
		int i = atomicInteger.getAndIncrement();
		instances.get(i % instances.size());
		
		// 权重。。
		for (ServiceInstance serviceInstance : instances) {
			//	int quanzhong = 	serviceInstance.getMetadata(); // 权重  1-9
		
		}
		ServiceInstance instance = instances.get(nextInt);
		
		// ribbon 完成客户端的负载均衡,过滤掉down了的节点
		//	ServiceInstance instance = lb.choose("provider");
		
		String url ="http://" + instance.getHost() +":"+ instance.getPort() + "/getHi";
		   
		String respStr = restTemplate.getForObject(url, String.class);

		return respStr;
	}

@LoadBalanced

实际使用方式

  • 在eureka-client中使用Ribbon时, 不需要引入jar包,因为erueka-client已经包括ribbon的jar包了。点进去看看。
  • 用@LoadBalance修饰RestTemplate可以实现负载均衡。
  • 由于RestTemplate的Bean实例化方法restTemplate被@LoadBalanced修饰,所以当调用restTemplate的postForObject方法发送HTTP请求时,会使用Ribbon进行负载均衡。
	//使用ribbon,添加@LoadBalance,使RestTemplate具备负载均衡能力。
	@Bean
	@LoadBalanced
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}
	
	@Autowired
	private RestTemplate restTemplate;
	//serviceName=虚拟主机名。默认情况下,虚拟主机名和服务名一致。
	String url = "http://"+serviceName+"/send/alisms-template";
	//调用
	ResponseEntity<ResponseResult> resultEntity = restTemplate.postForEntity(url, smsSendRequest, ResponseResult.class);
	

	//测试根据serviceName获取服务提供者信息。此时不需要@LoadBalance,默认是轮训。
	@Autowired
	private LoadBalancerClient loadBalancerClient;
	// 不能将choseServiceName和 restTemplate写在一起,因为后者中已经有前者了。
	@GetMapping("/choseServiceName")
	public ResponseResult choseServiceName() {
		String serviceName = "service-sms";
		ServiceInstance si = loadBalancerClient.choose(serviceName);
		System.out.println("sms节点信息:url:"+si.getHost()+",port:"+si.getPort());
		
		return ResponseResult.success("");
	}

切换负载均衡策略

注解方式

@Bean
	public IRule myRule(){
		//return new RoundRobinRule();
		//return new RandomRule();
		return new RetryRule(); 

配置文件

针对服务定ribbon策略:

provider.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

给所有服务定ribbon策略:

ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

属性配置方式优先级高于Java代码。

Ribbon脱离注册中心

Ribbon可以和服务注册中心Eureka一起工作,从服务注册中心获取服务端的地址信息,也可以在配置文件中使用listOfServers字段来设置服务端地址。

ribbon.eureka.enabled=false
ribbon.listOfServers=localhost:80,localhost:81

到此这篇关于SpringCloud中的Ribbon负载均衡详细解读的文章就介绍到这了,更多相关SpringCloud的Ribbon负载均衡内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java通过Socket实现简单多人聊天室

    Java通过Socket实现简单多人聊天室

    这篇文章主要为大家详细介绍了Java通过Socket实现简单多人聊天室,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • maven的pom文件与打包详解

    maven的pom文件与打包详解

    pom文件定于了一个maven项目的maven配置,一般pom文件的放在项目或者模块的根目录下。本文详细的介绍了pom文件配置,感兴趣的可以了解一下
    2021-08-08
  • 微服务通过Feign调用进行密码安全认证操作

    微服务通过Feign调用进行密码安全认证操作

    这篇文章主要介绍了微服务通过Feign调用进行密码安全认证操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • mybatis plus框架@TableField注解不生效问题及解决方案

    mybatis plus框架@TableField注解不生效问题及解决方案

    最近遇到一个mybatis plus的问题,@TableField注解不生效,导致查出来的字段反序列化后为空,今天通过本文给大家介绍下mybatis plus框架的@TableField注解不生效问题总结,需要的朋友可以参考下
    2022-03-03
  • idea运行vue项目设置自定义浏览器方式

    idea运行vue项目设置自定义浏览器方式

    这篇文章主要介绍了idea运行vue项目设置自定义浏览器方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 利用javadoc注释自动生成Swagger注解

    利用javadoc注释自动生成Swagger注解

    由于现在controller方法上面没有swagger注解,只能拿到接口url地址,无法获得接口功能描述,所以本文为大家介绍一下如何利用javadoc注释自动生成Swagger注解,感兴趣的可以了解下
    2023-08-08
  • Java中LinkedList和ArrayList的效率分析

    Java中LinkedList和ArrayList的效率分析

    本文主要介绍了Java中LinkedList和ArrayList的效率分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 详解Java消息队列-Spring整合ActiveMq

    详解Java消息队列-Spring整合ActiveMq

    本篇文章主要介绍了详解Java消息队列-Spring整合ActiveMq ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • SpringBoot Maven 项目 pom 中的 plugin 插件用法小结

    SpringBoot Maven 项目 pom 中的 plugin&n

    本文详细介绍了Spring Boot Maven项目打包成jar文件时使用的spring-boot-maven-plugin插件,深入探讨了插件的配置元素,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-01-01
  • Java实战之实现一个好用的MybatisPlus代码生成器

    Java实战之实现一个好用的MybatisPlus代码生成器

    这篇文章主要介绍了Java实战之实现一个好用的MybatisPlus代码生成器,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04

最新评论