SpringBoot+Eureka 마이크로 서비스 부하 균형 을 실현 하 는 예제 코드
                                            
 22187 단어  SpringBootEureka부하 균형
                    
Spring Boot 는 현재 가장 핫 한 웹 프레임 워 크 입 니 다.그렇다면 유레카 와 는 어떤 연관 이 있 을 까?
4.567917.Eureka 는 넷 플 릭 스 가 시작 한 RESTful 서비스 로 주로 서비스의 등록 발견 에 사용 된다4.567917.Eureka 는 두 가지 구성 요소 로 구성 되 어 있 습 니 다.Eureka 서버 와 Eureka 클 라 이언 트 입 니 다.Eureka 서버 는 서비스 등록 서버 로 사 용 됩 니 다4.567917.Eureka 클 라 이언 트 는 자바 클 라 이언 트 로 서버 와 의 상호작용 을 간소화 하고 폴 링 부하 이퀄 라이저 로 서 서비스의 고장 전환 지원 을 제공 합 니 다넷 플 릭 스 는 생산 환경 에서 다른 클 라 이언 트 를 사용 하 는데 데이터,자원 이 용 률 과 오류 상 태 를 바탕 으로 하 는 가중 부하 균형 을 제공한다2.먼저 Eureka-server 서비스 등록 센터 를 만 듭 니 다.
spring-cloud 의 Eureka 모듈 을 사용 해 야 합 니 다.그 는 서비스의 등록 과 발견 모듈 입 니 다.
그림 에서 보 듯 이 우 리 는 먼저 Spring-boot 프로젝트 를 Eureka 서버 에 도입 합 니 다.
 
  
  
 다음>>>>완료
구 축 된 Eureka-server 의 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.eureka</groupId>
  <artifactId>server</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  <name>server</name>
  <description>Demo project for Spring Boot</description>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.2.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </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.RC2</spring-cloud.version>
  </properties>
  <dependencies>
    <!--    Eureka-server -->
    <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>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-autoconfigure</artifactId>
    </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-milestones</id>
      <name>Spring Milestones</name>
      <url>https://repo.spring.io/milestone</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>
</project>그럼 우 리 는 그것 을 어떻게 사용 합 니까?어떻게 시작 합 니까?
여기 주석 하나만 시작 하면 됩 니 다.Spring-boot 프로젝트 의 시작 클래스 에>>>>>>>@EnableEureka Server 를 추가 합 니 다.
코드 는 다음 과 같 습 니 다:
package com.eureka.server;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
 *           
 */
@EnableEurekaServer
@SpringBootApplication
public class ServerApplication {
 
  public static void main(String[] args) {
    SpringApplication.run(ServerApplication.class, args);
  }
}Eureka 는 사용 가능 한 구성 요소 입 니 다.모든 인 스 턴 스 를 등록 한 후에 등록 센터 에 심 박 수 를 보 내야 합 니 다.기본 적 인 상황 에서 erureka server 도 eureka client 이 므 로 server 를 지정 해 야 합 니 다.
eureka server 설정 파일 app.yml:
server:
 port: 8081 #         
eureka:
 instance:
  hostname: 127.0.0.1 #      IP  
 client:
  registerWithEureka: false #             
  fetchRegistry: false #      
  serviceUrl: #           ,           
   defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ 
 브 라 우 저 에 입력 합 니 다.http://127.0.0.1:8081/비행기 가 직행한다
 
 우 리 는 그것 의 시각 화 인터페이스 를 볼 수 있다.
세심 한 친 구 는 이곳 에서 서 비 스 를 발견 하지 못 했다 는 것 을 알 게 될 것 이다??No instance available
why? 저희 가 아직 서비스 가 없어 서 등록 센터 에 서 비 스 를 등록 하지 않 아서 찾 을 수가 없어 요.
3.먼저 Eureka-Client 클 라 이언 트,즉 서비스 제공 자 를 만 듭 니 다.
클 라 이언 트 가 등록 센터 에 호스트 와 포트,URL,홈 페이지 등 메타 데 이 터 를 제공 합 니 다.Eureka server 는 모든 client 인 스 턴 스 로부터 심장 박동 메 시 지 를 받 습 니 다.심장 박동 이 시간 을 초과 하면 이 인 스 턴 스 를 등록 server 에서 삭제 합 니 다.
클 라 이언 트 를 만 드 는 것 은 서버 와 차이 가 많 지 않 습 니 다.시작 설명 만 다 르 고 yml 설정 파일 도 있 습 니 다.
 
  
  
 Next>>>Finish 가 완성 되 었 습 니 다.
