SpringBoot+Eureka 마이크로 서비스 부하 균형 을 실현 하 는 예제 코드

1.유레카 가 무엇 인지,서비스 등록 과 발견 이 무엇 인지
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 프로젝트 와 달리 Eureka-server 가방 을 인용 한 것 을 보 았 다.
그럼 우 리 는 그것 을 어떻게 사용 합 니까?어떻게 시작 합 니까?
여기 주석 하나만 시작 하면 됩 니 다.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);
  }
}
하마터면 잊 을 뻔 했 어 요.application.yml 을 설정 해 야 해 요.
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;
  }
 
}
@EnableEurekaClient 를 추 가 했 지만 뭔 가 뻔 한 것 같 아 요.참,프로필 yml.

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;
  }

}
그리고 yml 프로필.

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)을 등록 센터 에 서 비 스 를 등록 합 니 다.
가끔 은 특정한 서비스의 업 무량 이 비교적 많 을 때 우 리 는 같은 이름 의 마이크로 서 비 스 를 몇 개 더 등록 하여 그들 로 하여 금 업 무 를 교체 하고 하나의 서비스의 부담 을 줄 일 수 있다.
여기까지 쓰 면 끝 이 야.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기