SpringCloud实战七:Spring Cloud Ribbon 实战

前面的两篇博客已经讲解了Feign作为服务间的调用,但是Feign是集成、封装了Ribbonn这个组件而来的,让服务间的调用更方便,因此大多使用Feign,本篇让大家了解Ribbon的概念与调用

Ribbon是Netflix开发的一个负载均衡组件,它在服务体系中起着重要作用,Pivotal将其整合成为Spring Cloud Ribbon,与其他SpringCloud组件结合可以发挥出强大作用,它的负载策略有多种,默认轮询,可配置超时重试

说到负载均衡,Ribbon与Lvs、Nginx不一样,nginx是服务端负载均衡,Ribbon是客户端负载均衡,具体表现为客户端从注册中心拿到服务的所有实例,然后以负载均衡方式去调用服务,默认以轮询的方式去调用服务实例

代码实战

实战思路:1.启用注册中心,2.创建服务提供者,服务提供者至少启动两个节点,3.创建服务消费者,以restTemplate的方式调用服务提供者,查看ribbon组件是否以负载均衡的方式调用服务提供者

1.启动之前博客中的Eureka注册中心
2.创建一个maven项目,再创建服务提供者
  • 服务提供者很简单,只需要引入下面依赖:

    org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-netflix-eureka-client
  • 在主类上启用@EnableDiscoveryClient

  • 在配置文件中配置好注册中心地址

    server.port=9600
    spring.application.name=provider-service
    eureka.instance.prefer-ip-address=true
    #配置eureka-server security的账户信息
    eureka.client.serviceUrl.defaultZone=http://zy:zy123@localhost:10025/eureka/

  • 创建控制器,提供服务,返回端口信息

    @RestController
    public class IndexController {

    @GetMapping("/hello")
    public String hello(String name , HttpServletRequest request){
        //返回端口信息
        return " From Port : " + request.getServerPort() + " , hello " + name;
    }
    

    }

服务提供者打包,定位到jar包目录,使用如下命令,启用两个节点,访问一下看看是否正常
java -jar provider-service-0.0.1-SNAPSHOT.jar --server.port=9600
java -jar provider-service-0.0.1-SNAPSHOT.jar --server.port=9601
在这里插入图片描述
两个服务提供者节点都正常

3.创建ribbon服务消费者
  • 服务消费者比服务提供者多引入一个依赖:spring-cloud-starter-netflix-ribbon

    org.springframework.cloud spring-cloud-starter-netflix-ribbon
  • 在主类上启用@EnableDiscoveryClient,同时添加一个Bean

    /**
     * 添加LoadBalanced,使RestTemplate以负载均衡的方式调用服务
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
    	return new RestTemplate();
    }
    
  • 在配置文件中配置好注册中心地址,端口为9500,实例名为ribbon-service,其它配置都一样

    server.port=9500
    spring.application.name=ribbon-service
    eureka.instance.prefer-ip-address=true
    #配置eureka-server security的账户信息
    eureka.client.serviceUrl.defaultZone=http://zy:zy123@localhost:10025/eureka/

  • 添加一个控制器,注入RestTemplate,访问服务提供者

    @RestController
    public class IndexController {

    @Autowired
    private RestTemplate restTemplate;
    
    @GetMapping("/sayHello")
    public String sayHello(String name){
        String url = "http://provider-service/hello?name=" + name;
        String result = restTemplate.getForObject(url , String.class);
        return result;
    }
    

    }

  • 启动服务消费者,查看注册中心,可以看到服务提供者有2个节点9600、9601,服务消费者一个节点9500
    在这里插入图片描述

  • 访问服务消费者,验证服务调用是否以负载均衡方式
    第一次访问,调用了9600端口的服务提供者
    在这里插入图片描述
    第二次访问,调用了9601端口的服务提供者
    在这里插入图片描述

OK,Ribbon默认使用轮询方式调用服务
下面说说怎么使用其他方式,也就是其他负载均衡策略调用服务和配置超时重试
ribbon有7种策略,随机、轮询、最小并发、响应时间加权等策略,其它自行百度
在项目中使用也很简单,定义一个config类,添加一个bean,指明使用什么策略,代码如下:

/**
 * ribbon负载均衡配置
 */
@Configuration
public class RibbonLBConfig {

    //使用随机策略
    @Bean
    public IRule ribbonRule(){
        return new RandomRule();
    }
}

超时与重试,只需在配置文件中配置

#请求处理的超时时间
ribbon:
  # 同一实例最大重试次数,不包括首次调用
  MaxAutoRetries: 1
  # 重试其他实例的最大重试次数,不包括首次所选的server
  MaxAutoRetriesNextServer: 2
  # 是否所有操作都重试
  OkToRetryOnAllOperations: false
  # 是否所有操作都进行重试
  ReadTimeout: 10000
  ConnectTimeout: 10000

代码已上传至码云,源码,项目使用的版本信息如下:

  • SpringBoot 2.0.6.RELEASE
  • SpringCloud Finchley.SR2(非常新的版本)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值