SpringCloudAlibaba マイクロサービス実践シリーズ (1) Nacos サービス登録の発見

SpringCloudAlibaba マイクロサービス実践シリーズ (1) Nacos サービス登録の発見

実際の戦闘の前に背景を理解してください。

モノリシック アーキテクチャ、SOA、マイクロサービス

モノリシックアーキテクチャ:近年の技術の急速な発展により、さまざまなサービスがネットワークに参入しています。単一のアーキテクチャを公開する場合、war または jar パッケージとして公開するだけで済みますが、ビジネス量が急増したり、Web サイトのトラフィックが増加したりすると、必然的に致命的な欠陥が明らかになります。

SOA: Service Oriented Architecture サービス指向アーキテクチャ。コードの再利用性とスケーラビリティの向上、結合の削減などを目的としています。たとえば、テイクアウトのプロセスでは、食品の配達の配布もサービスであり、SMS 通知もサービスです。これらのサービスは独立して展開され、ネットワーク (HTTP など) を通じて相互に呼び出して、完全なサービス システムを形成します。

マイクロサービス: マイクロサービスは、単一の機能を備えた複数の小さなサービスで構成されます。サービスはビジネスに応じて分割できます。これらのサービスは独立してデプロイされます。異なるサービスは異なるテクノロジ (異なる言語やデータベースなど) を使用できます。サービスの軽量プロトコルHTTP は対話形式でデータを送信するために使用されるため、よりきめの細かい SOA アーキテクチャとみなすことができます。

マイクロサービスの長所と短所

アドバンテージ:

  • 代码复杂度低: 細分化された事業部門によれば、事業機能は明確かつ明確であり、規模は小さく、理解と維持が容易です。
  • テクノロジーの選択に制限はありません。単一のサービスを、自社のビジネスに応じてさまざまな言語やテクノロジースタックで実装できます。
  • 独立部署: 導入による影響は小さい
  • サービスのスケーラビリティ: 一部のサービスの負荷容量が大きい場合は、さらにいくつかのノード負荷をデプロイでき、負荷容量が小さい場合は、いくつかのノードを削減してサーバー リソースを節約できます。
  • 错误隔离:複数のサービスのうち、1つのサービスのダウンタイムがシステム全体の動作に影響を与えることはありません。
  • データベースの分岐が簡単になります: 異なるサービスが異なるデータベースに接続します

欠点:

  • アーキテクチャ システムは複雑です。単純なサービス コールではなく、ネットワークの遅延や障害の影響を十分に考慮する必要があり、必要に応じてメッセージ ミドルウェアが必要になる場合があります。
  • サービスの依存関係: たとえば、サービス A が B を呼び出し、次に B が C を呼び出します。C サービスが変更されると、B と A の両方が変更を加える必要があります。
  • 数据一致性问题:典型的分布式事务的问题
  • インターフェイスのトラブルシューティングが難しい: 複数のサービスを使用する場合、それらのログを同時に表示する必要がある
  • 導入と運用および保守: 複数のサービスの健全性状態の確認と監視、迅速な導入、サービス負荷に基づくサービスの動的なスケーリングは、決して小さな課題ではありません。

SpringCloudテクノロジースタック

マイクロサービスをより適切に管理するために、SpringCloud テクノロジーが誕生しました。一般的に使用されるテクノロジー スタックの実装:

テクノロジースタック テクノロジースタックの実装
サービスの登録と検出 エウレカ、動物園飼育員、執政官、ナコス
サーキットブレーカー、ダウングレード、電流制限 ヒストリックス、センチネル
サービスコール リボン、ロードバランサー、フェイン、オープンフェイン、ダボ
構成 コンフィグ、動物園飼育員、領事、ナコス
ゲートウェイ ズール、ゲートウェイ
メッセージバス バス、ナコス

上記の技術実装ソリューションには、Spring Cloud Netflix と Spring Cloud Alibaba が含まれます。このシリーズでは Alibaba のみを使用します。

次のテクノロジースタック:

  • Nacos: 構成とサービス登録の検出を行う
  • RocketMQ: 信頼性の高いメッセージの発行とサブスクリプションを提供する、Alibaba の分散メッセージング ミドルウェア
  • Sentinel: サービス電流制限、ダウングレード、サーキット ブレーカー機能を提供します。
  • Seata: 分散トランザクションの問題を解決する (データの一貫性を確保する)

実戦開始

環境

実際の戦闘の前に、まず開発環境を確認します。

  • java8
  • メイブン
  • アイデアツール
  • mysql 5.7以降

注: IDEA が Maven のバージョンと一致しない場合、エラーが報告されます。Maven プロジェクトをインポートできません。バージョンを自分で調整してください。

SpringBoot の入門

プロジェクトを作成する際にまず気になるのがSpring CloudとAlibabaのバージョンに対応しているかで、Spring Bootとクラウドのバージョンが対応しているか確認してください。

