SpringCloudサービスをゼロから構築する

1. SpringCloudとは何ですか?

SpringCloud公式ウェブサイト:https://spring.io/projects/spring-cloud(個人的な提案は、Google Chromeを使用して公式ウェブサイトにアクセスし、中国語の翻訳を開いて公式ウェブサイトを大まかに読むことです)

Spring Family Bucket関連の記事をPDFに整理し、WeChatパブリックアカウントのJavaバックエンドに注意を払い、666に返信してこのテクノロジースタックマニュアルをダウンロードします。

個人的な理解:

以前のサーバーは、たくさんの言葉を話すことができ、生徒にサービスを提供する万能の教師のようなものでした。この教師が病気になると、学校全体が停止されます。マイクロサービスが普及した今、学校には数学の教育研究グループ、中国の教育研究グループ、外国語の教育研究グループがあり、各教育研究グループには、特に教育を担当する教師のグループがあります。特定の科目がない場合でも、学校は運営されます。

この変更では、履歴を変更するプログラマーは、1つのサーバー内の多くのサービス、または複数のサーバー内の多くのサービスを分類して分離し、同じクラスターに同様の機能を提供します。互いに結合されている機能は分離され、はビジネスと機能に応じてマイクロサービスとしてサーバーに配置され、このサーバーは1つのサービスまたはそれより少ないサービスのみを提供します。

大規模なサービスロジックを、各サーバーに均等に分散された小さなサービスに分離します。マイクロサービスはこちらです。各教育研究グループはマイクロサービスクラスターです。彼らは同じサービスを提供し、登録センターユーレカは教育研究グループの教師リストが保管されている場所です。学生は登録センターにアクセスして教師のリストを取得し、対応する教師に応じて訪問したいと考えています。ロード方法。クラスタ内の教師が使い果たされたり、教師がアイドル状態で死亡したりすることはありません。

Zuulゲートウェイは、学校のガードである。一部の学生はそれは(ルーティング)導くための責任がある。誰かを見つけるために学校に来て、いくつかの非常にシンプルな構成によって、それは(本人確認)を入力することから、一部の人をブロックすることができ、または制御数学を学びたい人。原子爆弾の作り方(権限検証)を学ぶために、核エネルギー教育研究グループではなく、数学教育研究グループにのみ行くことができます。

Hystrixヒューズは、学校のボランティアとみなすことができる。教育と研究グループは、まとめ当たると、生徒が教師を見つけることができません。これらのボランティアがするように、など、対応の結果、異常情報を、時間内に訪問し、学生に伝えます多くの生徒が学校で待っているのを避けてください。これらのボランティアは急いで待っている生徒を整理します。生徒は学校で待っています。生徒を必要とする他の学校も生徒を待っています。これは最終的には広い範囲を麻痺させます。学校。ここでは、学生を1人ずつリクエストとして扱います。ヒューズは、飛んでも事故の拡大を防ぐためのものです。

もちろん、これらのコンポーネントは、Eurekaレジストリに登録する必要があるマイクロサービスでもあります

そして、 春の雲は、 この学校とみなすことができます。上記のコンポーネントの多くは、学校のさまざまな機能部門に相当します。

ps:ブロガーはMaven + ideaに基づいています。さらに、SpringCloudはspringbootに基づいて構築する必要があります。

2.1 SpringBoot関連の依存関係の紹介ここでspringbootはバージョン1.5.7を使用します

ここでSpringCloud関連の依存関係をEdgware.SR5として 紹介します

2.1プロジェクトの初期構成

アイデアでプロジェクトを作成します:ファイル->新規->プロジェクト

 [空のプロジェクト]-> [次へ]をクリックします

 プロジェクトの命名->プロジェクトの場所

 モジュールを選択->次へ

 新しいウィンドウに入った後、Mavenの構成を開始し、設定を開きます

 以前に構成を行ったので、ボックス1のパスを変更するだけで済みます。たとえば、最初の構成では、Mavenの場所と、settings.xml リポジトリの場所を見つける必要があります。Baidumaven統合アイデアは本当にありません

3つのボックスを選択したら、[OK]をクリックします

次に、新しいモジュールを作成します

アーキタイプリストを読み込めないという問題があるかもしれません

 インターネット上のすべてのソリューションを使用した後、それを解決するのに3時間かかり、役に立たなかった。再起動した後、それは機能する。あなたはそれを信じますか?私は若い頃、インターネットカフェやウェブマネージャーの最も論理的なことわざを忘れていました!再起動してください!

出てきたら、クイックスタート->次へを選択します

