怎么理解Spring Cloud的负载均衡策略+重试机制+Hystrix 熔断器

发布时间:2021-11-17 13:55:54 作者:iii
来源:亿速云 阅读:389

本篇内容介绍了“怎么理解Spring Cloud的负载均衡策略+重试机制+Hystrix 熔断器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

负载均衡策略  初体验:

<!--测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

怎么理解Spring Cloud的负载均衡策略+重试机制+Hystrix 熔断器

package com.czxy;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;


@SpringBootTest(classes=Client4Application.class)       //Junit和Spring boot整合,将所有实例加载到spring容器。
@RunWith(SpringRunner.class)        //JUnit和Spring整合,将spring容器中的数据注入当前类
public class TestRibbon {
    @Resource
    private RibbonLoadBalancerClient client;

    @Test
    public void testDemo(){
        // 通过“服务名”获得对应服务实例
        for (int i = 0; i < 10; i++) {
            ServiceInstance instance = client.choose("service4");
            System.out.println(instance.getHost() + ":">
#服务名
spring:
  application:
    name: service4
#注册地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:10086/eureka
  instance:
    prefer-ip-address: true   #显示IP地址

修改策略

给指定的“服务”设置策略

服务名.ribbon.NFLoadBalancerRuleClassName=策略实现类
service4:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule    #随机
    #NFLoadBalancerRuleClassName : com.netflix.loadbalancer.BestAvailableRule           #并发最少
    #NFLoadBalancerRuleClassName : com.netflix.loadbalancer.WeightedResponseTimeRule    #请求时间权重

重试机制

<!--重试机制-->
        <dependency>
            <groupId>org.springframework.retry</groupId>
            <artifactId>spring-retry</artifactId>
        </dependency>
spring:
  cloud:
    loadbalancer:
      retry:
        enabled: true   #开启重试机制
service4:
  ribbon:
    ConnectTimeout: 250               # Ribbon的连接超时时间
    ReadTimeout: 1000                 # Ribbon的数据读取超时时间
    OkToRetryOnAllOperations: true    # 是否对所有操作都进行重试
    MaxAutoRetriesNextServer: 1       # 切换实例的重试次数
    MaxAutoRetries: 1                 # 对当前实例的重试次数

Hystix熔断器

Hystrix是Netflix开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败。

怎么理解Spring Cloud的负载均衡策略+重试机制+Hystrix 熔断器

Hystrix 入门

<!--熔断器-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

怎么理解Spring Cloud的负载均衡策略+重试机制+Hystrix 熔断器

package com.czxy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;


@SpringBootApplication
@EnableEurekaClient
@EnableHystrix      //开启熔断器
public class Client4Application {
    public static void main(String[] args) {
        SpringApplication.run(Client4Application.class,args);
    }
}

怎么理解Spring Cloud的负载均衡策略+重试机制+Hystrix 熔断器

package com.czxy.dao;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

@Component
public class DataDao {
    @Resource
    private RestTemplate restTemplate;
    @HystrixCommand(fallbackMethod = "dataFallback")
    public ResponseEntity<String> data(){
        String url = "http://service4/test";
        return restTemplate.getForEntity(url,String.class);
    }

    /**
     * 熔断器超时处理方法
     * @return
     */
    public ResponseEntity<String> dataFallback(){
        return ResponseEntity.ok("临时数据");
    }
}
package com.czxy.controller;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.Random;


@RestController
@RequestMapping("/test")
public class TestController {
    @GetMapping
    public ResponseEntity<String> test(HttpServletRequest request) throws Exception {
        //模拟延迟
        Thread.sleep(new Random().nextInt(2000));
        return ResponseEntity.ok("测试数据" + request.getServerPort());
    }
}

怎么理解Spring Cloud的负载均衡策略+重试机制+Hystrix 熔断器

package com.czxy.dao;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;


@Component
public class DataDao {
    @Resource
    private RestTemplate restTemplate;
    @HystrixCommand(fallbackMethod = "dataFallback")
    public ResponseEntity<String> data(){
        //1 记录开始时间
        long start = System.currentTimeMillis();
        //2 调用
        String url = "http://service4/test";
        ResponseEntity<String> entity = restTemplate.getForEntity(url, String.class);
        //3 记录结束时间
        long end = System.currentTimeMillis();
        //4 统计耗时
        System.out.println("耗时时间:" + (end - start));
        return entity;
    }

    /**
     * 熔断器超时处理方法
     * @return
     */
    public ResponseEntity<String> dataFallback(){
        return ResponseEntity.ok("临时数据");
    }
}

(面试题)如果项目中同时使用熔断器和Ribbon重试机制,谁先执行?

“怎么理解Spring Cloud的负载均衡策略+重试机制+Hystrix 熔断器”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

推荐阅读:
  1. spring cloud(七):Hystrix的应用
  2. spring cloud(一):微服务架构开篇

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

spring cloud

上一篇:如何深入理解Java多线程与并发框中的队列同步器AQS

下一篇:jquery如何获取tr里面有几个td

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》