SpringCloud 의 퓨즈 Hystrix 구현
19131 단어 SpringCloud퓨즈Hystrix
SpringCloud 는 마이크로 서비스 에서 가장 뛰어난 착지 방안 이다.
마이크로 서비스 구조 에서 다 층 서비스 간 에 서로 호출 될 수 있다.만약 에 그 중의 한 층 의 서비스 가 고장 나 면 한 층 의 서비스 나 다 층 서 비 스 를 초래 할 수 있다.
고장 으로 인해 전체 시스템 이 고장 났 다.이런 현상 은 서비스 눈사태 효과 라 고 불 린 다.
SpringCloud 의 Hystrix 구성 요 소 는 이러한 문 제 를 해결 할 수 있 습 니 다.Hystrix 는 서비스 간 의 호출 상황 을 감시 하고 여러 번 실 패 했 습 니 다.
상황 을 녹 여 보호 하 다.보호 하 는 방법 은 바로 사용 하 는 것 이다. Fallback,호출 된 서비스 가 고장 났 을 때 사용 할 수 있 습 니 다. Fallback 방법의
반환 값;하 이 스 트 릭 스 는 간격 을 두 고 고장 난 서 비 스 를 다시 점검 하고,고장 서비스 가 복구 되면 서 비 스 를 계속 이용 하 게 된다.
소스 코드
GitHub 주소:https://github.com/intomylife/SpringCloud
환경.
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
feign:
hystrix:
#
enabled: true
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();
}
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);
}
}
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 로 사용 합 니 다. 열다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
SpringCloud OAuth2 + JWT 인증 인증(一) 인증 서버Spring Cloud oAuth2(1) 라이센스 서버 구축 및 액세스 Spring Cloud oAuth2(2) 리소스 서버 구축 및 테스트 SpringCloud OAuth2 + JWT 인증 인증(一) 인증 서버 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.