写于:2018-12-23 13:20:37

code.zip

一、Client Side Load Balancer

官方文档介绍

Ribbon is a client side load balancer which gives you a lot of control over the behaviour of HTTP and TCP clients.

粗略翻译:

Ribbon 为为客户端负载均衡提供更多的控制和操作行为。

提到 客户端负载均衡 ,能想到的必然就是 服务端负载均衡

对比客户端和服务端的负载均衡

01.png
02.png

客户端负载均衡

每台客户端都负责负载均衡,如果其中一台进行升级更新,其他的客户端也需要进行同步更新,升级成本高。 不过通过 注册中心 由程序进行自动升级,得到解决。 同时由于每个客户端都能够负责各自的服务调度,稳定性较高。

服务端负载均衡

服务端的负载,一般都一台或者多台设备进行操作,对比客户端负载均衡来说,维护成本较低,但是设备一旦挂了,服务就瘫痪了,所以稳定性不高。

二、Ribbon Getting Starter

项目结构如下
03.png

ribbon-server

  • 提供一个测试 API /ribbon-server/api
  1. @RestController
  2. public class ServerApi {
  3. @Autowired
  4. private Environment environment;
  5. /** Ribbon server API **/
  6. @RequestMapping("/ribbon-server/api")
  7. public String hello(){
  8. return "Ribbon Server Success ,prot is " + environment.getProperty("server.port");
  9. }
  10. }

ribbon-client : 测试调用 ribbon-server 中的 API

  • 关键依赖
    spring-cloud-starter-netflix-ribbon

测试 eureka 进行 ribbon 调用时,引入 spring-cloud-starter-netflix-eureka-client 依赖

  • 测试常量

    1. ![04.png](https://cdn.nlark.com/yuque/0/2020/png/2737632/1605256645138-e8b476e3-6a91-4850-a925-8d015d938f3c.png#align=left&display=inline&height=234&margin=%5Bobject%20Object%5D&name=04.png&originHeight=234&originWidth=537&size=64733&status=done&style=none&width=537)
  • 测试 API 类 RemoteCallApi

通过 HTTP 拼接 http:{ip}:{port}/{url} 进行访问

  1. @RestController
  2. public class RemoteCallApi {
  3. /** IP + port + url 拼接 Http 请求访问 **/
  4. @RequestMapping("/ribbon-client/send-http")
  5. public String httpSend(){
  6. StringBuffer sb = new StringBuffer();
  7. sb.append("http://")
  8. .append(serverHost)
  9. .append(":")
  10. .append(serverPort)
  11. .append(apiUrl);
  12. // url = http://127.0.0.1:9530/ribbon-server/api
  13. RestTemplate restTemplate = new RestTemplate();
  14. ResponseEntity<String> entity = restTemplate.getForEntity(sb.toString(), String.class);
  15. String result = entity.getBody();
  16. return result;
  17. }
  18. }

借助 RibbonLoadBalance 访问

application.properteis 追加配置

  1. ## 定义服务提供方 主机名,端口号,
  2. ribbonServer.server.host= 127.0.0.1
  3. ribbonServer.server.port= 9530
  4. ## 为 Ribbon 提供服务列表信息(RibbonLoadBlancerClient)
  5. ribbonServer.ribbon.listOfServers=\
  6. http://${ribbonServer.server.host}:${ribbonServer.server.port}

RemoteCallApi 测试代码

  1. @RestController
  2. public class RemoteCallApi {
  3. /** 通过 Ribbon 发起: serverName + url 拼接 HTTP 请求访问 **/
  4. @RequestMapping("/ribbon-client/send-ribbon")
  5. public String ribbonSend(){
  6. ServiceInstance instance = loadBalancer.choose("ribbonServer");
  7. URI url = URI.create(String.format("http://%s:%s", instance.getHost(), instance.getPort()));
  8. StringBuffer urlSb = new StringBuffer();
  9. urlSb.append(url)
  10. .append(apiUrl);
  11. // url = http://127.0.0.1:9530/ribbon-server/api
  12. ResponseEntity<String> entity = restTemplate.getForEntity(urlSb.toString(), String.class);
  13. String result = entity.getBody();
  14. return result;
  15. }
  16. }