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

# 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 为为客户端负载均衡提供更多的控制和操作行为。

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

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

7-side-client

7-side-server

# 客户端负载均衡

每台客户端都负责负载均衡,如果其中一台进行升级更新,其他的客户端也需要进行同步更新,升级成本高。

不过通过 注册中心 由程序进行自动升级,得到解决。

同时由于每个客户端都能够负责各自的服务调度,稳定性较高。

# 服务端负载均衡

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

# Ribbon Getting Starter

项目结构如下

# ribbon-server

  • 提供一个测试 API /ribbon-server/api
@RestController
public class ServerApi {
    @Autowired
    private Environment environment;

    /** Ribbon server API **/
    @RequestMapping("/ribbon-server/api")
    public String hello(){
        return "Ribbon Server Success ,prot is " + environment.getProperty("server.port");
    }
}

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

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

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

  • 测试常量

  • 测试 API 类 RemoteCallApi

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

@RestController
public class RemoteCallApi {
    /** IP + port + url 拼接 Http 请求访问 **/
    @RequestMapping("/ribbon-client/send-http")
    public String httpSend(){
        StringBuffer sb = new StringBuffer();
        sb.append("http://")
                .append(serverHost)
                .append(":")
                .append(serverPort)
                .append(apiUrl);
        // url = http://127.0.0.1:9530/ribbon-server/api
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> entity = restTemplate.getForEntity(sb.toString(), String.class);
        String result = entity.getBody();
        return result;
    }
}

# 借助 RibbonLoadBalance 访问

# application.properteis 追加配置

## 定义服务提供方 主机名,端口号,
ribbonServer.server.host= 127.0.0.1
ribbonServer.server.port= 9530

## 为 Ribbon 提供服务列表信息(RibbonLoadBlancerClient)
ribbonServer.ribbon.listOfServers=\
  http://${ribbonServer.server.host}:${ribbonServer.server.port}

# RemoteCallApi 测试代码

@RestController
public class RemoteCallApi {
  /** 通过 Ribbon 发起: serverName + url 拼接 HTTP 请求访问 **/
    @RequestMapping("/ribbon-client/send-ribbon")
    public String ribbonSend(){
        ServiceInstance instance = loadBalancer.choose("ribbonServer");
        URI url = URI.create(String.format("http://%s:%s", instance.getHost(), instance.getPort()));
        StringBuffer urlSb = new StringBuffer();
        urlSb.append(url)
                .append(apiUrl);
        // url = http://127.0.0.1:9530/ribbon-server/api
        ResponseEntity<String> entity = restTemplate.getForEntity(urlSb.toString(), String.class);
        String result = entity.getBody();
        return result;
    }
}
精彩内容推送,请关注公众号!
最近更新时间: 4/13/2020, 9:09:21 PM