springboot 2.0 과 springcloud Finchley 버 전 프로젝트 구축(eureka,gateway,Freign,Hystrix 포함)

얼마 전에 spring boot 2.0 이 발표 되 었 는데 이에 대응 하 는 spring cloud Finchley 버 전도 이에 수반 되 었 습 니 다.이들 의 관계 와 버 전 대응 은 제 글 을 참조 하 십시오spring boot 와 spring cloud 에 대응 하 는 버 전 관계
프로젝트 주소:spring-cloud-demo
spring boot 1.x 와 spring cloud Dalston 과 Edgware 버 전 으로 구 축 된 마이크로 서비스 프로젝트 가 현재 유행 하고 있 습 니 다.현재 많은 기업 들 이 이미 사용 하고 있 습 니 다.여 기 는 더 이상 말 하지 않 겠 습 니 다.
사용 버 전 설명:
  • spring boot 2.0.x
  • spring cloud Finchley.RELEASE
  • jdk 1.8
  • maven 3.9
  • 유레카 등록 센터
    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
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기