自分の名前を考えたら、必要なArtifactIdをコピーして、[次へ]をクリックします。groupIdが組織の名前である場合は、自分の名前も考えます。通常、会社のWebサイトは逆になります。

 貼り付け後の次のステップ

 登録サービスを提供するサーバーの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.yun</groupId>
  <artifactId>springcloud-eureka-server</artifactId>
  <version>1.0-SNAPSHOT</version>
 
  <name>springcloud-eureka-server</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>
 
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>
 
  <!--引入springboot-parent父项目-->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.7.RELEASE</version>
  </parent>
 
  <dependencies>
    <!--引入springcloud的euekea server依赖-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
 
  </dependencies>
 
 
  <!--指定下载源和使用springcloud的版本-->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Edgware.SR5</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

 [変更のインポート]をクリックします 

springcloudの依存関係が右下隅に読み込まれるのを待ちます

 2.2Springboot の構築と登録サービスを提供するためのサービス構成

リソースフォルダを作成する

 そしてそれをリソースルートディレクトリとして設定すると、ファイルは次のようになります

その後、フォルダは黄色のバーになります

 リソースの下に新しいファイルを作成します。ファイル名はapplication.ymlです(ymlはxmlではありません。ブロガーが最初に学習したとき、間違いを犯して小さな穴を踏んだのは他のブロガーだと思っていました) 

 ymlを構成します。注:ポート番号情報の最初の2行のみを構成すると、エラーが報告されます。

server:
  port: 8700 # 端口自己决定
  
# 指定当前eureka客户端的注册地址,也就是eureka服务的提供方,当前配置的服务的注册服务方
eureka:
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
    register-with-eureka: false #自身 不在向eureka注册
    fetch-registry: false #启动时禁用client的注册
  instance:
    hostname: localhost
 
#指定应用名称
spring:
  application:
    name: eureka-server

知識の補足:

 SpringBoot用のエントリクラスEurekaServerApplication.javaを開発します

 EurekaServerApplication.java

package com.yun;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
 
@SpringBootApplication
@EnableEurekaServer //当前使用eureka的server
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class,args);
    }
}

右クリックして現在のクラスを実行します。

コンソール画面を正常に実行する

 eureka管理インターフェイスに入ってみてください。ポート番号はymlで構成されています(ポート番号はパブリックおよび予約済みのポート番号よりも大きい必要があります)1024〜65535

一般的に私はそれを8700と8800の間に設定するのが好きです

次の管理インターフェイスはすでにログインできます

 2.3クライアントが実際のサービスを提供する役割の構成。サービス登録サーバー(登録センター)に登録するサービスを提供します。

また、新しいモジュールを作成し、クイックスタートを選択して[次へ]をクリックします

2つの位置が空白のまま

 次のステップに名前を付ける

 モジュールはルートディレクトリspringcloudの下に作成する必要があることに注意してください。コンテンツルートはデフォルトで前のモジュールの下にモジュールを作成します。これにより、モジュールの作成時に問題やエラーが発生します。

この構成方法をお勧めします。コンテンツルートの下のspringcloudの後に名前を変更します。次のように構成するには、[次へ]をクリックします。赤いボックスは通常、デフォルトで前のモジュールのファイルディレクトリ名になり、モジュール名に変更する必要があります。

 成功すると、並列状態になります。並列でない場合やエラーが発生した場合は、再構成してください。

 サーバーpom構成と同じであるservicesupportpomを構成します。必要なのは、最初のpomのボックス1のサーバークライアント変更することだけです。

最初のマイクロサービスと同様に、エントリクラス pom.xml   application.ymlを構成する必要があります。これはサービスプロバイダーであるため、ここではサービスクラスコントローラーを作成する必要があります。

application.yml

server:
  port: 8701 # 服务提供方
 
# 指定当前eureka客户端的注册地址,
eureka:
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:8700/eureka
  instance:
    hostname: localhost
 
#当前服务名称
spring:
  application:
    name: eureka-service

pom.xml:

提供されているサービスコントローラーを作成します

@RestController
@RequestMapping("/Hello")
public class Controller {
    @RequestMapping("/World")
    public String helloWorld(String s){
        System.out.println("传入的值为:"+s);
        return "传入的值为:"+s;
    }
}

エントリクラス とこのマイクロサービスの実行:

@SpringBootApplication
@EnableDiscoveryClient//代表自己是一个服务提供方
public class EurekaServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServiceApplication.class,args);
    }
}

 エントリクラス名を右クリックし、[実行]をクリックします(もちろん、このサービスを開くときは、最初にサーバーサービスを開く必要があります。これは、最初に作成したマイクロサービスです)。

 この時点で、サービス登録ページhttp:// localhost:8700 /に入ります。

