• ribbon--eureka注册中心消费者


    ribbon--eureka注册中心消费者

    解决问题: 负载均衡及远程调用以及重试等

    Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。因为微服务间的调用,API网关的请求转发等内容,实际上都是通过Ribbon来实现的,包括后续我们将要介绍的Feign,它也是基于Ribbon实现的工具。所以,对Spring Cloud Ribbon的理解和使用,对于我们使用Spring Cloud来构建微服务非常重要。

    图解

    不使用ribbon

    使用ribbon

    ribbon 提供了负载均衡和重试功能, 它底层是使用 RestTemplate 进行 Rest api 调用

    RestTemplate

    RestTemplate 是StringBoot提供的一个Rest远程调用工具

    它的常用方法:

    • getForObject("http://....", 转换类型, 提交的参数) get请求
    • postForObject("http://....", 提交的参数, 转换类型) post请求

    为了方便调用, 我们一般会注入IOC容器进行使用

    //创建 RestTemplate 实例,并存入 spring 容器
    @Bean
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
    

    搭建消费者

    1. 依赖

    在创建springboot项目的时候, 我们需要的主要依赖有

    Eureka discovery Client, spring web, Ribbon [Maintenance]

    其中第三个Ribbon [Maintenance]依赖可选, 因为Eureka discovery Client已经包含了此依赖

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

    创建项目后springboot会自动生成dependencyManagement标签

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    

    2.配置文件

    除了配置端口即名称外, 和提供者一样, 都要配置这个:

    spring:
      application:
        name: ribbon
    
    server:
      port: 3001 # 端口
    
    eureka:
      client:
        service-url:
          defaultZone: http://eureka1:2001/eureka,http://eureka2:2002/eureka
    

    3.RestTemplate注入容器

    @Bean
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
    

    4. 编写controller测试

    // GET请求
    @GetMapping("/item-service/{orderId}")
    public JsonResult<List<Item>> getItems(@PathVariable String orderId) {
        log.info("调用后台商品服务, 获取商品列表");
        JsonResult r = restTemplate.getForObject(
            "http://localhost:8001/{1}",
            JsonResult.class,
            orderId);
        return r;
    }
    
    // POST请求
    @PostMapping("/item-service/decreaseNumber")
    public JsonResult decreaseNumber(@RequestBody List<Item> items) {
        log.info("调用后台商品服务, 减少商品库存");
        JsonResult r = restTemplate.postForObject(
            "http://localhost:8001/decreaseNumber",
            items,
            JsonResult.class);
        return r;
    }
    

    5.测试

    我们访问 http://localhost:3001/item-service/12345

    http://localhost:3001//item-service/decreaseNumber

    测试结果略, 因为项目不同, 请求的结果也不同, 自行测试即可

    ribbon负载均衡

    以下在消费者中进行操作

    负载均衡概览

    1. 依赖(可选)

    eureka 依赖中已经包含了 ribbon

    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </dependency>
    

    2. @LoadBalanced注解

    RestTemplate 设置 @LoadBalanced

    @LoadBalanced 负载均衡注解,会对 RestTemplate 实例进行封装,创建动态代理对象,并切入(AOP)负载均衡代码,把请求分发到集群中的服务器

    在RestTemplate的bena配置上加此注解

    @LoadBalanced //负载均衡注解
    @Bean
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
    

    3. 应用

    我们之前进行远程访问的时候的url可能是这样的: http://127.0.0.1:8101/XXX

    我们只需要把IP和端口换成项目的id即可, 例如: http://item-service/XXX

    注意, 这个item-service是项目中的配置文件进行定义的

    spring:
      application:
        name: item-service
    

    然后ribbon会根据项目名称的项目, 进行负载均衡访问

    4. 测试

    测试略, 可自行配置不同的端口请求, 进行测试

    ribbon 重试

    以下在消费者中进行操作

    概览图

    声明: 重试不是必须的, 看业务需求, 重试可能会导致连接服务器时间很长

    1. 添加 spring-retry 依赖

    <dependency>
    	<groupId>org.springframework.retry</groupId>
    	<artifactId>spring-retry</artifactId>
    </dependency>
    

    2. yml配置文件

    添加如下配置

    ribbon:
      MaxAutoRetriesNextServer: 2 # 更换服务次数
      MaxAutoRetries: 1 # 当前服务重试次数
      OkToRetryOnAllOperations: true
    

    关于配置

    • OkToRetryOnAllOperations=true
      默认只对GET请求重试, 当设置为true时, 对POST等所有类型请求都重试
    • MaxAutoRetriesNextServer
      更换实例的次数, 即更换服务器次数
    • MaxAutoRetries
      当前实例重试次数(不包括首次请求),尝试失败会更换下一个实例, 就是说, 当前服务进行了一次请求, 没问成功访问, 然后进行重试访问, 当重试次数达到配置的值, 依然没能访问成功, 则更换下一台服务器

    如上的配置: MaxAutoRetriesNextServer: 2 # 更换服务次数, MaxAutoRetries: 1 # 当前服务重试次数

    3. RestTemplate的bean配置

    修改RestTemplate的配置

    @LoadBalanced
    @Bean
    public RestTemplate getRestTemplate() {
        SimpleClientHttpRequestFactory f = new SimpleClientHttpRequestFactory();
        f.setConnectTimeout(1000);
        f.setReadTimeout(1000);
        return new RestTemplate(f); // 传入参数
    
        //RestTemplate 中默认的 Factory 实例中,两个超时属性默认是 -1,
        //未启用超时,也不会触发重试
        //return new RestTemplate();
    }
    
  • 相关阅读:
    GIT在Linux上的安装和使用简介心得
    Android开发环境使用到工具的认识心得
    Android系统移植与驱动开发心得
    嵌入式Linux的调试技术
    硬件抽象层——HAL
    Linux代码的重用与强行卸载Linux驱动
    控制发光二极管
    详细讲解Linux驱动程序
    搭建测试环境——针对S3C6410开发板
    有了源代码,当然还需要编译喽!!
  • 原文地址:https://www.cnblogs.com/zpKang/p/13564501.html
Copyright © 2020-2023  润新知