SpringCloud 의 퓨즈 Hystrix 구현

머리말
  SpringCloud 는 마이크로 서비스 에서 가장 뛰어난 착지 방안 이다.
  마이크로 서비스 구조 에서 다 층 서비스 간 에 서로 호출 될 수 있다.만약 에 그 중의 한 층 의 서비스 가 고장 나 면 한 층 의 서비스 나 다 층 서 비 스 를 초래 할 수 있다.
  고장 으로 인해 전체 시스템 이 고장 났 다.이런 현상 은 서비스 눈사태 효과 라 고 불 린 다.
  SpringCloud 의 Hystrix 구성 요 소 는 이러한 문 제 를 해결 할 수 있 습 니 다.Hystrix 는 서비스 간 의 호출 상황 을 감시 하고 여러 번 실 패 했 습 니 다.
  상황 을 녹 여 보호 하 다.보호 하 는 방법 은 바로 사용 하 는 것 이다. Fallback,호출 된 서비스 가 고장 났 을 때 사용 할 수 있 습 니 다. Fallback 방법의
  반환 값;하 이 스 트 릭 스 는 간격 을 두 고 고장 난 서 비 스 를 다시 점검 하고,고장 서비스 가 복구 되면 서 비 스 를 계속 이용 하 게 된다.
소스 코드
  GitHub 주소:https://github.com/intomylife/SpringCloud
