如何实现负载均衡?

  1. 使用nginx服务器(服务器端负载均衡)
  2. Ribbon

请注意 Request 的位置,在 Nginx 中请求是先进入负载均衡器,而在 Ribbon 中是先在客户端进行负载均衡才进行请求的。

RestTemplate

RestTemplateSpring提供的一个访问Http服务的客户端类 ,就是微服务之间的调用是使用的 RestTemplate

一、ribbon

Ribbon是什么

**
Ribbon 是一款云中间层服务的开源项目 , 由国外的Netflix 发布和维护, 主要的目的是提供客户端负载均衡算法 ,Ribbon 组件提供了一系列完善的配置项,用户可根据需要自行选择。 即 Ribbon 是一个客户端负载均衡器, 可以很好地控制HTTP 和 TCP 的一 些 行 为 。 用 户 可 通 过 开 启 @LoadBalanced注解,Ribbon 会自动根据某种规则(如简单轮询和随机连接)去访问服务提供者, 此外用户还可以使用 Ribbon 实现自定义的负载均衡算法。
中文网:https://springcloud.cc/spring-cloud-dalston.html#spring-cloud-ribbon
消费者Ribbon从eureka server上拉取可用列表,也需要注册到eureka server上
Ribbon/Feign-客户端负载均衡 - 图1
提供多种策略:

  • 轮询
  • 随机
  • 根据响应时间加权

负载均衡的使用

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
  4. </dependency>

1.默认轮询

通过Spring Cloud Ribbon的封装,我们在微服务架构中使用客户端负载均衡调用非常简单,只需要如下两步:
▪️ 服务提供者只需要启动多个服务实例并注册到一个注册中心或是多个相关联的服务注册中心。
▪️ 服务消费者直接通过调用被@LoadBalanced注解修饰过的RestTemplate来实现面向服务的接口调用。
这样,我们就可以将服务提供者的高可用以及服务消费者的负载均衡调用一起实现了。
https://www.jianshu.com/p/1bd66db5dc46

2.核心组件IRule修改负载均衡策略

Ribbon/Feign-客户端负载均衡 - 图2

3.自定义配置(特殊定制)
  1. /**
  2. * @author zhaojianyu
  3. */
  4. @Configuration
  5. @ExcludeFromComponentScan
  6. public class RibbonConfiguration {//自定义配置文件可以复制源码进行修改
  7. @Autowired
  8. IClientConfig config;
  9. @Bean
  10. public IRule ribbonRule(IClientConfig config){
  11. //随机策略
  12. return new RandomRule();
  13. //默认轮询RoundRobinRule();
  14. //还有其他5种
  15. }
  16. }

消费者启动类

  1. @SpringBootApplication
  2. @EnableEurekaClient
  3. @RibbonClients
  4. /**
  5. * ribbon指定自定义的负载均衡策略
  6. * eureka-client-user是被调用者
  7. */
  8. @RibbonClient(name="eureka-client-user",configuration = RibbonConfiguration.class)
  9. @ComponentScan(excludeFilters={@ComponentScan.Filter(type= FilterType.ANNOTATION,value= ExcludeFromComponentScan.class)})
  10. public class EurekaClientMovieApplication {
  11. public static void main(String[] args) {
  12. SpringApplication.run(EurekaClientMovieApplication.class, args);
  13. }
  14. }

https://blog.csdn.net/qwlzxx/article/details/77118634


二、Feign(RPC 远程调用框架)

Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。
这使得Web服务客户端的写入更加方便 要使用Feign创建一个界面并对其进行注释
默认继承了ribbon轮询

官方文档 及使用教程

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-openfeign</artifactId>
  4. </dependency>

启动类

  1. @SpringBootApplication
  2. @EnableEurekaClient
  3. @EnableFeignClients
  4. public class EurekaClientMovieFeignApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(EurekaClientMovieFeignApplication.class, args);
  7. }
  8. }

消费者feign接口-面向生产者接口编程

  1. @FeignClient("eureka-client-user")
  2. public interface FeignClientOne {
  3. /**
  4. * 指定服务提供者 ,以及调用服务提供者的方法
  5. * C版本的spring是不能用getMapping的
  6. */
  7. @GetMapping("/user")
  8. String getUser();
  9. }

controller 注入后,直接调用feign就能访问生产者接口

  1. @RestController
  2. public class HelloController {
  3. @Autowired
  4. private FeignClientOne feignClientOne;
  5. @RequestMapping("/movie")
  6. public String hello() {
  7. return "feign:"+feignClientOne.getUser();
  8. }
  9. }

自定义配置

  1. 自定义配置方法
    Ribbon/Feign-客户端负载均衡 - 图3
  2. 指定配置类
    Ribbon/Feign-客户端负载均衡 - 图4

使用url访问

properties.url在配置文件中

  1. @FeignClient(value = "LoginUserApi", url = "${properties.url}")
  2. public interface LoginUserApi {
  3. /**
  4. * 登录
  5. *
  6. * @param username 用户名称
  7. * @param password 登录密码
  8. * @return
  9. */
  10. @GetMapping("/LoginUserApi/login")
  11. LoginUser login(@RequestParam("username") String username,
  12. @RequestParam("password") String password);
  13. /**
  14. * 新增用户
  15. *
  16. * @param loginUser 用户信息
  17. * @return
  18. */
  19. @PostMapping("/LoginUserApi/save")
  20. Integer save(@RequestBody LoginUser loginUser);
  21. }

配置feign输出日志

  1. yml配置
    Ribbon/Feign-客户端负载均衡 - 图5
  2. 配置类
    Ribbon/Feign-客户端负载均衡 - 图6

配置超时时间和重试机制

默认超时时间为1s
https://blog.csdn.net/east123321/article/details/82385816

负载均衡策略

策略名 策略描述
BestAvailableRule 选择一个最小的并发请求的server
AvailabilityFilteringRule 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值)
WeightedResponseTimeRule 根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低。
RetryRule 对选定的负载均衡策略机上重试机制。
RoundRobinRule roundRobin方式轮询选择server
RandomRule 随机选择一个server
ZoneAvoidanceRule 复合判断server所在区域的性能和server的可用性选择server