Spring Boot+Eurekaマイクロサービス負荷の均衡を実現するためのコード例
21310 ワード
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コードを見てみましょう。
それをどう使いますか?どうやって起動しますか?
ここでは一つの注釈を起動するだけでいいです。私たちはSpring-Bootプロジェクトのスタートクラスに>>>@EnbaleeurkaServerを追加します。
コードは以下の通りです
Eurekaは高い利用可能なコンポーネントであり、各インスタンスを登録した後、登録センターに心拍パケットを送信する必要があります。デフォルトではerureka serverもeurka clientであり、serverを指定しなければなりません。
eureka serverのプロファイルapication.yml:
私たちはブラウザで入力します。http://127.0.0.1:8081/飛行機が直通する
私たちはその可視化画面を見ることができます。
注意深い友達はここでサービスが見つかりませんか?No instance available
why私たちはまだ登録センターにサービスをしていませんので、見つけられません。
3、まずEureka-lientクライアント、つまりサービスプロバイダを作成します。
クライアントは、ホストとポート、URL、ホームページなどのメタデータを登録センターに提供する。Eureka serverは、各clientインスタンスから心拍メッセージを受信する。ときめきがタイムアウトした場合、このインスタンスは通常登録serverから削除される。
クライアントを作成するのはサーバーと同じです。注解を開始するだけではちょっと違っています。また、yml設定ファイルがあります。
Next>>Finish完成しました。
開いてみると、pom.xmlは実はServer登録センターと似ています。
簡単です
Spring-bootの起動類には、自分がeurekaclientであることを注釈で示しています。
私たちはこのクライアントが登録センターに登録されているのを見ました。それではEureka-server飛行機を開けて直通します。
私たちが起動しているサービスを見ましたが、追加されましたか?
私たちは私たちのサービスを見ましたが、追加されましたか?
では、その山のように赤いのはどういう意味ですか?登録されたサービスはすべて利用可能なので、ここでは一つのサービスしか検出できません。発生した警告は使用に影響しません。あとで複数のインスタンスを起動したら大丈夫です。
まずクライアントの方法が利用可能かどうかをテストします。http://127.0.0.1:8082/getUser?id=1
明らかに問題がないです。サービスを提供して、seiで消費しますか?
次は消費者を創立します。
分かりやすくするために、一歩ずつ図を出しましょう。
pom.xmlを貼ります
私達の提供者と消費者は全部入ってきましたか?
じゃ、私たち消費者の方法は飛行機で直接行くことができますか?
ハハ、不思議ですか?
より不思議なものを紹介します。マイクロサービスの負荷バランスを実現します。
サービスプロバイダをコピーしてプロジェクトを作って、荷重バランスを実現できるかどうか見てみます。
私たちは二つの書類を修正したいです。
一つはスタートクラスです。何を変えましたか?見ればわかるよ
Eureka-serverバックの効果を見てください。ServerA ServerB
これはService-providerというのは二つの実例がありますか?
じゃ、それぞれ訪問してみます。効果はどうですか?
見ましたか?8082ポート、fromはprovider-A、8088ポート、fromはprovider-Bです。
では、私たちは消費者のサーバーを訪問してみます。どのような状況がありますか?
最初はfrom Aでしたが、更新してもらえますか?from Bになりました。
この時、2台のプロバイダが交互に働いていて、負荷バランスの役割を果たしています。
さあ、図を描いてあげます。
各マイクロサービスはEureka-lientです。各アプリを登録センターに登録します。
あるサービスの仕事量が多い時、私たちは同じ名前のサービスを登録して、交替で仕事をさせて、単一のサービスの圧力を軽減します。
ここで終わります。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
Spring Bootは現在最も人気のあるwebフレームとして使われています。Eurekaとは何か関連がありますか?
ここでは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です。各アプリを登録センターに登録します。
あるサービスの仕事量が多い時、私たちは同じ名前のサービスを登録して、交替で仕事をさせて、単一のサービスの圧力を軽減します。
ここで終わります。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。