ここに画像の説明を挿入します

Spring 公式 Web サイトまたは Alibaba Cloud の Web ページでプロジェクトを作成できます。まずプロジェクトを作成し、IDEA にインポートします。

ここに画像の説明を挿入します

导入后将SpringBoot版本改为2.6.11的即可

次に、サブモジュール (サーバーとコンシューマー) を作成し、親プロジェクトでバージョンの依存関係管理を実行します。

<properties>
   <java.version>8</java.version>
   <boot.version>2.6.11</boot.version>
   <cloud.version>2021.0.4</cloud.version>
   <cloud.alibaba.version>2021.0.4.0</cloud.alibaba.version>
</properties>

<dependencyManagement>
    <dependencies>
        <!--springboot依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--cloud的依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--cloud.alibaba依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${cloud.alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<build>
   <plugins>
      <!--指定Maven的插件,和编译的jdk版本,若不指定maven3默认使用jdk1.5-->
      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
         <version>3.7.0</version>
         <configuration>
            <source>1.8</source>   <!--源代码使用的jdk版本-->
            <target>1.8</target>   <!--编译后生成的class文件的版本-->
            <encoding>UTF-8</encoding> <!--字符编码集-->
         </configuration>
      </plugin>
   </plugins>
</build>

nacos のインストールと構成

注意:nacos需要依赖jdk环境,必须是1.8及以上的版本

nacos ダウンロードページ: https://github.com/alibaba/nacos/releases

ここに画像の説明を挿入します

対応するバージョンを確認してダウンロードしてください。

ダウンロードが完了すると、cmd コマンド ウィンドウが起動します。

注: バージョン 2.2.1 以降をダウンロードすると、nacos はデフォルトのキーを空に設定するため、手動で追加して起動する必要があります。

nacos 設定ファイル application.properties 内

nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789

ナコスを始める

startup.cmd -m standalone

起動が完了したら、nacos URL にログインして http://localhost:8848/nacos を確認します。デフォルトのユーザー名とパスワードは nacos です。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-8JFqOEqA-1690075432821)(../imgs1/5.png)]

nacos のシンプルな統合

provider8001、 、provicer-8002およびという 3 つのサブプロジェクトを作成し、consumer9001nacos に登録し、リボンを介してリモート呼び出しを実装します。

プロジェクト構成は図の通りで、3つのプロジェクトは以下の通りです。引入健康监控和nacos的服务注册发现

ここに画像の説明を挿入します

コンシューマープロジェクトを例にした構成ファイル

server:
  port: 8001
spring:
  application:
    name: provider # 应用名

  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # nacos服务地址

伝説:

ここに画像の説明を挿入します

起動クラスと注釈:

@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(ProviderApplication.class, args);
    }
}

3 つのプロジェクトを開始して、nacos サービス ページの変更を確認します。
ここに画像の説明を挿入します

サービスは登録されており、プロバイダーのインスタンスが 2 つあります。問題ありません~

RestTemplate+Ribbon を使用して単純なリモート呼び出しを実装する

サービスプロバイダーがインターフェイスを提供します(両方のプロバイダーを記述します)

@RestController // @RestController注解是@Controller+@ResponseBody
public class TestController {
    
    
    @Value("${server.port}")
    private String port; // 获取配置文件中写的程序端口号
    @RequestMapping("/test") // 标记是该方法的请求
    public String test() {
    
    
        return "hello world test " + port;  // 返回值是一个字符串,因为用了@RestController所以不必额外加@ResponseBody了
    }
}

コンシューマーもロードバランサーの依存関係を導入する必要があり、上位バージョンでは手動で導入する必要があります。

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

サービス コンシューマは JavaConfig を使用して構成クラスを完成します。コードは次のとおりです。

@Configuration
public class GenericConfiguration {
    
     // 常规配置类
    @LoadBalanced // 标注此注解后,RestTemplate就具有了客户端负载均衡能力
    @Bean
    public RestTemplate restTemplate(){
    
     // 创建RestTemplate,并交个Spring容器管理
        return new RestTemplate();
    }
}

消費者通話インターフェース

@RestController
public class TestController {
    
    

    private final String SERVER_URL = "http://provider"; // 这里的服务地址填写注册到Nacos的应用名称
    @Resource
    private RestTemplate restTemplate;
    @RequestMapping("/test")  // 标记是该方法的请求
    public String test() {
    
    
        return restTemplate.getForObject(SERVER_URL + "/test", String.class);//调用提供者/test接口
    }

}

プロジェクトのテスト呼び出しの実行を開始します。

curl localhost:9001/test

ここに画像の説明を挿入します

リモート呼び出しと単純なロード実装の効果を確認できます。

おすすめ

転載: blog.csdn.net/weixin_45248492/article/details/131876248