前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Ribbon(客户端负载均衡)

Ribbon(客户端负载均衡)

作者头像
爱撒谎的男孩
发布2019-12-31 15:49:05
7990
发布2019-12-31 15:49:05
举报
文章被收录于专栏:码猿技术专栏码猿技术专栏

文章目录

1. Ribbon - 客户端负载均衡

1.1. 简介

1.2. 使用(消费端)

1.2.1. 注意

1.3. 负载均衡算法

1.4. 配置负载均衡策略

1.5. 自定义负载均衡算法

1.6. 超时时间设置

1.7. 重试机制

Ribbon - 客户端负载均衡

简介

  • Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。它是一个基于HTTP和TCP的客户端负载均衡器。它可以通过在客户端中配置ribbonServerList来设置服务端列表去轮询访问以达到均衡负载的作用。

使用(消费端)

  • 导入依赖
代码语言:javascript
复制
      <!--eureka客户端-->		
      <dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--ribbon-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
  • 在消费端添加如下配置,用来从eureka集群中轮询请求可访问的微服务,不用注册到eureka中,配置如下:
代码语言:javascript
复制
server:
  port: 8003
  servlet:
    context-path: /dept-consumer
eureka:  # 配置eureka客户端,不用注册到eureka中
  client:
    serviceUrl:   
      defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/,http://eureka7001.com:7001/eureka/  # eureka的暴露地址,指向集群中每一个eureka,多个用都好分隔  
    register-with-eureka: false   # 只是消费者,因此不用将自己注册到eureka中
  • 在restTemplate的配置类中添加一个注解@LoadBalanced,配置如下:
代码语言:javascript
复制
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
/**
 * RestTemplate的配置类
 * @author 陈加兵 	
 * @since 2018年12月6日 下午6:10:58
 */
@Configuration
public class RestConfig {
	@Bean
	@LoadBalanced  //ribbon实现客户端的负载均衡,默认使用的是轮询的算法
    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
        return new RestTemplate(factory);
    }

    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setReadTimeout(5000);//单位为ms
        factory.setConnectTimeout(5000);//单位为ms
        return factory;
    }
}
  • 在主启动类上添加@EnableEurekaClient注解
代码语言:javascript
复制
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaClientApplication.class, args);
	}
}
  • 消费者的controller端直接使用微服务的名称访问即可,ribbon会自动根据名称在eureka中查询指定的微服务,不需要写明微服务的ip了,如下:
代码语言:javascript
复制
@RestController
public class DeptController {
	@Resource
	private RestTemplate restTemplate;
	//请求路径直接使用微服务的名称即可EUREKA-PROVIDER,eureka-provider是微服务的项目名称(servlet.context-path)
	private final static String URI_PREFIX="http://EUREKA-PROVIDER/eureka-provider";  
	
	/**
	 * 使用RestTemplate发出get请求
	 */
	@GetMapping("/dept/{id}")
	public Dept getDept(@PathVariable("id")Integer id) throws RestClientException, URISyntaxException{
		Map<String, Object> params=new HashMap<String, Object>();
		params.put("id", id);
		Dept dept = restTemplate.getForObject(URI_PREFIX+"/dept/{id}", Dept.class, params);
		return dept;
	}
}
  • 创建两个提供者,提供相同的服务,使用同一个微服务的名称(EUREKA-PROVIDER),这个就相当于是一个集群了,需要改变的就是端口instance-id,配置如下:
    • 第一个服务提供者

    server: port: 8001 servlet: context-path: /eureka-provider # 访问的项目名称在配置“集群”的时候也是必须一样的,否则不好调用 eureka: client: serviceUrl: defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/,http://eureka7001.com:7001/eureka/ # eureka的暴露地址,直接注册,使用的是eureka的集群 instance: instance-id: eureka-provider:8001 ## instance-id区别服务 prefer-ip-address: true ## 访问路径可以显示服务主机的IP地址 spring: application: name: eureka-provider #微服务的名称,配置集群的时候必须相同

    • 第二个服务提供者

    server: port: 8002 servlet: context-path: /eureka-provider # 访问的项目名称在配置“集群”的时候也是必须一样的,否则不好调用 eureka: client: serviceUrl: defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/,http://eureka7001.com:7001/eureka/ # eureka的暴露地址,直接注册,使用的是eureka的集群 instance: instance-id: eureka-provider:8002 ## instance-id区别服务 prefer-ip-address: true ## 访问路径可以显示服务主机的IP地址 spring: application: name: eureka-provider #微服务的名称,配置集群的时候必须相同

  • 微服务启动,如下图:
  • 此时访问http://localhost:8003/dept/-consumer/dept/1可以发现此时的负载均衡的策略默认使用的是轮询算法

注意

  • 负载均衡是在同一个功能的微服务中根据不同的策略选择不同的微服务,因此这些微服务对外暴露的实例名称要相同(spring.application.name)
  • ribbon是一个客户端的负载均衡,必须要连接eureka,才能在指定的微服务实例中按照策略选择

负载均衡算法

  • RoundRobinRule:轮询,默认的算法
  • RandomRule : 随机算法
  • AvailabilityFilteringRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问
  • WeightedResponseTimeRule:根据平均响应时间计算所有的权重,响应时间越快服务权重越大被选中的概率越高,刚启动时统计信息不足,则使用轮询策略,等统计信息足够,会自动切换到WeightedResponseTimeRule
  • RetryRule:先按照轮询策略获取服务,如果服务获取失败则在指定时间内会进行重试,获取可用的服务
  • BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
  • ZoneAvoidanceRule:复合判断server所在区域的性能和server的可用性选择服务器

配置负载均衡策略

  • 直接创建一个配置类,注入想要使用的负载均衡算法即可
代码语言:javascript
复制
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Ribbon负载均衡算法的配置类
 * 1、原理:如果用户没有注入自己的算法,那么ribbon默认使用的是轮询算法,如果注入了,那么将会使用注入的
 */ 
@Configuration   //表明这是一个配置类,相当于配置文件xml
public class RibbonRule {
    /**
     * 配置随机算法,改变默认的轮询算法
     * @return
     */
    @Bean
    public IRule rule(){
        return new RandomRule();   //直接返回随机算法
    }
}

自定义负载均衡算法

  • 未完,待续……

超时时间设置

  • 默认超时时间为1000毫秒,如果需要修改超时时间,配置如下:
    • 由于是http请求,因此这里代表的socket的连接时间和读取时间
代码语言:javascript
复制
ribbon: 
  ReadTimeout: 5000     # 请求处理时间。
  ConnectTimeout: 9000   # 请求连接时间。

重试机制

代码语言:javascript
复制
ribbon: 
  OkToRetryOnAllOperations: true  #对所有操作都进行重试。
  MaxAutoRetriesNextServer: 2     # 切换实例的重试次数。 
  MaxAutoRetries: 1               # 对当前实例的重试次数。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-12-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Ribbon - 客户端负载均衡
    • 简介
      • 使用(消费端)
        • 注意
      • 负载均衡算法
        • 配置负载均衡策略
          • 自定义负载均衡算法
            • 超时时间设置
              • 重试机制
              相关产品与服务
              负载均衡
              负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档