写于: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 为为客户端负载均衡提供更多的控制和操作行为。
提到 客户端负载均衡 ,能想到的必然就是 服务端负载均衡 。
对比客户端和服务端的负载均衡
客户端负载均衡
每台客户端都负责负载均衡,如果其中一台进行升级更新,其他的客户端也需要进行同步更新,升级成本高。 不过通过
注册中心
由程序进行自动升级,得到解决。 同时由于每个客户端都能够负责各自的服务调度,稳定性较高。
服务端负载均衡
服务端的负载,一般都一台或者多台设备进行操作,对比客户端负载均衡来说,维护成本较低,但是设备一旦挂了,服务就瘫痪了,所以稳定性不高。
二、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;
}
}