springcloud学习之ribbon负载均衡

ribbon负责实现服务的负载均衡。

Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是feign

ribbon简单使用如下:

1、引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

2、在springboot中注入一个RestTemplate,增加@LoadBalanced注解

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

3、调用方式

在需要调用服务的地方注入一个RestTemplate。在url处写服务ID就可以,ribbon会帮我们解析成IP与端口地址。

    @RequestMapping("{userId}")
    public String getAll2(@PathVariable("userId") String id) {
        String url = "http://search-service/"+id;
        System.out.println(url);
        return restTemplate.getForObject(url, String.class);;
    }

4、@LoadBalanced注解会自动实现负载均衡和服务的IP端口解析源码追踪如下:

ribbon之所以能实现这些功能主要依靠的是LoadBalancer的拦截器。查看LoadBalancerInterceptor类

public class LoadBalancerInterceptor implements ClientHttpRequestInterceptor {

	private LoadBalancerClient loadBalancer;
	private LoadBalancerRequestFactory requestFactory;

	public LoadBalancerInterceptor(LoadBalancerClient loadBalancer, LoadBalancerRequestFactory requestFactory) {
		this.loadBalancer = loadBalancer;
		this.requestFactory = requestFactory;
	}

	public LoadBalancerInterceptor(LoadBalancerClient loadBalancer) {
		// for backwards compatibility
		this(loadBalancer, new LoadBalancerRequestFactory(loadBalancer));
	}

	@Override
	public ClientHttpResponse intercept(final HttpRequest request, final byte[] body,
			final ClientHttpRequestExecution execution) throws IOException {
		final URI originalUri = request.getURI();
		String serviceName = originalUri.getHost();
		Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri);
		return this.loadBalancer.execute(serviceName, requestFactory.createRequest(request, body, execution));
	}
}

进入execute方法,在originalUri.getHost();之后会负载均衡选择出对应的服务和端口IP。默认ribbon的负载均衡策略是

IRule DEFAULT_RULE = new RoundRobinRule();是一种线性负载均衡策略,是一种轮询的方式,通过计数器与模的计算选择服务。

当然可以更改成其他的策略

在配置文件中配置即可

service-name: #服务name
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #更改为随机的策略

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值