열 면 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.eureka</groupId>
  <artifactId>provider</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  <name>provider</name>
  <description>Demo project for Spring Boot</description>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.2.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </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.RC2</spring-cloud.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <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>
  <repositories>
    <repository>
      <id>spring-milestones</id>
      <name>Spring Milestones</name>
      <url>https://repo.spring.io/milestone</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>
</project>간단 하 다
Spring-boot 의 시작 클래스 에 주석@EnableEureka Client 를 통 해 자신 이 eureka client 임 을 표시 합 니 다.
package com.eureka.provider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
 * Eureka   
 */
@RestController
@EnableEurekaClient
@SpringBootApplication
public class ProviderApplication {
 
  public static void main(String[] args) {
    SpringApplication.run(ProviderApplication.class, args);
  }
 
 
  /**
   *             getUser   
   * @return
   */
  @GetMapping(value = "/getUser")
  @ResponseBody
  public Map<String,Object> getUser(@RequestParam Integer id){
    Map<String,Object> data = new HashMap<>();
    data.put("id",id);
    data.put("userName","admin");
    data.put("from","provider-A");
    return data;
  }
 
}
eureka:
 client:
  serviceUrl: #         
   defaultZone: http://127.0.0.1:8081/eureka/
server:
 port: 8082 #     
spring:
 application:
  name: service-provider #    --                   
 우 리 는 이 클 라 이언 트 가 이미 등록 센터 에 서 비 스 를 등록 한 것 을 보 았 다.그러면 우 리 는 Eureka-server 비행 기 를 열 어 직항 한다.
 
 저희 가 시작 한 서비스 가 들 어 가 는 걸 봤 어 요.
 
 우리 서비스 넣 은 거 봤 지?
그럼 누가 물 어 볼 거 야.등 록 된 서 비 스 는 모두 사용 가능 하기 때문에 여 기 는 하나의 서비스 만 감지 되 고 발생 하 는 경고 만 감지 되 며 사용 에 영향 을 주지 않 습 니 다.다음 에 우리 가 여러 개의 인 스 턴 스 를 시작 하면 그렇지 않 을 것 입 니 다.
클 라 이언 트 의 방법 이 사용 가능 한 지 먼저 테스트 해 보 겠 습 니 다.http://127.0.0.1:8082/getUser?id=1
 
 분명히 문제 가 없 는 것 같 습 니 다.그러면 우 리 는 서 비 스 를 잘 제 공 했 습 니 다.sei 는 소 비 를 합 니까?
다음은 저희 가 소비 자 를 만 들 겠 습 니 다.
더 간단 하고 알 기 쉽게 하기 위해 서 나 는 한 걸음 한 걸음 그림 을 내 는 것 이 좋 겠 다.
 
  
 자,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.eureka</groupId>
  <artifactId>consumer</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  <name>consumer</name>
  <description>Demo project for Spring Boot</description>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.2.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </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.RC2</spring-cloud.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <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>
  <repositories>
    <repository>
      <id>spring-milestones</id>
      <name>Spring Milestones</name>
      <url>https://repo.spring.io/milestone</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>
</project>
package com.eureka.consumer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import java.util.Map;
/**
 * Eureka   -   
 */
