SpringCloud之Ribbon(客户端负载均衡)

Love The Way You Lie 2022-12-02 13:42 244阅读 0赞

SpringCloud之Ribbon(客户端负载均衡)

通过Eureka服务治理框架,我们可以通过服务名来获取具体的服务实例的位置了(IP),一般在使用SpringCloud的时候不需要自己手动创建HttpClient来进行远程调用,我们可以使用Spring封装好的RestTemplate工具类进行远程调用,使用Ribbon进行客户端负载均衡

一.使用RestTemplate发送请求+客户端负载均衡(Ribbon)

  1. 步骤:
  2. 1.在启动类中添加RestTemplatebean
  3. 2.注入RestTemplate,定义静态常量URL
  4. public static final String PRODUCT_URL = "http://PRODUCT-SERVER";
  5. 3.调用方法,类似于发短信的方式,发起http请求
  6. Product product = template.getForObject(PRODUCT_URL + "/products/get/" + productId, Product.class);//远程获取
  7. 4.通过value注解可以查看是哪个端口被调用了
  8. @Value("${server.port}")
  9. private String port;
1.代码
  1. @Service
  2. @Slf4j
  3. public class OrderServiceImpl implements IOrderService {
  4. @Autowired
  5. private RestTemplate template;
  6. //传统方式存在问题:写死ip端口,后续如果做了集群,那么这种方式就无法使用集群中其他的服务了
  7. //比如8081 8082等端口
  8. //public static final String PRODUCT_URL = "http://localhost:8080";
  9. //Eureka中服务名
  10. public static final String PRODUCT_URL = "http://PRODUCT-SERVER";
  11. @Override
  12. public Product save(Long userId, Long productId) {
  13. log.info("OrderServiceImpl.save....");
  14. //远程获取
  15. Product product = template.getForObject(PRODUCT_URL + "/products/get/" + productId, Product.class);
  16. return product;
  17. }
  18. }
  19. //使用restTemplate访问restful接口非常的简单粗暴无脑。
  20. //(url, requestMap, ResponseBean.class)这三个参数分别代表 REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。
  21. //因为进行负载均衡调用,此时需要用的是Eureka中product-server服务名
  22. //而Eureka中可以通过服务名获取到product-server所有服务集群的ip与端口
  23. ---------------------------------------------------------------------------------------
  24. 启动类
  25. @SpringBootApplication
  26. @EnableEurekaClient
  27. public class OrderMain8090 {
  28. @Bean
  29. @LoadBalanced //负载均衡
  30. public RestTemplate template(){
  31. return new RestTemplate();
  32. }
  33. public static void main(String[] args) {
  34. SpringApplication.run(OrderMain8090.class, args);
  35. }
  36. }
2.yml文件
  1. server:
  2. port: 8090
  3. spring:
  4. application:
  5. name: order-server
  6. eureka:
  7. client:
  8. #是否将自己注册进去eureka,false为不注册,true注册
  9. registerWithEureka: true
  10. #是否从eureka抓取注册信息,单点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
  11. fetchRegistry: true
  12. serviceUrl:
  13. defaultZone: http://localhost:8761/eureka/
  14. #设置轮询策略
  15. PRODUCT-SERVER: #必须是provide的服务名
  16. ribbon:
  17. NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
  18. #注意:服务的名称需要和代码中的服务名称一致,不然是修改不了负载均衡策略.
3.pom.xml
  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  4. </dependency>
  5. <!--可加可不加, eureka-client客户端默认引入ribbon依赖-->
  6. <dependency>
  7. <groupId>org.springframework.cloud</groupId>
  8. <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
  9. </dependency>

二.什么时候需要使用Ribbon?

例如在进行秒杀项目时,为了实现服务的高可用,我们可以将服务提供者集群,当使用集群后,我们就需要将用户请求进行合理的分配,就是说将请求分给对应请求压力小的服务器,这就叫做负载均衡,SpringCloud中实现这一功能的就是Ribbon

在这里插入图片描述

三.负载均衡策略调整

  1. #Ribbon中默认负载均衡的策略为轮询模式
  2. #我们可以通过修改yml文件,修改策略
  3. #设置轮询策略
  4. PRODUCT-SERVER: #必须是provide的服务名
  5. ribbon:
  6. NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
  7. #注意:服务的名称需要和代码中的服务名称一致,不然是修改不了负载均衡策略.
负载均衡策略种类

在这里插入图片描述

四.小结

  1. 1.负载均衡原理:客户端从Eureka Server中得到一份服务清单(ip端口),在发送请求时通过负载均衡算法,
  2. 在多个服务器之间选择一个进行访问
  3. 2.远程调用使用RestTemplate工具类时,需要将该bean交给spring容器管理并贴上 @LoadBalanced 负载均衡注解
  4. 3.一般集群时就需要使用到客户端负载均衡(Ribbon),还有一种服务端负载均衡(Nginx)
  5. 4.可以通过配置yml文件设置负载均衡策略

发表评论

表情:
评论列表 (有 0 条评论,244人围观)

还没有评论,来说两句吧...

相关阅读