zoukankan      html  css  js  c++  java
  • 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();
    }
    
  • 相关阅读:
    不常用的cmd命令
    js获取宽度
    Marshaling Data with Platform Invoke 概览
    Calling a DLL Function 之三 How to: Implement Callback Functions
    Marshaling Data with Platform Invoke 之四 Marshaling Arrays of Types
    Marshaling Data with Platform Invoke 之一 Platform Invoke Data Types
    Marshaling Data with Platform Invoke 之三 Marshaling Classes, Structures, and Unions(用时查阅)
    Calling a DLL Function 之二 Callback Functions
    WCF 引论
    Marshaling Data with Platform Invoke 之二 Marshaling Strings (用时查阅)
  • 原文地址:https://www.cnblogs.com/zpKang/p/13564501.html
Copyright © 2011-2022 走看看