负载均衡
1客户端负载均衡概述
-
Ribbon概述
ribbon是Netflix提供的一个基于Http和TCP的客户端负载均衡工具 -
客户端负载均衡
- 负载均衡算法在客户端
- 客户端维护服务地址列表
-
服务端负载均衡
- 负载均衡算法在服务端
- 由负载均衡器维护服务地址列表
2简化RestTemplate调用
- 在RestTemplate上添加注解
-
@Configuration public class RestTemplateConfig { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
- 在调用时指定服务名
-
@GetMapping("/goods2/{id}") public Goods findGoodsById2(@PathVariable("id") int id){ //使用Ribbon简化RestTemplate String url = "http://eureka-provider/goods/findOne/"+id; Goods goods = restTemplate.getForObject(url, Goods.class); return goods; }
3负载均衡策略
3.1策略
- Ribbon 负责均衡策略:
• 随机 : RandomRule
• 轮询 : RoundRobinRule
• 最小并发: BestAvailableRule
• 过滤: AvailabilityFilteringRule
• 响应时间: WeightedResponseTimeRule
• 轮询重试: RetryRule
• 性能可用性: ZoneAvoidanceRule
3.2 使用负载均衡
-
使用bean的方式
-
在消费者端配置负载均衡策略Bean
-
package com.test.consumer.config; import com.netflix.loadbalancer.IRule; import com.netflix.loadbalancer.RandomRule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author liqp * @version 1.0 * @date 2020/8/19 */ @Configuration public class MyRule{ @Bean public IRule rule() { return new RandomRule(); } }
-
在引导类添加注解
package com.itheima.consumer;import com.test.consumer.config.MyRule; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.ribbon.RibbonClient; @EnableDiscoveryClient // 激活DiscoveryClient @EnableEurekaClient @SpringBootApplication @RibbonClient(name = "eureka-provider", configuration = MyRule.class) // 配置负载均衡策略 public class ConsumerApp { public static void main(String[] args) { SpringApplication.run(ConsumerApp.class, args); } }
-
-
使用配置方式
-
server: port: 9000 eureka: instance: hostname: localhost # 主机名 client: service-url: defaultZone: http://localhost:8761/eureka ## defaultZone: http://eureka-server1:8761/eureka,http://eureka-server2:8762/eureka # eureka服务端地址,将来客户端使用该地址和eureka进行通信 spring: application: name: eureka-consumer # 设置当前应用的名称。将来会在eureka中Application显示。将来需要使用该名称来获取路径 # 配置的方式设置Ribbon的负载均衡策略 EUREKA-PROVIDER: ribbon: NFloadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule.RandomRule 小结: 1, 不需要单独导入依赖:ribbon也是netflix公司的产品:导入netflix-clint时,引入了ribbon的依赖 2, 在声明restTemplate的方法上添加注解:@LoadBalanced 采用负载均衡的方式来调用服务 3,客户端调用服务时:根据服务名来进行调用 4,支持多种负载均衡的策略:可以通配置或注解的方式来指定使用的策略