Spring Boot+Eurekaマイクロサービス負荷の均衡を実現するためのコード例


1,何がEurekaですか?何がサービス登録と発見ですか?
Spring Bootは現在最も人気のあるwebフレームとして使われています。Eurekaとは何か関連がありますか?
  • EurekaはNetflixオープンソースのRESTfulサービスで、主にサービスの登録発見に用いられます。
  • Eurekaは、2つのコンポーネントから構成されています。EurekaサーバとEurekaクライアントです。Eurekaサーバはサービス登録サーバとして機能します。
  • Eurekaクライアントは、サーバとの相互作用を簡略化し、ポーリング負荷イコライザとして機能し、サービスのフェイルオーバサポートを提供するjavaクライアントである。
  • Netflixは、その生産環境で使用される別のクライアントであり、トラフィック、リソースの利用率、およびエラー状態に基づく重み付け負荷の均衡を提供する。
  • 2,まずEureka-Serverサービス登録センターを作成します。
    ここではspring-cloudのEurekaモジュールを使用する必要があります。彼はサービスの登録と発見モジュールです。
    図のようにまずnew Spring-bootプロジェクトにEureka Serverを導入します。



    Next>>>Finish完了
    構築されたEureka-Severの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-Severパッケージをここに引用しました。
    それをどう使いますか?どうやって起動しますか?
    ここでは一つの注釈を起動するだけでいいです。私たちはSpring-Bootプロジェクトのスタートクラスに>>>@EnbaleeurkaServerを追加します。
    コードは以下の通りです
    
    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もeurka clientであり、serverを指定しなければなりません。
    eureka serverのプロファイルapication.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-lientクライアント、つまりサービスプロバイダを作成します。
    クライアントは、ホストとポート、URL、ホームページなどのメタデータを登録センターに提供する。Eureka serverは、各clientインスタンスから心拍メッセージを受信する。ときめきがタイムアウトした場合、このインスタンスは通常登録serverから削除される。
    クライアントを作成するのはサーバーと同じです。注解を開始するだけではちょっと違っています。また、yml設定ファイルがあります。



    Next>>Finish完成しました。
    開いてみると、pom.xmlは実はServer登録センターと似ています。
    
    <?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>
    Cientだとどう証明しますか?
    簡単です
    Spring-bootの起動類には、自分がeurekaclientであることを注釈で示しています。
    
    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;
      }
     
    }
    @EnbaleeurekaClientを追加しましたが、なんだかもう少しで何かを感じます。そうだ、配置ファイル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;
      }
    
    }
    そして、設定ファイルです。
    
    eureka:
     client:
      serviceUrl: #         
       defaultZone: http://127.0.0.1:8081/eureka/
    server:
     port: 8088 #     --       
    spring:
     application:
      name: service-provider #    --                  --       ,        
    スタートしましょう。
    Eureka-serverバックの効果を見てください。ServerA ServerB

    これはService-providerというのは二つの実例がありますか?
    じゃ、それぞれ訪問してみます。効果はどうですか?


    見ましたか?8082ポート、fromはprovider-A、8088ポート、fromはprovider-Bです。
    では、私たちは消費者のサーバーを訪問してみます。どのような状況がありますか?


    最初はfrom Aでしたが、更新してもらえますか?from Bになりました。
    この時、2台のプロバイダが交互に働いていて、負荷バランスの役割を果たしています。
    さあ、図を描いてあげます。

    各マイクロサービスはEureka-lientです。各アプリを登録センターに登録します。
    あるサービスの仕事量が多い時、私たちは同じ名前のサービスを登録して、交替で仕事をさせて、単一のサービスの圧力を軽減します。
    ここで終わります。
    以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。