サービスプロバイダー サービスレジストラとして登録されていることがわかります

 サービスプロバイダーのネットワークロケーションhttp:// localhost:8701 / Hello / World?s =小沛に直接アクセスします。

アクセス可能であることがわかり、このマイクロサービスが利用可能であることが証明されました。

 

 ただし、通常、必要なマイクロサービスを直接呼び出すことはありませんが登録済みサービス提供するサーバーサーバー介し必要なサービスプロバイダーのリスト(リスト、このリストには対応するサービスを提供できるサーバーが含まれます)取得します。クラスターの場合もあります。サーバーはIP +ポート番号のテーブルを返します。サービスコンシューマーは、対応するアルゴリズムを介してこのテーブル上の異なるサーバーにアクセスします。これらのサーバーは同じサービスを提供します。サービスコンシューマー側でサービスを提供するサーバーを選択するこの方法はクライアントです-サイドロードバランシング。

現在、ブロガーはこれらのサーバーにアクセスする方法2つあることを知っています: ポーリングランダム。ポーリングはループを意味します。サーバーが3つある場合、アクセス方法は1、2、3、1、2、3、1、2、3です。 ····ランダムはランダムです。ランダムな方法、不規則な方法を思い出してください。これらの方法はどちらも、各サーバーにアクセスする可能性が同じです。加重負荷アルゴリズムもあります。これは、対応するサービスがサーバーの負荷容量に従って割り当てられることを意味します。より有能なものは多くをします。能力はほとんどありません。

2.4サービスの呼び出し方法

最初の呼び出しメソッド:restTemplate + ribbon     

 2番目の呼び出しメソッド:feign 

 2.4.1 restTemplate +リボン   

リボンは負荷分散クライアントですが、それは何ですか?https://www.jianshu.com/p/1bd66db5dc46をお読みください

次の段落を見ることができます:

クライアント側の負荷分散サーバー側の負荷分散最大の違いは、上記のサービスリストが保存されている場所です。クライアント負荷分散では、すべてのクライアントノードがアクセスするサーバーのリストを維持します。これらのサーバーリストは、前の章で紹介したEurekaサーバーなどのサービスレジストリから取得されます。

サーバー側の負荷分散のアーキテクチャと同様に、クライアント側の負荷分散では、サーバー側のリストの状態を維持するためにハートビート必要です。デフォルトでは、各サービスガバナンスフレームワークのリボン自動統合構成が作成されます。 Eurekaのorg.springframework.cloudとして。.netflix.ribbon.eureka.RibbonEurekaAutoConfiguration、Consulのorg.springframework.cloud.consul.discovery.RibbonConsulAutoConfiguration。実際の使用では、これら2つのクラスの実装を調べて構成の詳細を見つけることにより、より適切に使用できるようになります。

次に、消費者サービスに使用されるリボンベースのクライアントを構築します。

同様に、最初にスプリングブート環境を構築します

以前のservicesupportビルドとの違いは次のとおりです。

最初のステップ:pomの依存関係にリボンの依存関係を追加する必要があります

<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

 

ステップ2:ymlは次のように構成されます:

server:
  port: 8702 # 服务消费方
 
# 指定当前eureka客户端的注册地址,
eureka:
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:8700/eureka
  instance:
    hostname: localhost
 
#当前服务名称
spring:
  application:
    name: eureka-consumer

 サービスの利用者は登録者のポート8700に登録する必要がありますeureka-consumerという名前の現在のサービスコンシューマーのポート8072を構成します

3番目のステップ:これはスプリングブートアーキテクチャであるため、クラスを開始する必要があります。

@SpringBootApplication
@EnableDiscoveryClient //当前使用eureka的server
public class EurekaConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaConsumerApplication.class,args);
    }
}

 上に示すように:

リボンコードを書くにはコントローラークラスが必要です。

@RestController
@RequestMapping("/Hello")
class ConsumerController {
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    @Autowired
    private RestTemplate restTemplate;
    @RequestMapping("/Consumer")
    public String helloWorld(String s){
        System.out.println("传入的值为:"+s);
        //第一种调用方式
        //String forObject = new RestTemplate().getForObject("http://localhost:8071/Hello/World?s=" + s, String.class);
 
        //第二种调用方式
        //根据服务名 获取服务列表 根据算法选取某个服务 并访问某个服务的网络位置。
        //ServiceInstance serviceInstance = loadBalancerClient.choose("EUREKA-SERVICE");
        //String forObject = new RestTemplate().getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/Hello/World?s="+s,String.class);
 
        //第三种调用方式 需要restTemplate注入的方式
        String forObject = restTemplate.getForObject("http://EUREKA-SERVICE/Hello/World?s=" + s, String.class);
        return forObject;
    }
}

