1. 概述
1.1 Ribbon 是什么
-
SpringCloud Ribbon 是基于 Netflix Ribbon 实现的一套 客户端负载均衡的工具
-
简单的说,Ribbon 是 Netflix 发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将 Nerflix 的中间层服务连接在一起。Ribbon 客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出 Load Balancer(简称 LB)后面所有的机器,Ribbon 会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们也很容易使用 Ribbon 实现自定义的负载均衡算法。
1.2 Ribbon 使用
-
Ribbon 在工作时分成两步
-
第一步先选择 EurekaServer,它优先选择在同一个区域内负载较少的 server
-
第二步再根据用户指定的策略,再从 server 取到的服务注册列表中选择一个地址
-
-
其中 Ribbon 提供了多种策略:比如轮询、随机和根据响应时间加权
2. Ribbon 使用
- 项目已上传至 https://github.com/masteryourself/study-spring-cloud.git
2.1 配置文件
1. pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- eureka 已经集成了 ribbon,这里不需要再单独引入-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2. application.properties
# 此实例注册到eureka服务端的 name
spring.application.name=masteryourself-user
# 端口号
server.port=5001
# 与 eureka server 交互的地址
eureka.client.service-url.defaultZone=http://masteryourself-eureka-7001.com:7001/eureka
# 此实例注册到 eureka 服务端的唯一的实例 ID
eureka.instance.instance-id=masteryourself-user-5001
# 是否显示 IP 地址
eureka.instance.prefer-ip-address=true
# eureka 客户需要多长时间发送心跳给 eureka 服务器,表明它仍然活着,默认为 30 秒
eureka.instance.lease-renewal-interval-in-seconds=10
# eureka 服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为 90 秒
eureka.instance.lease-expiration-duration-in-seconds=30
# 请求连接的超时时间,默认的时间为 1000 ms
ribbon.ConnectTimeout=3000
# 请求处理的超时时间
ribbon.ReadTimeout=3000
2.2 代码
1. UserApplication5001
@SpringBootApplication
@EnableEurekaClient
public class UserApplication5001 {
public static void main(String [] args){
SpringApplication.run(UserApplication5001.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
2. UserController
@RestController
public class UserController {
private static final String ORDER_URL_PREFIX = "http://masteryourself-order";
private static final String WALLET_URL_PREFIX = "http://masteryourself-wallet";
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "buy")
public Map buy() {
Map orderMap = restTemplate.getForObject(ORDER_URL_PREFIX + "/doOrder", Map.class);
Map deductMap = restTemplate.getForObject(WALLET_URL_PREFIX + "/doDeduct", Map.class);
Map<Object, Object> result = new HashMap<>(10);
result.put("order-msg", orderMap);
result.put("deduct-msg", deductMap);
return result;
}
}
2.3 效果展示
- 多次请求 http://192.168.20.1:5001/buy ,可以看到每次的返回值都是不同的服务器返回