SpringCloud——Ribbon详解+例子

目录

 

1、Ribbon

(1)概念

(2)作用

(3)架构图

2、Ribbon案例说明

3、搭建Eureka服务端

(1)创建maven工程

 (2)导入依赖

(3)配置application.yml

(4)创建主启动类

(5)启动Eureka注册中心

 3、搭建服务提供者Provider8003

(1)创建maven工程

(2)导入依赖

 (3)配置application.yml

(4)创建启动类

(5)创建controller

 4、搭建服务提供者Provider8005(复制8003端口)

(1)点击下方service

(2)复制端口

 (3)测试服务Provider8005

5、搭建服务消费者(Ribbon) 

(1)创建maven工程

 (2)导入依赖

(3)配置application.yml

(4)创建主启动类

(5)创建配置类配置远程调用

(6)创建controller

6、测试

7、Ribbon自定义负载均衡策略

(1)Ribbon负载均衡策略

(2)添加配置类指定负载均衡策略

(3)修改启动类的Ribbon注解


 

1、Ribbon

(1)概念

Ribbon是实现一套客户端负载均衡的工具,主要功能是提供客户端的软件负载均衡算法和服务调用。

(2)作用

Ribbon是本地负载均衡,在调用微服务接口时,会在服务注册中心获取调用的服务信息,并缓存到本地JVM中,从而在本地实现远程调用。 

 

Ribbon=负载均衡+RestTemplate远程调用

(3)架构图

Ribbon负载均衡默认轮询,即每个服务依次处理请求。

如:有1,2,3,4个请求,服务1处理请求1,3,服务2处理请求2,4

9f93e07216b34a2d94487f32293a0f14.png

 

2、Ribbon案例说明

一个Eureka注册中心,服务消费者consumer8004,服务提供者provider8003,provider8005,服务消费者通过Ribbon轮询调用服务提供者,如下图:

 

3a92f02aae624a63af0d4d2386ee2cce.png 

3、搭建Eureka服务端

(1)创建maven工程

ef9d8d6fd35e463fa53276c1eaff3587.png

 (2)导入依赖

导入Eureka服务端、web模块依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

(3)配置application.yml

①服务端口为7001;

②Eureka服务端主机名;

③Eureka客户端:

register-with-eureka:是否在服务中心注册

fetchRegistry:是否可以在注册中心被发现

service-url:服务中心url地址

server:
  port: 7001

eureka:
  instance:
    hostname: localhost

  client:
    register-with-eureka: false
    fetchRegistry: false
    service-url:
      defaultZone: http://localhost:7001/eureka

(4)创建主启动类

@EnableEurekaServer:Eureka服务端注解

@SpringBootApplication
@EnableEurekaServer
public class Eureka7001 {
    public static void main(String[] args) {
        SpringApplication.run(Eureka7001.class,args);
    }
}

(5)启动Eureka注册中心

访问http://localhost:7001

78ca559626be4fbfbcb6b62d630f5d70.png

 3、搭建服务提供者Provider8003

(1)创建maven工程

d8067fbe756845d5ad8f7c3caf2750bc.png

(2)导入依赖

导入Eureka客户端、web模块、监控依赖

 <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
 </dependencies>

 (3)配置application.yml

①配置服务端口号为8003;

②配置服务应用名称;

服务消费者指定名称时为该服务应用名称

③配置Eureka注册中心,开启注册,指明注册中心地址。

server:
  port: 8003

spring:
  application:
    name: Provider83and85

eureka:
  client:
    register-with-eureka: true
    fetchRegistry: true
    service-url:
      defaultZone: http://localhost:7001/eureka

(4)创建启动类

@EnableEurekaClient:指明该服务为Eureka客户端

@SpringBootApplication
@EnableEurekaClient
public class Provider8003 {
    public static void main(String[] args) {
        SpringApplication.run(Provider8003.class,args);
    }
}

(5)创建controller

@Value注解是将值与application.yml配置文件对应值绑定

此处绑定端口号,controller返回端口号。

@RestController
public class HelloController {
    @Value("${server.port}")
    private String port;

    @GetMapping("/hello")
    public String hello(){
        return port;
    }
}

 4、搭建服务提供者Provider8005(复制8003端口)

由于Provider8003服务和Provider8005服务内容一样,我们可以直接通过复制端口启动8005服务,这就是上方controller为什么返回端口号原因,具体步骤如下:

(1)点击下方service

25da26d8b2cf4130bddcc1d6cee3e5d2.png

若下方没有service,可以到View打开,如下图:

071d523b980a461f89e3385fc5afb084.png

ac4d4eae979d4bf58fe5ae1f99e9a4df.png cdeee1cce85b43df9cbf3ba5c143363c.png

(2)复制端口

-Dserver.port指明复制后的端口号

 cda2414b58694627bf8e2d9f21a8db17.png

 66b50cd5a1f14424bfb5336679c06d49.png

 (3)测试服务Provider8005

访问http://localhost:8005/hello 

acabd135dac143cc912b749a7089c6e7.png

5、搭建服务消费者(Ribbon) 

(1)创建maven工程

691a3fd5c6384ac688def72527b436fc.png

 (2)导入依赖

导入Eureka客户端、web、监控依赖

注意:Eureka依赖包含Ribbon依赖,所以不用单独引用Ribbon依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
 </dependencies>

(3)配置application.yml

①配置服务·端口号为8004;

②配置服务名称为:Consumer8004;

③配置Eureka客户端,开启注册。配置注册中心地址。

server:
  port: 8004

spring:
  application:
    name: Consumer8004

eureka:
  client:
    register-with-eureka: true
    fetchRegistry: true
    service-url:
      defaultZone: http://localhost:7001/eureka

(4)创建主启动类

开启Eureka客户端,Ribbon客户端

指定Ribbon调用服务名称name

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "PROVIDER83AND85")
public class Consumer8004 {

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

(5)创建配置类配置远程调用

@LoadBalanced:负载均衡注解

@Configuration
public class ResConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

(6)创建controller

①PROVIDER8003:服务提供者的名称,其在注册中心上注册,可以通过该名称找到对应ip地址;

②restTemplate.getForObject(”远程调用服务ip地址“,“调用服务方法返回类型”)

@RestController
public class HelloController {
    //调用服务地址
    public static final String url="http://PROVIDER83AND85";

    @Autowired
    RestTemplate restTemplate;

    @GetMapping("consumer")
    public String hello(){
        return restTemplate.getForObject(url+"/hello",String.class);
    }
}

6、测试

访问:http://localhost:8004/consumer,Ribbon使用轮询方式调用

62ecc58643de4a73b838bb879b14f83d.png

6dc6fd22dc0941f291d9e2363fd3c13c.png 

 

7、Ribbon自定义负载均衡策略

(1)Ribbon负载均衡策略

Ribbon负载均衡策略:

  1. RoundRobinRule 轮询,默认策略。
  2. RandomRule  随机
  3. RetryRule 先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试,获取可用的服务
  4. WeightedResponseTimeRule  对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择
  5. BestAvailableRule 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
  6. AvailabilityFilteringRule 先过滤掉故障实例,再选择并发较小的实例
  7. ZoneAvoidanceRule 默认规则,复合判断server所在区域的性能和server的可用性选择服务器

(2)添加配置类指定负载均衡策略

此处为随机策略 

@Configuration
public class MySelfRule {

    @Bean
    public IRule myRule(){
        return new RandomRule();//定义为随机
    }
}

(3)修改启动类的Ribbon注解

bbfb9fdf4bea420694832181e5ddca6d.png

 

 

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

swttws.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值