springboot 2.0 과 springcloud Finchley 버 전 프로젝트 구축(eureka,gateway,Freign,Hystrix 포함)
프로젝트 주소:spring-cloud-demo
spring boot 1.x 와 spring cloud Dalston 과 Edgware 버 전 으로 구 축 된 마이크로 서비스 프로젝트 가 현재 유행 하고 있 습 니 다.현재 많은 기업 들 이 이미 사용 하고 있 습 니 다.여 기 는 더 이상 말 하지 않 겠 습 니 다.
사용 버 전 설명:
spring cloud Finchley 는 spring 2.0 을 지원 할 때 eureka 의 jar 가방 을 수정 하여 이전 넷 플 릭 스 시리즈 의 jar 를 도입 할 때 넷 플 릭 스 를 추가 했다.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
eureka-service 등록 센터 서 비 스 를 새로 만 듭 니 다.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>
<groupId>com.sunvalley</groupId>
<artifactId>eureka-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eureka-service</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.sunvalley.springcloud</groupId>
<artifactId>spring-cloud-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
eureka-service 서비스의 프로필,application.yml
spring:
application:
name: eureka-service
server:
port: 5000
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
eureka-service 서비스의 프로필,Eureka ServiceApplication
@EnableEurekaServer
@SpringBootApplication
public class EurekaServiceApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServiceApplication.class, args);
}
}
IDEA 를 사용 하여 eureka-service 서 비 스 를 시작 하면 로 컬 방문http://localhost:5000/등록 센터 내용 을 볼 수 있 습 니 다.서비스 소비자 consumer 와 공급 자 provider
실제 업무 에서 대부분의 서 비 스 는 다른 서비스의 소비자 이자 서비스의 제공 자 일 수 있 기 때문에 우 리 는 애 써 구분 하지 않 아 도 된다.
order-service 서비스,pom.xml 파일 을 새로 만 듭 니 다.
메모:eureka-client,openfeign 등 jar 가방 을 제외 하고 spring-boot-starter-web 를 도입 하지 않 으 면 시작 오류 가 발생 할 수 있 습 니 다.
<?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.sunvalley</groupId>
<artifactId>order-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>order-service</name>
<description>Demo project for Spring Cloud</description>
<parent>
<groupId>com.sunvalley.springcloud</groupId>
<artifactId>spring-cloud-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- eureka ribbon , , ribbon , -->
<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-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
order-service 서비스의 프로필,application.yml
spring:
application:
name: order-service
server:
port: 5100
eureka:
client:
service-url:
defaultZone: http://localhost:5000/eureka/
feign:
hystrix:
enabled: true
order-service 서비스의 시작 클래스,OrderServiceApplication
@EnableCircuitBreaker
@EnableFeignClients
@EnableEurekaClient
@SpringBootApplication
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
}
order-service 서비스의 인터페이스,OrderController
@RestController
@RequestMapping("/order")
public class OrderController {
@Value("${server.port}")
private String port;
/**
*
* @return
*/
@GetMapping("/getOrderPort")
public String getOrderPort() {
return "order-service port:" + port;
}
}
user-service 서 비 스 를 새로 만 듭 니 다.pom.xml 파일 은 order-service 와 같은 곳 에 열거 되 지 않 습 니 다.user-service 서비스의 프로필,application.yml
spring:
application:
name: user-service
server:
port: 5200
eureka:
client:
service-url:
defaultZone: http://localhost:5000/eureka/
feign:
hystrix:
enabled: true
user-service 서비스의 시작 클래스 도 order-service 와 같 습 니 다.user-service 프로젝트 디 렉 터 리 에 패 키 지 를 새로 만 들 고 Order Remote 인 터 페 이 스 를 새로 만 들 때 feign 에서 order-service 를 호출 하 는 방법 을 사용 합 니 다.
@FeignClient(value = "order-service", fallback = OrderRemoteHystrix.class)
public interface OrderRemote {
@GetMapping("/order/getOrderPort")
String getOrderPort();
}
퓨즈 메커니즘 알림 클래스
@Component
public class OrderRemoteHystrix implements OrderRemote {
@Override
public String getOrderPort() {
return "order service !";
}
}
user-service 서비스의 인터페이스,UserController
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
OrderRemote orderRemote;
@Value("${server.port}")
String port;
/**
*
* @return
*/
@GetMapping("/getUserPort")
public String getUserPort() {
return "user-service port:" + port;
}
/**
*
* @return
*/
@GetMapping("/getOrderPort")
public String getOrderPort() {
return "user-order-service port:" + orderRemote.getOrderPort();
}
}
테스트,eureka-service,order-service,user-service 를 각각 시작 하면 등록 센터 에서 서 비 스 를 볼 수 있 습 니 다.브 라 우 저 에서 접근http://localhost:5100/order/getOrderPort order-service 인터페이스 호출
브 라 우 저 에서 접근http://localhost:5200/user/getOrderPort user-service 를 통 해 feign 성명 식 으로 order-service 인 터 페 이 스 를 호출 합 니 다.
order-service 를 닫 고 다시 호출 하면 퓨즈 메커니즘 이 작 동 하 는 것 을 발견 할 수 있 습 니 다.
spring cloud gateway
Spring Cloud Gateway 는 Spring 이 공식 적 으로 Spring 5.0,Spring Boot 2.0 과 Project Reactor 등 기술 을 바탕 으로 개발 한 게 이 트 웨 이 로 Spring Cloud Gateway 는 마이크로 서비스 구조 에 간단 하고 효과 적 인 통 일 된 API 경로 관리 방식 을 제공 하 는 데 목적 을 둔다.Spring Cloud Gateway 는 Spring Cloud 생태계 의 게 이 트 웨 이 로 서 넷 플 릭 스 ZUUL 을 대체 하 는 것 이 목표 이다.이 는 통 일 된 경로 방식 을 제공 할 뿐만 아니 라 Filter 체인 방식 을 바탕 으로 게 이 트 웨 이 기본 기능 을 제공 했다.예 를 들 어 안전,모니터링/매 립 점,그리고 흐름 제한 등 이다.
새 gateway-service 서 비 스 를 만 듭 니 다.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>
<groupId>com.sunvalley</groupId>
<artifactId>gateway-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>gateway-service</name>
<description>Demo project for Spring Cloud</description>
<parent>
<groupId>com.sunvalley.springcloud</groupId>
<artifactId>spring-cloud-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</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-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
gateway-service 설정 파일,application.yml
spring:
application:
name: gateway-service
cloud: # spring cloud gateway
gateway:
discovery: # , serviceId( ) 。 false, true serviceId 。
locator: # :http://Gateway_HOST:Gateway_PORT/ serviceId/**, 。
enabled: true
routes:
- id: 163 #
uri: http://www.163.com/
predicates:
- Path=/163/**
# - id: ORDER-SERVICE # order-service
# uri: lb://ORDER-SERVICE
# predicates:
# - Path=/ORDER-SERVICE/**
# - id: USER-SERVICE # user-service
# uri: lb://USER-SERVICE
# predicates:
# - Pach=/USER-SERVICE/**
server:
port: 5001
logging:
level:
org.springframework.cloud.gateway: trace
org.springframework.http.server.reactive: debug
org.springframework.web.reactive: debug
reactor.ipc.netty: debug
eureka:
client:
service-url:
defaultZone: http://localhost:5000/eureka/
feign:
hystrix:
enabled: true
gateway-service 의 시작 클래스,Application
package com.sunvalley.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class GatewayServiceApplication {
/**
* spring cloud gateway , ,
* @param builder
* @return
*/
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route(r -> r.path("/qq/**")
.and()
.uri("http://www.qq.com/"))
.build();
}
public static void main(String[] args) {
SpringApplication.run(GatewayServiceApplication.class, args);
}
}
위 를 통 해 우 리 는 gateway 게 이 트 웨 이 게 이 트 웨 이 경로 설정 에 두 가지 방식 이 있 음 을 알 수 있 습 니 다.1.@Bean 을 통 해 RouteLocator 를 사용자 정의 하고 메 인 애플 리 케 이 션 을 시작 할 때 설정 합 니 다.
2.프로필 yml 에 설정
이 두 가지 방식 은 모두 게 이 트 웨 이 경로 가 등가 임 을 실현 할 수 있 지만 보통 프로젝트 개발 에 서 는 프로필 yml 방식 을 사용한다.
실행 테스트:
방문 하 다.http://localhost:8080/qq경로http://www.qq.com
방문 하 다.http://localhost:8080/163경로http://www.163.com
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.