zoukankan      html  css  js  c++  java
  • SpringCloud-使用熔断器防止服务雪崩-Ribbon和Feign方式(附代码下载)

    场景

    SpringCloud-服务注册与实现-Eureka创建服务注册中心(附源码下载):

    https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102535957

    SpringCloud-服务注册与实现-Eureka创建服务提供者(附源码下载):

    https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102558004

    SpringCloud-创建服务消费者-Ribbon方式(附代码下载):

    https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102558080

    SpringCloud-创建服务消费者-Feign方式(附代码下载)::

    https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102595895

    在上面已经实现服务注册中心、服务提供者和以Ribbon方式和Fign方式实现服务消费者的前提下,使用熔断器防止服务雪崩。

    在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以通过 RPC 相互调用,在 Spring Cloud 中可以用 RestTemplate + Ribbon 和 Feign 来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证 100% 可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet 容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的 “雪崩” 效应。

    熔断器打开后,为了避免连锁故障,通过 fallback 方法可以直接返回一个固定值。

    注:

    博客:
    https://blog.csdn.net/badao_liumang_qizhi
    关注公众号
    霸道的程序猿
    获取编程相关电子书、教程推送与免费下载。

    实现

    Ribbon中使用熔断器

    SpringCloud-创建服务消费者-Ribbon方式(附代码下载):

    https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102558080

    在上面使用Ribbon实现创建服务消费者。

    我们在pom.xml中加入hystrix的依赖:

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

    完整pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <parent>
            <groupId>com.badao</groupId>
            <artifactId>hello-spring-cloud-dependencies</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <relativePath>../hello-spring-cloud-dependencies/pom.xml</relativePath>
        </parent>
    
        <artifactId>hello-spring-cloud-web-admin-ribbon</artifactId>
        <packaging>jar</packaging>
    
        <name>hello-spring-cloud-web-admin-ribbon</name>
        <url>https://blog.csdn.net/badao_liumang_qizhi</url>
        <inceptionYear>2019-Now</inceptionYear>
    
        <dependencies>
            <!-- Spring Boot Begin -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <!-- Spring Boot End -->
    
            <!-- Spring Cloud Begin -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            </dependency>
            <!-- Spring Cloud End -->
    
            <!-- 解决 thymeleaf 模板引擎一定要执行严格的 html5 格式校验问题 -->
            <dependency>
                <groupId>net.sourceforge.nekohtml</groupId>
                <artifactId>nekohtml</artifactId>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <mainClass>com.funtl.hello.spring.cloud.web.admin.ribbon.WebAdminRibbonApplication</mainClass>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>

    然后在应用启动类Application中增加@EnableHystrix注解

    package com.badao.hello.spring.cloud.web.admin.ribbon;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableHystrix
    public class WebAdminRibbonApplication {
        public static void main(String[] args) {
            SpringApplication.run(WebAdminRibbonApplication.class, args);
        }
    }

    然后在Service中添加@HystrixCommand注解

    在 Ribbon 调用方法上增加 @HystrixCommand 注解并指定 fallbackMethod 熔断方法。

    package com.badao.hello.spring.cloud.web.admin.ribbon.service;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.web.client.RestTemplate;
    
    @Service
    public class AdminService {
    
        @Autowired
        private RestTemplate restTemplate;
    
        @HystrixCommand(fallbackMethod = "hiError")
        public String sayHi(String message) {
            return restTemplate.getForObject("http://hello-spring-cloud-service-admin/hi?message=" + message, String.class);
        }
    
        public String hiError(String message) {
            return "Hi,your message is :"" + message + "" but request error.";
        }
    }

    测试熔断器

    为了测试熔断器效果,我们将服务提供者关闭,此时再次请求:

     http://localhost:8764/hi?message=HelloRibbon

    Feign中使用熔断器

    Feign自带熔断器,所以不用添加依赖,只需要在配置文件中配置打开。

    feign:
      hystrix:
        enabled: true

    完整配置文件:

    spring:
      application:
        name: hello-spring-cloud-web-admin-feign
      thymeleaf:
        cache: false
        mode: LEGACYHTML5
        encoding: UTF-8
        servlet:
          content-type: text/html
    
    server:
      port: 8765
    
    eureka:
      client:
        serviceUrl:
          defaultZone: http://localhost:8761/eureka/
    
    feign:
      hystrix:
        enabled: true

    然后再Service中增加fallback指定类

    package com.badao.hello.spring.cloud.web.feign.service;
    
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    
    @FeignClient(value = "hello-spring-cloud-service-admin", fallback = AdminServiceHystrix.class)
    public interface AdminService {
    
        @RequestMapping(value = "hi", method = RequestMethod.GET)
        public String sayHi(@RequestParam(value = "message") String message);
    }

    此时再service包下创建熔断器并实现对应的Feign接口

    package com.badao.hello.spring.cloud.web.feign.service;
    
    import org.springframework.stereotype.Component;
    
    @Component
    public class AdminServiceHystrix implements AdminService {
    
        @Override
        public String sayHi(String message) {
            return "Hi,your message is :"" + message + "" but request error.";
        }
    }

    然后将服务提供者关闭,再次请求:

    http://localhost:8765/hi?message=HelloFeign

    代码下载

    https://download.csdn.net/download/badao_liumang_qizhi/11871136


     


      

  • 相关阅读:
    接口测试基础一--HTTP请求
    python笔记8-python的异常处理
    web自动化测试中的八大定位方法,推荐使用xpath
    charles抓取https包
    Python 中WebElement 类中的部分操作
    selenium 启动浏览器后基本操作:后退、前进、刷新、关闭窗口、关闭会话
    fiddler抓包可以抓到电脑数据抓不到手机上的数据------防火墙问题
    Charles的安装与破解
    python+ selenium + webdriver的环境准备
    python——print函数
  • 原文地址:https://www.cnblogs.com/badaoliumangqizhi/p/11695824.html
Copyright © 2011-2022 走看看