환경.
  • JDK 1.8.0 +
  • Maven 3.0 +
  • SpringBoot 2.0.3
  • SpringCloud Finchley.RELEASE
  • 개발 도구
  • IntelliJ IDEA
  • 본문
    commons 프로젝트
    commons 프로젝트-POM 파일
    
    <?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>
     
      <!--     -->
      <groupId>com.zwc</groupId>
      <artifactId>springcloud-hystrix-commons</artifactId>
      <version>1.0</version>
     
      <!--         -->
      <name>springcloud-hystrix-commons</name>
      <description>    </description>
     
      <!--      -->
      <packaging>jar</packaging>
     
      <!--   properties          ,   dependency        ${}         jar   -->
      <properties>
        <!--    -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!-- jdk -->
        <java.version>1.8</java.version>
     
        <!-- SpringBoot -->
        <platform-bom.version>Cairo-SR3</platform-bom.version>
     
        <!-- SpringCloud -->
        <spring-cloud-dependencies.version>Finchley.RELEASE</spring-cloud-dependencies.version>
      </properties>
     
      <!--      -->
      <dependencies>
     
      </dependencies>
     
      <!--    jar           -->
      <!--    dependencies    dependency        version   ,   maven          。 -->
      <!--    ,     ;        ,          -->
      <!--    :   dependencies    dependency          ,              -->
      <dependencyManagement>
        <dependencies>
          <!-- SpringBoot -->
          <dependency>
            <groupId>io.spring.platform</groupId>
            <artifactId>platform-bom</artifactId>
            <version>${platform-bom.version}</version>
            <type>pom</type>
            <scope>import</scope>
          </dependency>
          <!-- SpringCloud -->
          <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud-dependencies.version}</version>
            <type>pom</type>
            <scope>import</scope>
          </dependency>
        </dependencies>
      </dependencyManagement>
     
      <!--      -->
      <build>
        <plugins>
          <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
          </plugin>
        </plugins>
      </build>
     
    </project>
    공용 의존 도 설정
    comons 프로젝트-프로젝트 구조

    서비스 공학
      ① 이 프로젝트 는 다음 네 가지 모듈 이 있 습 니 다.하나의 등록 센터 와 서비스 A,B,C 입 니 다.
      ② A 서 비 스 를 제공 하고 서비스 B,B 를 호출 하여 서 비 스 를 제공 하 며 서비스 C 와 C 를 호출 하여 서 비 스 를 제공한다.
    레 지 스 트 리 서비스(등록 센터)
    레 지 스 트 리 서비스-POM 파일
    
    <?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.zwc</groupId>
        <artifactId>springcloud-hystrix-service</artifactId>
        <version>1.0</version>
      </parent>
     
      <!--     -->
      <groupId>com.zwc</groupId>
      <artifactId>springcloud-hystrix-registry-service</artifactId>
      <version>1.0</version>
     
      <!--        -->
      <name>springcloud-hystrix-registry-service</name>
      <description>    </description>
     
      <!--      -->
      <packaging>jar</packaging>
     
      <!--   properties          ,   dependency        ${}         jar   -->
      <properties>
     
      </properties>
     
      <!--      -->
      <dependencies>
        <!-- commons      -->
        <dependency>
          <groupId>com.zwc</groupId>
          <artifactId>springcloud-hystrix-commons</artifactId>
          <version>1.0</version>
        </dependency>
     
        <!--        -->
        <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
      </dependencies>
     
      <!--      -->
      <build>
        <plugins>
          <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
          </plugin>
        </plugins>
      </build>
     
    </project>
    주로 가입 spring-cloud-starter-netflix-eureka-server 레 지 스 트 리 서비스 의존-application.yml 프로필
    
    #   
    server:
     port: 8761
     
    #     
    spring:
     application:
      name: eurka-server
     
    eureka:
     instance:
      #    ip      
      prefer-ip-address: true
      #       
      hostname: ${spring.cloud.client.ip-address}
      #     ID   
      instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
     client:
      #            
      registerWithEureka: false
      #              
      fetchRegistry: false
      serviceUrl:
       #       
       defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    기본 8761 포트 를 사 용 했 습 니 다.물론 변경 할 수도 있 지만 서버 를 호출 하 는 등록 센터 주소 포트 가 일치 해 야 합 니 다.
    registry-service-시작 클래스
    
    package com.zwc;
     
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
     
    @SpringBootApplication
    @EnableEurekaServer
    public class SpringcloudHystrixRegistryServiceApplication {
     
      public static void main(String[] args) {
        SpringApplication.run(SpringcloudHystrixRegistryServiceApplication.class, args);
      }
     
    }
    시작 클래스 에@EnableEureka Server 설명 을 추가 하면 이 프로젝트 는 등록 센터 임 을 표시 합 니 다.
    레 지 스 트 리 서비스-시작 항목
    1.프로젝트 시작 성공 후 접근 http://localhost:8761/ 바로 볼 수 있다 eureka-server 홈 페이지

    서비스 공학 A(공급 자 와 소비자)
    서비스 엔지니어 링 A - POM 파일
    
    <?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.zwc</groupId>
    		<artifactId>springcloud-hystrix-a-service</artifactId>
    		<version>1.0</version>
    	</parent>
     
    	<!--     -->
    	<groupId>com.zwc</groupId>
    	<artifactId>springcloud-hystrix-a-service-core</artifactId>
    	<version>1.0</version>
     
    	<!--        -->
    	<name>springcloud-hystrix-a-service-core</name>
    	<description>     - A   </description>
     
    	<!--      -->
    	<packaging>jar</packaging>
     
    	<!--   properties          ,   dependency        ${}         jar   -->
    	<properties>
     
    	</properties>
     
    	<!--      -->
    	<dependencies>
    		<!-- commons      -->
    		<dependency>
    			<groupId>com.zwc</groupId>
    			<artifactId>springcloud-hystrix-commons</artifactId>
    			<version>1.0</version>
    		</dependency>
     
    		<!-- api      -->
    		<dependency>
    			<groupId>com.zwc</groupId>
    			<artifactId>springcloud-hystrix-a-service-api</artifactId>
    			<version>1.0</version>
    		</dependency>
     
    		<!--        -->
    		<dependency>
    			<groupId>org.springframework.cloud</groupId>
    			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    		</dependency>
    		<!-- feign -->
    		<dependency>
    			<groupId>org.springframework.cloud</groupId>
    			<artifactId>spring-cloud-starter-openfeign</artifactId>
    		</dependency>
    	</dependencies>
     
    	<!--      -->
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-maven-plugin</artifactId>
    			</plugin>
    		</plugins>
    	</build>
     
    </project>
    가입 하 다 spring-cloud-starter-netflix-eureka-client 의지 하 다
    Feign 의 시작 의존 도 를 추가 해 야 합 니 다. spring-cloud-starter-openfeign
    서비스 엔지니어 링 A - application.yml 프로필
    
    #   
    server:
     port: 8090
     
    #     
    spring:
     application:
      name: hystrix-a
     
    eureka:
     instance:
      #    ip      
      prefer-ip-address: true
      #       
      hostname: ${spring.cloud.client.ip-address}
      #     ID   
      instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
     client:
      serviceUrl:
       #       
       defaultZone: http://${eureka.instance.hostname}:8761/eureka/
    등록 센터 주 소 를 설정 하 는 포트 는 8761 입 니 다.즉,위 등록 센터 프로젝트 설정 포트 입 니 다.
    spring.application.name:이름 을 사용 하여 소비자 에 게 호출 될 때 사용 해 야 합 니 다.소비 하 는 동시에 소비 할 수 있 습 니 다.
    여기 서 등록 센터 공 사 를 제외 한 세 가지 공 사 는 모두 이 설정 과 비슷 합 니 다.다른 점 은 포트 와 응용 이름 입 니 다.더 이상 군말 하지 않 습 니 다.
    서비스 엔지니어 링 A -  application.properties(주의)
    
    #      
    feign.hystrix.enabled=true
  • 차단기 가 주동 적 으로 켜 져 야 서비스 호출 이 실 패 했 을 때 만 녹 습 니 다
  • 이 설정 을 application.yml 에 기록 하 는 구덩이 가 있 습 니 다. 중 퓨즈 가 적용 되 지 않 습 니 다
  • A 와 B 공 사 는 모두 이 배치 가 있 는데 이번 건설 중 C 공 사 는 서비스 만 제공 하고 소비 서 비 스 는 없다.그래서 C 공정 은 이 설정 을 사용 하지 않 습 니 다
  • application.properties 와 boottstrap.yml 2 중 하 나 를 선택 하면 됩 니 다
  • 서비스 엔지니어 링 A -  bootstrap.yml(주의)
    
    feign:
     hystrix:
      #      
      enabled: true
  • 차단기 가 주동 적 으로 켜 져 야 서비스 호출 이 실 패 했 을 때 만 녹 습 니 다
  • 이 설정 을 application.yml 에 기록 하 는 구덩이 가 있 습 니 다. 중 퓨즈 가 적용 되 지 않 습 니 다
  • application.properties 와 boottstrap.yml 2 중 하 나 를 선택 하면 됩 니 다
  • 서비스 엔지니어 링 A - controller 전단 컨트롤 러(서비스 제공)
    
    package com.zwc.a.controller;
     
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
     
    /*
     * @ClassName ASayHelloController
     * @Desc TODO  Say Hello
     * @Date 2019/5/20 23:24
     * @Version 1.0
     */
    @RestController
    public class ASayHelloController {
     
      /*
       * @ClassName ASayHelloController
       * @Desc TODO            
       * @Date 2019/5/20 23:24
       * @Version 1.0
       */
      @Value("${server.port}")
      private String port;
     
      /*
       * @ClassName ASayHelloController
       * @Desc TODO  Say Hello
       * @Date 2019/5/20 23:24
       * @Version 1.0
       */
      @RequestMapping("/a")
      public String a(){
        return "Hello!I'm a. port:" + port;
      }
     
    }
    서비스 제공:Hello 와 포트 출력
    서비스 엔지니어 링 A - 서비스 호출
    
    package com.zwc.a.api.feign;
     
    import com.zwc.a.api.impl.FeignApiFallBack;
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.RequestMapping;
     
    /*
     * @ClassName FeignApi
     * @Desc TODO     Feign    b -   
     * @Date 2019/5/20 23:21
     * @Version 1.0
     */
    @FeignClient(value = "hystrix-b" , fallback = FeignApiFallBack.class)
    public interface FeignApi {
     
      /*
       * @ClassName FeignApi
       * @Desc TODO     hystrix-b       b()   
       * @Date 2019/5/20 23:21
       * @Version 1.0
       */
      @RequestMapping("/b")
      String b();
     
    }
  • @FeignClient 주석 에서 value="hystrix-b"를 통 해 어떤 서 비 스 를 호출 할 지 지정 합 니 다
  • Hstrix-b 는 공급 자의 것 이다. spring.application.name:응용 이름
  • @FeignClient 주석 을 통 해 fallback = FeignApiFallBack.class 에서 녹 일 때 사용 할 방법 을 지정 합 니 다
  • FeignApiFallBack 은 바로 이러한(FeignApi)의 실현 류 이 고 이에 대응 하 는 실현 방법 은 바로 이러한 용 단 시 호출 하 는 방법
  • 이다.
  • b():이 방법 은 B 공정 에서 제공 하 는 서비스 로 여기 서 인터페이스
  • 로 정의 합 니 다.
  • 공급 자 와 같은 반환 값,같은 방법 명 과 같은 매개 변 수 를 가 져 야 합 니 다.
  • 서비스 엔지니어 링 A - Fallback(FeignApiFallBack)
    
    package com.zwc.a.api.impl;
     
    import com.zwc.a.api.feign.FeignApi;
    import org.springframework.stereotype.Component;
     
    /*
     * @ClassName FeignApi
     * @Desc TODO  fallback
     * @Date 2019/5/20 23:21
     * @Version 1.0
     */
    @Component
    public class FeignApiFallBack implements FeignApi {
     
      /*
       * @ClassName FeignApiFallBack
       * @Desc TODO     hystrix-b      b()        
       * @Date 2019/5/20 23:31
       * @Version 1.0
       */
      @Override
      public String b() {
        return "Hello!aUseB fail";
      }
    }
    쓰다 @Component 주 해 는 Spring 관리 에 맡 깁 니 다.
    실현 FeignApi 인터페이스,녹 일 때 대응 하 는 방법 제공
    서비스 엔지니어 링 A - controller 전단 컨트롤 러(소비 서비스)
    
    package com.zwc.a.controller;
     
    import com.zwc.a.api.feign.FeignApi;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
     
    /*
     * @ClassName AUseBFeignController
     * @Desc TODO     Feign    b -      
     * @Date 2019/5/20 23:23
     * @Version 1.0
     */
    @RestController
    public class AUseBFeignController {
     
      @Autowired(required = false)
      private FeignApi feignApi;
     
      /*
       * @ClassName FeignController
       * @Desc TODO     hystrix-b       b()   
       * @Date 2019/5/20 23:13
       * @Version 1.0
       */
      @RequestMapping("/aUseB")
      public String aUseB(){
        return feignApi.b();
      }
     
    }
    @Autowired 주석 을 사용 하여 Bean 을 설치 하고 이 Bean 의 방법 으로 서 비 스 를 호출 합 니 다.
    이러한 대외 노출 인 터 페 이 스 는 실제 공급 자의 서비스 이다.
    서비스 엔지니어 링 A - 시작 클래스
    
    package com.zwc;
     
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.openfeign.EnableFeignClients;
     
    @SpringBootApplication
    @EnableEurekaClient
    @EnableFeignClients
    public class SpringcloudHystrixAServiceCoreApplication {
     
      public static void main(String[] args) {
        SpringApplication.run(SpringcloudHystrixAServiceCoreApplication.class, args);
      }
     
    }
  • @EnableEurekaClient 주 해 를 추가 하면 이 프로젝트 는 등록 센터 에 서 비 스 를 제공 할 수 있 음
  • 추가 @EnableFeignClient 주 해 는 Feign 기능 을 켜 서 원 격 호출 을 표시 합 니 다
  • 서비스 엔지니어 링 A - 시작 항목
      1. 프로젝트 시작 성공 후 접근:http://localhost:8090/a (서 비 스 를 호출 하 다
      2.출력 내용:'안녕하세요!I'm a. port:8090'
      3.리 셋 http://localhost:8761/(등록 센터)서비스 가 등록 되 어 있 는 것 을 볼 수 있 습 니 다.
      
      4.방문 주소:http://localhost:8090/aUseB (B 프로젝트 서비스 호출)
      5.출력 내용:'안녕하세요!aUseB fail'(이때 B 프로젝트 가 시작 되 지 않 았 기 때문에 fallback 을 호출 했 습 니 다. 중 방
      6. 서비스 프로젝트 B 를 시작 합 니 다.프로젝트 가 시작 되면 다시 방문 합 니 다.http://localhost:8090/aUseB (B 프로젝트 서비스 호출)
      7.출력 내용:'안녕하세요!I'm b.port:8091'(아직 호출 에 성공 하지 않 았 다 면 조금 있다 가 다시 리 셋 해 보 세 요)
      8.이 때 녹 아내 림 성공 증명
      9.방문 주소:http://localhost:8091/b (서 비 스 를 호출 하 다
     10.출력 내용:'안녕하세요!I'm b. port:8091'
     11.리 셋 http://localhost:8761/(등록 센터)B 공정 서비스 도 등록 되 어 있 더 라 고요.
      
     서비스 공학- 프로젝트 구조

    다 중 프로젝트 를 IntelliJ IDEA 로 사용 합 니 다.  열다
  • GitHub 에서 로 컬 로 항목 다운로드
  • 열기 IntelliJ IDEA 
  • File->Open
  • 로 컬 에 다운로드 한 프로젝트 디 렉 터 리 열기
  • springcloud-hystrix -> springcloud-hystrix-service(이 프로젝트 를 여 는 것 을 선택 하 십시오)
  • service 공 사 를 시작 한 후
  • 파일 을 다시 클릭->프로젝트 구조
  • Modules 를 선택 하고'+'기 호 를 클릭
  • 가 져 오기 클릭  Module
  • 로 컬 에 다운로드 한 프로젝트 디 렉 터 리 를 엽 니까?
  • springcloud-hystrix -> springcloud-hystrix-commons -> pom.xml
  • 클릭 OK
  • Next,Finish
  • Apply,OK 클릭
  • 이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기