写于: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
@RestControllerpublic class ServerApi {@Autowiredprivate 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} 进行访问
@RestControllerpublic 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/apiRestTemplate 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.1ribbonServer.server.port= 9530## 为 Ribbon 提供服务列表信息(RibbonLoadBlancerClient)ribbonServer.ribbon.listOfServers=\http://${ribbonServer.server.host}:${ribbonServer.server.port}
RemoteCallApi 测试代码
@RestControllerpublic 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/apiResponseEntity<String> entity = restTemplate.getForEntity(urlSb.toString(), String.class);String result = entity.getBody();return result;}}

