【SpringCloud】【Hoxton】Ribbon

01 基础环境准备
02 一文读懂Eureka
03 Zookeeper注册中心
04 Consule注册中心
05 Ribbon
06 OpenFegin
07 Hystrix全面解析
08 Gateway全面解析
09 Config配置中心
10 Bus消息总线

1 Ribbon介绍

Spring Cloud Ribbon是基于 Netflix Ribbon实现的一套客户端负载均衡的工具。简单的说, Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负載均衡算法和服务调用。 Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出 Load Balancer(简称LB)后面所有的机器, Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用 Ribbon实现自定义的负载均衡算法。

2 LB负载均衡( Load Balance)是什么

简单的说就是将用户的请求平雄的分配到多个服务上,从而达到系统的HA(高可用)。常见的负载均衡有软件 Nginx,LVS,硬件F5等。

3 Ribbon本地负载均衡客户端 VS Nginx服务端负载均衡区别

Nginx是服务器负载均衡,客户端所有请求都会交给 nginx,然后由 nginx实现转发请求。即负载均衡是由服务端实现的。Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后存到JVM本地,从而在本地实现RPC远程服务调用技术。

4 引入包

<!--eureka 客户端-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

在这里插入图片描述

5 演示

5.1 修改eureka-server

(1) 修改application.yml

server:
  port: 7000
eureka:
  instance:
    #服务名称
    hostname: eureka-server-master
  client:
    serviceUrl:
      #eureka注册中心地址
      defaultZone: http://localhost:7000/eureka/  #配置URL
    #不注册自己
    register-with-eureka: false
    #服务发现,false表示自己不从Eureka服务中获取注册信息
    fetch-registry: false

(2) 启动Eureka-server
在这里插入图片描述

5.2 修改provider-payment服务

(1) application.yml

server:
  port: 9000
spring:
  application:
    name: provider-payment-service
  datasource:
    url:  jdbc:mysql://localhost:3306/springcloud?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
eureka:
  client:
    #是否将自己注册到EurekaServer
    register-with-eureka: true
    #是否从EurekaServer获取已有的注册服务
    fetch-registry: true
    #注册地址
    service-url:
      defaultZone: http://localhost:7000/eureka/
  instance:
    instance-id: provider-payment
    prefer-ip-address: true

(2) 新建RibbonServerController

@RestController
@RequestMapping("/ribbon")
public class RibbonServerController {
 
    @Value("${server.port}")
    private String port;
    @GetMapping("/server")
    public String server(){
        return "ribbon server port is "+port;
    }
}

(3) 启动服务
在这里插入图片描述

5.3 修改provider-payment-slave服务

(1) 修改application.yml

server:
  port: 9001
spring:
  application:
    name: provider-payment-service
  datasource:
    url:  jdbc:mysql://localhost:3306/springcloud?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
eureka:
  client:
    #是否将自己注册到EurekaServer
    register-with-eureka: true
    #是否从EurekaServer获取已有的注册服务
    fetch-registry: true
    #注册地址
    service-url:
      defaultZone: http://localhost:7000/eureka/
  instance:
    instance-id: provider-payment-slave
    prefer-ip-address: true

(2) 新建RibbonServerController

@RestController
@RequestMapping("/ribbon")
public class RibbonServerController {
    @Value("${server.port}")
    private String port;
    @GetMapping("/server")
    public String server(){
        return "ribbon server port is "+port;
    }
}

(3) 启动服务
在这里插入图片描述

5.4 修改customer-order服务

(1) application.yml

server:
  port: 8000
spring:
  application:
    name: customer-order-service
eureka:
  client:
    #是否将自己注册到EurekaServer
    register-with-eureka: true
    #是否从EurekaServer获取已有的注册服务
    fetch-registry: true
    #注册地址
    service-url:
      defaultZone: http://localhost:7000/eureka/
  instance:
    instance-id: order-service
    prefer-ip-address: true

(2) RibbonClientController

@RestController
@RequestMapping("/ribbon")
public class RibbonClientController {
    @Autowired
    private RestTemplate restTemplate;
    private static final String RIBBON_SERVER_URL = "http://provider-payment-service/ribbon/server";
    @GetMapping("/client")
    public String client() {
        ResponseEntity<String> response =
                restTemplate.getForEntity(RIBBON_SERVER_URL, String.class);
        return response.getBody();
    }
}

(3) 启动主类
在这里插入图片描述

在这里插入图片描述
(4) 测试
在这里插入图片描述

在这里插入图片描述

6 负载均衡算法

6.1 算法介绍

RoundRobinRule(轮询算法)
RandomRule(随机算法)
AvailabilityFilteringRule():会先过滤由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问
WeightedResponseTimeRule():根据平均响应的时间计算所有服务的权重,响应时间越快服务权重越大被选中的概率越高,刚启动时如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够会切换到WeightedResponseTimeRule
RetryRule():先按照RoundRobinRule的策略获取服务,如果获取失败则在制定时间内进行重试,获取可用的服务。
BestAviableRule():会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
ZoneAvoidanceRule():默认规则,符合判断server所在区域的性能和server的可用性选择服务器

6.2 随机算法,修改配置文件

@Configuration
public class ApplicationConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
    @Bean
    public IRule  rule(){
        return new RandomRule();
    }
}

6.3 测试略

GITHUB

#分支Ribbon-enviroment-release-v1.0
https://github.com/zhurongsheng666/spring-cloud-hoxton
发布了156 篇原创文章 · 获赞 136 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_34125999/article/details/104859515