02.Spring Cloud 之 Ribbon

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 ,可以看到每次的返回值都是不同的服务器返回

在这里插入图片描述
在这里插入图片描述

发布了37 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/masteryourself/article/details/103101708