负载均衡器 面试题 负载均衡器原理_服务器

ribbon与传统负载均衡器的区别

负载均衡器 面试题 负载均衡器原理_java_02


传统的服务端负载均衡是通过如nginx他是将接收到请求通过在nginx上配置的信息将请求分配到指定 的服务器上达到负载均衡

负载均衡器 面试题 负载均衡器原理_负载均衡器 面试题_03

客户端负载均衡,需要客户端提前知道服务器的具体信息通过某种算法和规则rule,从而直接定位到需要的服务器。但是客户端必须实时知道服务端集群的实时存活情况和实际数量(包括新增和删除)此时就可以通过ribbon来实现

负载均衡器 面试题 负载均衡器原理_ribbon_04

负载均衡器 面试题 负载均衡器原理_java_05


引入Eureka时已经引入Ribbon

负载均衡器 面试题 负载均衡器原理_java_06

负载均衡器 面试题 负载均衡器原理_负载均衡器 面试题_07


Rule:负载均衡规则
Ping:心跳检测
ServerList:需要再ribbon保存完整服务器IP集合,只有知道了信息集合才能知道如何使用Rule

负载均衡器 面试题 负载均衡器原理_ribbon_08

  • RoundRobinRule .轮询规则
  • AvailabilityFilteringRule 根据服务是否死掉或者服务处于高并发来分配权重
  • WeightedResponseTimeRule 根据响应时间分配权重
  • RandomRule 随机原则
  • ZoneAvoidanceRule
  • BestAvailableRule
  • RetryRule 重试次数



负载均衡器 面试题 负载均衡器原理_java_09


ribbon通过负载均衡的RestTemplate成功访问到client

基于Eureka的配置我们做下修改

Server yml文件

spring:
  application:
    name: service-register-center
  mandatory-file-encoding: UTF-8
  http:
    encoding:
      enabled: true
      charset: UTF-8

logging: #日志文件
  level:
    root: info
  file:
    max-size: 15MB
    path: service-register-center-log
  pattern:
    dateformat: yyyy-MM-dd HH:mm:ss.SSS
server:
  port: 10097
  undertow:
    accesslog:
      enabled: true
      dir: undertow-access-logs
      pattern: common
      prefix: service_register_center_access_log.
      suffix: log

management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    shutdown:
      enabled: true

eureka:
  instance:
    hostname: node1
  ## 表示为Erureka客户端
  client:
    ## 单台server为服务器需要注册到服务器上 (如果存在多台server需注册)
    register-with-eureka: false
    ## 获取注册列表的信息  道理同上 基本两者参数是一样的
    fetch-registry: false
    service-url: # Eureka服务提供地址
      defaultZone: http://node1:10097/eureka/

client yml文件

server:
  port: 9090

spring:
  application:
    name: eureka-client

eureka:
  ## 表示为Erureka客户端
  client:
    ## 单台server为服务器不需要注册到服务器上
    register-with-eureka: true
    ## 获取注册列表的信息  道理同上 基本两者参数是一样的
    fetch-registry: true
    service-url: # Eureka服务提供地址
      defaultZone: http://node1:10097/eureka/
student:
  information:
    address: shanghai
    name: zhangsan

重新建个spring-cloud-ribbon项目 配置同client

spring:
  application:
    name: eureka-ribbon-client
server:
  port: 8888

eureka:
  ## 表示为Erureka客户端
  client:
    ## 单台server为服务器不需要注册到服务器上
    register-with-eureka: true
    ## 获取注册列表的信息  道理同上 基本两者参数是一样的
    fetch-registry: true
    service-url: # Eureka服务提供地址
      defaultZone: http://node1:10097/eureka/

在spring-cloud-ribbon项目中新增
config

@Configuration
public class RibbonConfig {

    @Bean
    @LoadBalanced //增加负载均衡 用于标记要配置为使用LoadBalancerClient的RestTemplate或WebClient bean的注释。
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

service

@Service
public interface RibbonService {

    String info();
}

impl

@Service
public class RibbonServuceImpl implements RibbonService {


    @Autowired
    private RestTemplate restTemplate;


    @Override
    public String info() {
        //我们在微服务调用时不在显式指定其服务ip地址只需要要指定client的服务名称和返回类型即可。
        return this.restTemplate.getForObject("http://eureka-client/info ", String.class);
    }
}

controller

@RestController
public class RibbonController {

    @Autowired
    private RibbonService ribbonService;
    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @GetMapping("/info")
    public String info() {
        return this.ribbonService.info();
    }

    @GetMapping("/serviceInfo")
    public String serviceInfo() {
        //获取eureka-client的客户端
        ServiceInstance serviceInstance = this.loadBalancerClient.choose("eureka-client");
        //获取客户端的端口号
        String portInfo = "port: " + serviceInstance.getPort();
        return portInfo;
    }
}

启动类

@SpringBootApplication
@EnableEurekaClient
public class SpringCloudRibbonApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudRibbonApplication.class, args);
    }

}

依次启动server,client,ribbon 访问http://node1:10097

负载均衡器 面试题 负载均衡器原理_分布式_10


访问http://node1:8888/info

负载均衡器 面试题 负载均衡器原理_服务器_11


此时在启动一个client(端口9091)

负载均衡器 面试题 负载均衡器原理_服务器_12


此时访问http://node1:8888 /serviceInfo

负载均衡器 面试题 负载均衡器原理_负载均衡器 面试题_13


刷新变成

负载均衡器 面试题 负载均衡器原理_服务器_14


此时就实现了客户端的负载均衡