当前位置:   article > 正文

Ribbon_在没有注册中心的情况下,服务怎么通过ribbon通信

在没有注册中心的情况下,服务怎么通过ribbon通信

Ribbon

  • 服务器端负载均衡Nginx

    nginx是客户端所有请求统一交给nginx,由nginx进行实现负载均衡转发请求,属于服务器端负载均衡。
    即请求有nginx服务器端进行转发

  • 客户端负载均衡Ribbon

    Ribbon是从eureka注册中心服务器端上获取服务注册信息列表,缓存在JVM本地,之后使用本地实现RPC远程调用技术进行调用。
    即使客户端实现负载均衡

  • 应用场景区别

    1. Nginx服务器负载均衡,适合于针对与服务器端,比如Tomcat、jetty
    2. Ribbon适合于在微服务中RPC远程调用实现本地服务负载均衡,比如Dubbo、SpringCloud

  • Ribbon(本地)客户端负载均衡器执行流程

    当订单服务需要调用会员服务接口时,现在以会员别名(app_member)去注册中心上获取对应会员实际接口地址,订单服务获取到 地址之后,缓存到本地(JVM客户端),然后在本地实现远程的RPC调用

    订单服务以会员别名获取对应的服务接口地址的时候,接口地址可能会是多个。存放采用List接口

    本地客户端负载均衡指的,本地从eureka上获取对应信息列表,获取到信息列表之后,然后本地实现负载均衡

    在这里插入图片描述

  • 负载均衡的算法
    List[0] value = 127.0.0.1:8000
    List[1] value = 127.0.0.1:8010

    接口总请求%服务器数量得到实际下标服务位置
    1 % 2 = 1 对应下标位置为1
    2 % 2 = 0 对应下标位置为0
    3 % 2 = 1 对应下标位置为1

  • 手写Ribbon实现

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class ExtRibbonController {
	
	@Autowired
	private RestTemplate restTemplate;
	//获取注册中心上的服务对象列表
	@Autowired
	private DiscoveryClient discoveryClient;
	//接口请求总数
	private int reqCount = 1; 
	//纯手写Ribbon本地负载均衡效果
	
	@RequestMapping("ribbonMember")
	public String ribbonMember(){
		//1.获取对应服务器远程调用地址
		String instanceUrl = getInstances()+"getMember";
		System.out.println("instanceUrl"+instanceUrl);
		//2.再使用rest方式发送请求,可以直接使用httpclient技术实现远程调用
		String result = restTemplate.getForObject(instanceUrl, String.class);
		return result;
	}
	
	private String getInstances(){
		List<ServiceInstance> instances = discoveryClient.getInstances("app-dawn-member"); //服务名
		if(instances==null || instances.size()<=0){
			return null;
		}
		//获取服务器集群个数
		int instanceSize = instances.size();
		int serviceIndex  = reqCount%instanceSize;
		reqCount++;
		return instances.get(serviceIndex).getUri().toString();
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/690758
推荐阅读
相关标签
  

闽ICP备14008679号