私たちはしばしば3番目の呼び出しメソッドを使用します。

1つ目は、直接電話することです。登録センターのサービスリストを経由せずに直接アクセスできるservicesupport

2番目のタイプ:上の図に示すように、サービス名に基づいてコールを選択します。次のインジェクションが必要です   

    @Autowired
    private LoadBalancerClient loadBalancerClient;

上記のコードの2番目の呼び出しメソッドのコードに示されているように。

サービス名を使用してレジストリに移動し、サービスリストを取得します。クライアントの現在の最下層は、ランダムなアルゴリズム選択を実行してサービスを取得し、それにアクセスします。

3番目のタイプでは、@ Beanアノテーションを自動的に挿入し、restTemplateオブジェクトを直接呼び出してサービスを呼び出す必要があります。一番下の通話モードは、2番目の通話モードと同じです。次のように:

@Configuration
public class Beans {
    //管理简单对象
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

@Beanアノテーションは、このメソッドを自動的に挿入する必要があることをファクトリに通知します。

@LoadBalancedは、負荷分散が必要であることを意味します。

次に、コントローラーのようにrestTemplateを挿入して使用します。違いは、サービス名を直接使用してアクセスできることです。

文字列forObject = 

restTemplate.getForObject( "http:// EUREKA-SERVICE / Hello / World?s =" + s、String.class);

 テストを開始します。

1.サーバー起動クラスを実行します。

 2.servicesupportのスタートアップクラスを実行します。

 3.serviceconsumeのスタートアップクラスを実行します。

 ブラウザアクセス:

 8072はサービスコンシューマーのポートです

 アクセス方法の分析:

  • サービスコンシューマー@RequestMappingで指定されたパスとコンシューマーのポートにアクセスして、コンシューマーのコントローラーにアクセスします

  • コントローラは、サービス名に従ってサーバーからサービスリストを取得します。サービスリストを取得した後、ランダムパターンに従って負荷分散を行い、サービスサポートにアクセスするサービスアドレスを選択します。

 

2.5Eurekaサーバーの高可用性構成

下の図をクリックして構成します

次に、01、02、03の3つの仮想マシンパラメータを設定します

01:8699

 02:8698

 03:8697 

 次に、[OK]をクリックして保存すると、さらに3つのスタートアップアイテムが表示されます

 次に、登録されているポート番号を個別に変更します。defaultZoneはそれぞれ3つの起動項目を開始します

サーバーのyml構成を開き、ポート番号構成の最初の2行を削除します(図にエラーがあります。インスタンスとホスト名の2行を削除してください)

 ymlを構成した後、[開始]をクリックします 

 同様に、ポート番号を8699と8697に再度変更した後、起動項目を02に変更して起動します(図に誤りがありますので、インスタンスとホスト名の2行を削除してください)。

 同様に、ymlポートを8699および8698に変更した後、起動項目を03に変更してから開始します(図にエラーがあります。インスタンスとホスト名の行を削除してください) 

 開始後、それぞれ01、02、03の3つのポートにアクセスすると、それらを表示してアクセスできます。

 次のようにサービスプロバイダーのyml構成を開き、ポート番号を3つのうちの1つに変更します。

 サービスプロバイダーを開始した後、01、02、03の3つに再度アクセスすると、

重要:サービスプロバイダーが1つのポート番号8699のみを登録していても、他の2つのポート番号はサービスプロバイダー8701の存在を検出できます。以下に示すように:

 次に、サービス登録者のポート番号をサービスコンシューマーに追加します。これにより、サーバーがハングアップしたときに、他のサーバーもサービスリストを取得できるようになります。

 次のサービスコンシューマーにアクセスすると、コンシューマーを介してサーバーサービスリストを呼び出し、サービスにアクセスできることがわかります。

 サーバーの2つのコピーをシャットダウンし、serviceconsumeを再起動してから、にアクセスします。キャッシュをクリアし、consum内のサービスのリストをクリアするには、serviceconsumeを再起動する必要があります。

 上の図は、2つのサーバーが閉じていてもアクセスできることを示しています。下の図に示すように、サービスリストはサーバーから取得されており、サービスを取得する必要がないことがわかります。後でリストします。

 しかし、すべてのサーバーをシャットダウンすると。サービスリストがキャッシュされているため、アクセスは引き続き問題ありません

 しかし、serviceconsumeを再起動しましょう。それは再び機能しません。

要約すると、springcloudでのサーバーの高可用性構成が完了しました

おすすめ

転載: blog.csdn.net/baidu_39322753/article/details/110237488