Java Spring Cloud 负载均衡详解
目录
- 1. Ribbon 客户端负载均衡
- 1.1 Ribbon 概述
- 1.2 Ribbon 远程调用
- 1.3 Ribbon 负载均衡
- 1.4 Ribbon 负载均衡策略
- 总结
1. Ribbon 客户端负载均衡
1.1 Ribbon 概述
- Ribbon 是 Netflix 提供的一个基于 HTTP 和 TCP 的客户端负载均衡工具。
- Ribbon主要有两个功能:
- 简化远程调用
- 负载均衡
客户端负载均衡和服务端负载均衡的区别
服务端负载均衡
- 负载均衡算法在服务端
- 由负载均衡器维护服务地址列表
客户端负载均衡
- 负载均衡算法在客户端
- 客户端维护服务地址列表
1.2 Ribbon 远程调用
Ribbon 可以简化 RestTemplate 的远程调用。
原来的 Provider 中的远程调用如下:
@GetMapping("/goods/{id}") public Goods findGoodsById(@PathVariable("id") int id){ //演示discoveryClient 使用 List<ServiceInstance> instances = discoveryClient.getInstances("eureka-provider"); //判断集合是否有数据 if(instances == null || instances.size() == 0){ //集合没有数据 return null; } ServiceInstance instance = instances.get(0); String host = instance.getHost();//获取ip int port = instance.getPort();//获取端口 System.out.println(host); System.out.println(port); String url = "http://"+host+":"+port+"/goods/findOne/"+id; // 3. 调用方法 Goods goods = restTemplate.getForObject(url, Goods.class); return goods; }
使用 Ribbon 简化 restTemplate 调用:
1.在声明 restTemplate 的 Bean 时候,添加一个注解:@LoadBalanced
@Configuration public class RestTemplateConfig { @LoadBalanced @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }
2.在使用 restTemplate 发起请求时,需要定义 url 时,host:port 可以替换为服务提供方的应用名称
@GetMapping("/goods2/{id}") public Goods findGoodsById2(@PathVariable("id") int id){ String url = "http://EUREKA-PROVIDER/goods/findOne/"+id; // 3. 调用方法 Goods goods = restTemplate.getForObject(url, Goods.class); return goods; }
1.3 Ribbon 负载均衡
1.既然要负载均衡,那么我们就需要启动多个 Provider 服务来构成集群,在启动前先对 Provider 改造一下,让它将端口号设置到商品标题上
package com.zt.provider.controller; /** * Goods Controller 服务提供方 */ @RestController @RequestMapping("/goods") public class GoodsController { @Value("${server.port}") private int port; @Autowired private GoodsService goodsService; @GetMapping("/findOne/{id}") public Goods findOne(@PathVariable("id") int id){ Goods goods = goodsService.findOne(id); goods.setTitle(goods.getTitle() + ":" + port);//将端口号,设置到商品标题上 return goods; } }
2.接下来以多例启动 Provider,选择 edit configurations --> 勾选 allow parallel run
3.然后分别以 8001 和 8002 端口号分别启动 Provider
4.启动 Consumer 进行测试
http://localhost:9000/order/goods2/1
采用轮询的方式,调用两个 8001 和 8002 两个 Provider
{"id":1,"title":"华为手机:8001","price":3999.0,"count":10000}
{"id":1,"title":"华为手机:8002","price":3999.0,"count":10000}
1.4 Ribbon 负载均衡策略
设置负载均衡策略
1.编码方式
在 Consumer 服务编写配置类,采用随即策略
package com.zt.consumer.config; import com.netflix.loadbalancer.IRule; import com.netflix.loadbalancer.RandomRule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MyRule { @Bean public IRule rule() { return new RandomRule(); } }
在启动类上设置给指定服务开启负载均衡策略,比如给 EUREKA-PROVIDER 开启策略 MyRule
package com.zt.consumer; @SpringBootApplication @EnableEurekaClient @EnableDiscoveryClient /* 配置Ribbon的负载均衡策略 name * name:设置 服务提供方的 应用名称 * configuration:设置负载均衡Bean */ @RibbonClient(name="EUREKA-PROVIDER",configuration = MyRule.class) public class ConsumerApp { public static void main(String[] args) { SpringApplication.run(ConsumerApp.class, args); } }
2.配置方式
# 配置的方式设置Ribbon的负载均衡策略 EUREKA-PROVIDER: # 设置的服务提供方的 应用名称 ribbon: NFloadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 策略类
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注自由互联的更多内容!
【出处:美国高防服务器 网络转载请说明出处】