一 Ribbon简介
Ribbon是Netflix发布的负载均衡器,它是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。
Spring Cloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。因为微服务间的调用,
API网关的请求转发等内容,实际上都是通过Ribbon来实现的,包括后续我们将要介绍的Feign,它也是基于Ribbon实现的工具。所以,对Spring Cloud Ribbon的理解和使用,对于我们使用Spring Cloud来构建微服务非常重要。
在Spring Cloub 项目中 使用 feign 的更多,默认集成了ribbon,写起来更加思路清晰和方便, 下一篇 讲feign。
二 新建order_service项目
1 为RestTemplate添加注解@LoadBalanced
package unicom.com.cn.order_service; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @SpringBootApplication @EnableFeignClients public class OrderServiceApplication { public static void main(String[] args) { SpringApplication.run(OrderServiceApplication.class, args); } @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } } 2.application.yml 的配置(注册中心一定要启动 Eureka)
server: port: 8781 eureka: client: serviceUrl: #在此指定服务注册中心地址 defaultZone: http://localhost:8761/eureka/ #在此指定服务的名字 spring: application: name: order-service 3.对应业务中的调用
@Service public class ProductOrderServiceImpl implements ProductOrderService { // 方式一 @Autowired private RestTemplate restTemplate; @Override public ProductOrder save(int userId, int productId) { MapproductMap = restTemplate.getForObject("http://product-service/api/v1/product/find?id="+productId, Map.class); ProductOrder productOrder = new ProductOrder(); productOrder.setCreateTime(new Date()); productOrder.setUserId(userId); productOrder.setTradeNo(UUID.randomUUID().toString()); productOrder.setProductName(productMap.get("name").toString()); productOrder.setPrice(Integer.parseInt(productMap.get("price").toString())); return productOrder; } }
三 测试
1 启动eureka-server微服务
2 启动product_service微服务(和上面一样在配置文件中修改下端口就行8771)
3 启动product_service微服务(和上面一样在配置文件中修改下端口就行8772)
4启动order_service微服务(8781)
测试结果
注册成功。
调用 order_service 中的方法是否成功
测试结果(多测试几次可以得出ribbon默认采用轮询的方式进行负载均衡)
四 修改ribbon默认采用轮询的方式(随机)
自定义负载均衡策略:http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html#_customizing_the_ribbon_client_by_setting_properties
在调用方的yml 文件中加上:
#自定义负载均衡策略(随机)
product-service: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule5,策略选择:
1、如果每个机器配置一样,则建议不修改策略 (推荐) 2、如果部分机器配置强,则可以改为 WeightedResponseTimeRule