@RestController
@EnableEurekaClient
@SpringBootApplication
public class ConsumerApplication {
  @Autowired
  RestTemplate restTemplate;
  public static void main(String[] args) {
    SpringApplication.run(ConsumerApplication.class, args);
  }
  /**
   *    RestTemplate
   * @return
   */
  @LoadBalanced
  @Bean
  public RestTemplate rest() {
    return new RestTemplate();
  }
  /**
   * Rest     RestTemplate  http  ,           ----gotoUser     getUser      
   * @param id
   * @return
   */
  @GetMapping(value = "/gotoUser")
  @ResponseBody
  public Map<String,Object> getUser(@RequestParam Integer id){
    Map<String,Object> data = new HashMap<>();
    /**
     *        ,     http://service-provider
     *     http://127.0.0.1:8082/
     *              ,    service-provider,    service-provider  
     */
    data = restTemplate.getForObject("http://service-provider/getUser?id="+id,Map.class);
    return data;
  }
}
eureka:
 client:
  serviceUrl: #         
   defaultZone: http://127.0.0.1:8081/eureka/
server:
 port: 8083 #     
spring:
 application:
  name: service-consumer #    --                   
 우리 공급 자 와 소비자 가 다 들 어 왔 는 지.
그럼 우리 소비자 들 의 방법 이 비행기 로 직항 할 수 있 는 지 살 펴 보 자.
 
 하하,신기 하지?
더 신기 한 것 을 소개 한다--마이크로 서비스 부하 균형 실현
우 리 는 서비스 제공 자 를 하나의 공 사 를 복사 해서 부하 균형 을 이 룰 수 있 는 지 작은 수정 을 해 보 겠 습 니 다.
우 리 는 두 개의 서 류 를 수정 해 야 한다.
하 나 는 시동 류 인 데 어떤 것 을 바 꿨 나 요?보면 알 겠 지.
package com.eureka.provider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
 * Eureka   
 */
@RestController
@EnableEurekaClient
@SpringBootApplication
public class ProviderApplication {
  public static void main(String[] args) {
    SpringApplication.run(ProviderApplication.class, args);
  }
  /**
   *             getUser   
   * @return
   */
  @GetMapping(value = "/getUser")
  @ResponseBody
  public Map<String,Object> getUser(@RequestParam Integer id){
    Map<String,Object> data = new HashMap<>();
    data.put("id",id);
    data.put("userName","admin");
    data.put("from","provider-B");//                     
    return data;
  }
}
eureka:
 client:
  serviceUrl: #         
   defaultZone: http://127.0.0.1:8081/eureka/
server:
 port: 8088 #     --       
spring:
 application:
  name: service-provider #    --                  --       ,        Eureka-server 백 스테이지 의 효 과 를 보 세 요.ServerA ServerB.
 
 이거 서비스 프로 바 이 더 라 고 하 는데 인 스 턴 스 가 두 개 있 죠?
그럼,우리 각자 방문 해서 효과 가 어떤 지 봅 시다.
 
  
 보이 시 나 요?8082 포트,from 은 provider-A,8088 포트,from 은 provider-B 입 니 다.
그러면 저희 가 소비자 서버 를 방문 해서 어떤 상황 이 벌 어 질 지 보도 록 하 겠 습 니 다.비행기 직항.
 
  
 처음에는 from A 였 는데,새로 고침 해 봐,응?from B 가 됐어 요.
이때 두 공급 자가 교체 작업 을 하여 부하 균형 에 이 르 렀 음 을 나타 낸다.
자,자,내 가 그림 을 그 려 줄 게.
 
 모든 마이크로 서 비 스 는 Eureka-Client 입 니 다.우 리 는 모든 app(SpringBootApplication)을 등록 센터 에 서 비 스 를 등록 합 니 다.
가끔 은 특정한 서비스의 업 무량 이 비교적 많 을 때 우 리 는 같은 이름 의 마이크로 서 비 스 를 몇 개 더 등록 하여 그들 로 하여 금 업 무 를 교체 하고 하나의 서비스의 부담 을 줄 일 수 있다.
여기까지 쓰 면 끝 이 야.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Java・SpringBoot・Thymeleaf】 에러 메세지를 구현(SpringBoot 어플리케이션 실천편 3)로그인하여 사용자 목록을 표시하는 응용 프로그램을 만들고, Spring에서의 개발에 대해 공부하겠습니다 🌟 마지막 데이터 바인딩에 계속 바인딩 실패 시 오류 메시지를 구현합니다. 마지막 기사🌟 src/main/res...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.