Spring Cloud (第 1 章~第 4 章): 授業前の説明、理論的な導入、ブートおよびクラウドのバージョンの選択、コンポーネントの置き換え、マイクロサービス アーキテクチャのコーディング構築 (依存関係の短縮バージョン番号、単体テストのスキップ、サービス ウィンドウ、ホット デプロイメント、パッケージ化プロトコル、エンジニアリング)リファクタリング)

0. 授業前の注意事項

0.1 コース内容

SpringCloud + SpringCloud アリババ

0.2 技術的要件

java8+maven+git、github+Nginx+RabbitMQ+SpringBoot2.0

0.3 コース概要

  • ゼロの基礎:第 1 章~第 4 章
  • 初級:5章~9章
  • 中級:第10章~第16章
  • 上級:第17章~第21章
    ここに画像の説明を挿入します

1. マイクロサービスアーキテクチャのゼロベース理論入門(初心者必読)

1.1 概要

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

1.2 理論的紹介

1.2.1 マイクロサービスアーキテクチャの概要

1) マイクロサービスとは

マイクロサービス アーキテクチャは、単一のアプリケーションを一連の小さなサービスに分割することを推奨するアーキテクチャ パターンであり、サービスは相互に調整および連携して、ユーザーに最終的な価値を提供します各サービスは独自の独立したプロセスで実行され、サービスは軽量の通信メカニズムを使用して相互に連携します (通常は HTP プロトコルに基づく RESTful API)。各サービスは独自のビジネスを中心に構築されており、運用環境や運用に似た環境などに個別にデプロイできます。また、統一的かつ集中的なサービス管理メカニズムは可能な限り避けるべきであり、特定のサービスについては、コンテキストに基づいて適切な言語とツールを選択して構築する必要があります。

2) キーワード 01: 1995 年以降のデジタルライフ - 実装次元

  • 次の製品シリーズは、異なるブランドから提供されることも、Huawei などのすべての製品が 1 つのブランドから提供されることもあります。マイクロサービスも同様で、すべてのソリューションを同じメーカーで提供すると互換性が高くなります。
    ここに画像の説明を挿入します

3) キーワード 02: 分散マイクロサービス アーキテクチャの実装次元

  • どの寸法が満たされていますか?
  • これらの次元をサポートする特定のテクノロジー???
    ここに画像の説明を挿入します

4) サービス呼び出し関係

  • サービス プロバイダー: 他のマイクロサービスが呼び出すためのインターフェイスを公開します。
  • サービスコンシューマ: 他のマイクロサービスによって提供されるインターフェイスを呼び出します。
  • プロバイダーとコンシューマーの役割は実際には相対的です
  • 一个服务可以同时是服务提供者和服务消费者
    • 例: A が B に電話し、B が C に電話します。この場合、B は A に対して相対的なサービス プロバイダーであり、B は C に対して相対的なサービス コンシューマです。

1.2.2 Spring Cloud の概要。

  • それは何ですか?
    SpringCloud = 分散マイクロサービス アーキテクチャのワンストップ ソリューションであり、さまざまなマイクロサービス アーキテクチャ実装テクノロジの集合体であり、一般にマイクロサービス ファミリ バケットとして知られています。

  • Spring Cloud コレクションにはいくつのテクノロジーが含まれていると思いますか?
    ここに画像の説明を挿入します

  • SpringCloud はマイクロサービス開発の主流のテクノロジー スタックとなっており、国内の開発者コミュニティで非常に人気があります。

  • 例: 2018 年の JD.com プロモーション フェスティバルのシステム アーキテクチャ:
    ここに画像の説明を挿入します

  • 例: Alibaba のシステムの 1 つのアーキテクチャ:
    ここに画像の説明を挿入します

1.2.3 Spring Cloud テクノロジースタック

  • Spring Cloud テクノロジー スタックには 20 以上のテクノロジーが含まれています。もちろん、すべてを使用することはできません。一部のテクノロジーはあまり優れていないため、ここでは、最も主流で一般的でよく使用され、実践されているものの一部のみを学びます大手メーカーの技術を採用。
    ここに画像の説明を挿入します

  • 現在マイクロサービス アーキテクチャで使用されている一般的なテクノロジ:
    ここに画像の説明を挿入します

2. ブートおよびクラウドのバージョンの選択

2.1 概要

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

2.2 この春の雲は 2 つの部分に分かれています

  • 前の記事: SpringBoot2.X 版と SpringCloud H 版
  • 次の記事: SpringCloud アリババ

2.3 Springboot バージョンの選択

  • Git ソース コード アドレス: https://github.com/spring-projects/spring-boot/releases/(このビデオで示されている最新のプレリリース バージョンは v2.3.0.M2 です)
    ここに画像の説明を挿入します

  • SpringBoot2.0 の新機能:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-Notes

    • 上記の公式 Web サイトを通じて、Boot 関係者がバージョン 2.X 以降にアップグレードすることを強く推奨していることがわかりました (2020.2 - このビデオ)
  • SpringBoot3.0 の新機能:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes

    • 上記の公式 Web サイトを通じて、Boot 担当者がバージョン 3.X 以降 (2023.8-現在) にアップグレードすることを強く推奨していることがわかりました。
      ここに画像の説明を挿入します
  • 公式サイト:springbootでBootバージョンを確認してください(2023.8.17現在)
    ここに画像の説明を挿入します

2.4 Springcloud バージョンの選択

  • git ソースコードのアドレス:https://github.com/spring-projects/spring-cloud
    ここに画像の説明を挿入します

  • 公式ウェブサイト:https://spring.io/projects/spring-cloud

  • 公式ウェブサイトでクラウドバージョンを確認してください。springcloud(截至2023.8.17)
    ここに画像の説明を挿入します

2.5 Springcloud と Springboot 間の依存関係を表示する方法

  • https://spring.io/projects/spring-cloud#overview
    ここに画像の説明を挿入します
  • 頼る
  • より詳細なバージョン対応閲覧方法
    • https://start.spring.io/actuator/info
    • JSON文字列の戻り結果を表示する
      ここに画像の説明を挿入します

2.6 SpringCloud 第 2 四半期最終バージョン (2020.2.15 時点)

このビデオで使用されているソフトウェアのバージョン:

  • クラウド:ホクストン.SR1
  • ブート: 2.2.2.RELEASE
  • クラウドアリババ:2.1.0.RELEASE
  • Java: Java8
  • Maven: 3.5 以降
  • MySQL: 5.7 以降

余談: ブート バージョンは 2.2.4 で最新ですが、2.2.2 を選択する理由は何ですか?

  • ブートのみを使用する場合は、最新バージョンを直接使用できますが、ブートとクラウドを同時に使用する場合は、ブートのバージョンを決定するクラウドに注意する必要があります。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します

3. クラウド各種コンポーネントの停止・アップグレード・リプレースについて

3.1 概要

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

3.2 アップデート停止による「アップグレードの悲劇」

  • 更新を停止し、非アクティブ化しないでください
    • 受動的にバグを修正する: 小さなバグなど誰も気にしません
    • マージリクエストは受け付けられなくなりました
    • もう新しいリリースはありません
  • 詳細項目
    • 前に
      ここに画像の説明を挿入します

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

      • サービス登録センター: Eureka (もともと Spring Cloud にネイティブで、更新されても非アクティブ化されません) -----》ZooKeeper、Consul、Nacos (現在)
      • サービスコール:Ribbon(旧クラウド製品は継続使用中) ----》LoadBalancer(廃止予定のクラウド新製品を開始)
      • サービスコール2:Feign----》OpenFeign
      • サービスのダウングレード: Hystrix----》resilience4j (海外で多く使用されています)、sentienl (アリババのもの、国内で多く使用されています)
      • サービスネットワーク:Zuul----》Zuul2(未公開)、ゲートウェイ(Spring提供)
      • サービス構成:Config----》Nacos(アリババ)
      • サービスバス:バス----》Nacos(アリババ)

3.3 参考資料は公式サイトをご覧ください

  • 春の雲

    • https://cloud.spring.io/spring-cloud-static/Hoxton.SR1/reference/htmlsingle/
      ここに画像の説明を挿入します

    • Spring Cloud の中国語ドキュメント:https://www.bookstack.cn/read/spring-cloud-docs/docs-index.md
      ここに画像の説明を挿入します

  • スプリングブーツ

    • https://docs.spring.io/spring-boot/docs/2.2.2.RELEASE/reference/htmlsingle/
      ここに画像の説明を挿入します
  • 上記のバージョンは最新バージョンではないことに注意してください。

4. マイクロサービスアーキテクチャのコーディングと構築

4.1 概要

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

4.2 親プロジェクトをビルドする

4.2.1 マイクロサービスクラウド全体集計親プロジェクト プロジェクト

注: IDEA にはワークスペースの概念がないため、新しいプロジェクト ワークスペースを作成することはプロジェクトを作成することを意味します。

  • 作成: 親プロジェクト名 (cloud2020)、パッケージ名 (com.atguigu.springcloud)、Maven モードで作成
    ここに画像の説明を挿入します

  • Maven の構成: 新しいプロジェクトを作成するたびに、Maven を再構成する必要があります。アイデアの他の構成は 1 回だけ構成する必要があります。
    ここに画像の説明を挿入します

  • エンコーディングを設定する
    ここに画像の説明を挿入します

  • 注釈が有効になり、アクティブになります
    ここに画像の説明を挿入します

  • Java コンパイル済みバージョン 17 を選択します
    ここに画像の説明を挿入します

4.2.2 親プロジェクトの pom ファイル

例証します:

  • 今度は先生のバージョンに従って勉強します。
  • 親プロジェクトの src ディレクトリは役に立たないので、削除しても問題ありません。
    ここに画像の説明を挿入します
<?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.atguigu.springcloud</groupId>
    <artifactId>cloud2020</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--表示此项目是个父工程-->
    <packaging>pom</packaging>

    <!-- 统一管理jar包版本 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17/</maven.compiler.target>
        <junit.version>4.12</junit.version>
        <log4j.version>1.2.17</log4j.version>
        <lombok.version>1.16.18</lombok.version>
        <mysql.version>5.1.47</mysql.version>
        <!--德鲁伊的版本号-->
        <druid.version>1.1.16</druid.version>
        <!--mybatis和spring.boot整合的版本号-->
        <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
    </properties>

    <!--子模块继承之后,提供作用:锁定版本+子module不用写groupId和version-->
    <dependencyManagement>
        <!-- 下面三个基本是微服务架构的标配 -->
        <dependencies>
            <!--spring boot 2.2.2-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud Hoxton.SR1-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud alibaba-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--mysql-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
                <scope>runtime</scope>
            </dependency>
            <!-- druid-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>${druid.version}</version>
            </dependency>

            <!--mybatis-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.spring.boot.version}</version>
            </dependency>
            <!--junit-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
            <!--log4j-->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
        </dependencies>

    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.12.RELEASE</version>
                <configuration>
                    <fork>true</fork>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

4.2.3 pom ファイルの詳細を検討する

1) Maven での依存関係管理と依存関係

  • Maven は dependencyManagement 要素を使用して、依存関係のバージョン番号を管理する方法を提供します。
  • 通常、 dependencyManagement 要素は、組織またはプロジェクトの最上位の親 POM に表示されます。
  • pom.xml で dependencyManagement 要素を使用すると、バージョン番号を明示的にリストすることなく、すべてのサブプロジェクトが依存関係を参照できるようになりますMaven は、dependencyManagement 要素を持つプロジェクトが見つかるまで親子階層をたどり、その後、dependencyManagement 要素で指定されたバージョン番号を使用します。

:

  • 親プロジェクトの pom.xml
<dependencyManagement>
    <dependencies>
        <dependency>
        <groupId>mysq1</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.2</version>
        </dependency>
        ...
    <dependencies>
</dependencyManagement>

  • サブプロジェクトの pom.xml: mysql-connector を追加するときにバージョン番号を指定する必要はありません
<dependencies>
    <dependency>
    <groupId>mysq1</groupId>
    <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>

これを行う利点は次のとおりです

  • 同じ依存関係を参照するサブプロジェクトが複数ある場合は、使用する各サブプロジェクトでバージョン番号を宣言する必要がなく、別のバージョンにアップグレードまたは切り替えたいときに、最上位のサブプロジェクトのみを更新する必要があります。レベルの親コンテナーと、サブプロジェクトを 1 つずつ変更する必要はありません。
  • さらに、サブプロジェクトに別のバージョンが必要な場合は、独自のバージョンを宣言するだけで済みます。

注意事項:

  • dependencyManagement は依存関係を宣言するだけで、導入は実装しないため、サブプロジェクトは必要な依存関係を表示する必要があります。
  • 依存関係がサブプロジェクトで宣言されていない場合、依存関係は親プロジェクトから継承されません。依存関係がサブプロジェクトに書き込まれ、特定のバージョンが指定されていない場合にのみ、項目は親プロジェクトから継承されます。およびバージョンとスコープ両方とも親 pom から読み取られます。
  • 如果子项目中指定了版本号,那么会使用子项目中指定的jar版本

2) Maven での単体テストをスキップする

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

4.2.4 親プロジェクトをウェアハウスに公開する

  • 親プロジェクトが作成されたら、mvn:install を実行して親プロジェクトをウェアハウスに公開し、サブプロジェクトの継承を容易にします。
    ここに画像の説明を挿入します

4.3 サブプロジェクトの構築: 支払いモジュール

4.3.1 マイクロサービスプロバイダーの支払いモジュール

マイクロサービス プロバイダー支払いモジュール (cloud-provider-payment8001)

ステップ:

  • モジュールが作成され
    ここに画像の説明を挿入します
    たら、親プロジェクトに戻って pom ファイルの変更を確認してください。
    ここに画像の説明を挿入します

  • ポンポンを変更する
    ここに画像の説明を挿入します

<?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">
    <parent>
        <artifactId>cloud2020</artifactId>
        <groupId>com.atguigu.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-provider-payment8001</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <dependencies>
        <!--web场景启动依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--boot指标监控依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <!--子工程写了版本号,就使用子工程的版本号,如果没写版本,找父工程中规定的版本号-->
            <version>1.1.20</version>
        </dependency>
        <!--mysql-connector-java-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--jdbc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!--热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>
  • ymlを書く
    ここに画像の説明を挿入します
#微服务建议一定要写服务端口号和微服务名称
server:
  #端口号
  port: 8001

spring:
  application:
    #微服务名称
    name: cloud-payment-service
  #数据库配置
  datasource:
    #引入的数据库驱动类型
    type: com.alibaba.druid.pool.DruidDataSource
    #mysql5.x的没有cj
    driver-class-name: com.mysql.jdbc.Driver
    #记得先创建数据库
    url: jdbc:mysql://localhost:3306/db2020?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: root

#mybatis配置
mybatis:
  mapper-locations: classpath:mapper/*.xml #mapper.xml文件的位置
  type-aliases-package: com.angenin.springcloud.entities  #所有Entity别名类所在包(所有实体类所在的包)

  • メイン起動クラス: Java パッケージの下にメイン起動クラス com.angenin.springcloud.PaymentMain8001 を作成します。
    ここに画像の説明を挿入します
package com.angenin.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

  • 業種:
    • テーブルSQLの作成
    • エンティティ
    • だお
    • サービス
    • コントローラ

4.3.2 ビジネスクラスの詳細説明

  • テーブル SQL を作成します。まずデータベース db2020 を作成します。
    ここに画像の説明を挿入します
CREATE TABLE `payment`(
	`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
	`serial` VARCHAR(200) DEFAULT '',
	PRIMARY KEY(`id`)
)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

INSERT INTO payment(`serial`)VALUES("张三");

select * from payment

  • entities: springcloud パッケージの下に新しいエンティティ クラス entities.Payment を作成します。
    ここに画像の説明を挿入します
package com.angenin.springcloud.entities;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

//这三个注解是lombok的,除了导入依赖,idea还需要安装插件(具体操作问度娘)
@Data   //set/get方法
@AllArgsConstructor //有参构造器
@NoArgsConstructor  //无参构造器
public class Payment implements Serializable {
    
    
    private long id; //创建表的这个字段用的是BIGINT类型
    private String serial;
}

  • エンティティ: エンティティ パッケージの下に新しい CommonResult (json パッケージ、フロントエンドに渡される) を作成します。
    ここに画像の説明を挿入します
package com.angenin.springcloud.entities;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

//返回给前端的通用json数据串
@Data   //set/get方法
@AllArgsConstructor //全参构造器
@NoArgsConstructor  //无参构造器
public class CommonResult<T> {
    
     //使用泛型比较通用,根据传入的实体类行来进行对应的展现。
    private Integer code;  //状态码
    private String message; //异常提示信息说明
    private T data; //泛型,对应类型的json数据

    //自定义两个参数的构造方法(全参的由注解生成)
    public CommonResult(Integer code, String message){
    
    
        this(code, message, null);
    }
}

  • dao: springcloud パッケージの下に新しい Dao.PaymentDao インターフェイスを作成します
    ここに画像の説明を挿入します
package com.angenin.springcloud.Dao;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

@Mapper  //mybatis提供的
public interface PaymentDao{
    
    
    //增
    int create(Payment payment);

    //改     加上@Param注解,mapper中就可以采用#{}的方式把@Param注解括号内的参数进行引用
    Payment getPaymentById(@Param("id") Long id);

    //这里用增和改进行演示,有兴趣的可以自己加其他的方法

}

  • mapper.xml: リソース ディレクトリの下に新しいマッパー ディレクトリを作成し、新しい PaymentMapper.xml を作成します。
    ここに画像の説明を挿入します
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.angenin.springcloud.Dao.PaymentDao">

    <resultMap id="BaseResultMap" type="com.angenin.springcloud.entities.Payment">
        <id column="id" property="id" jdbcType="BIGINT"/>
        <id column="serial" property="serial" jdbcType="VARCHAR"/>
    </resultMap>


    <!--  增  -->
    <!--  Payment标红了不用管,因为我们已经在yml文件中指定了Payment的位置了  -->
    <insert id="create" parameterType="Payment" useGeneratedKeys="true" keyProperty="id">
        insert into payment(serial)values(#{serial});
    </insert>

    <!--  改  -->
    <!--返回用resultMap,防止命名不规范-->
    <select id="getPaymentById" parameterType="Long" resultMap="BaseResultMap">
        select * from payment where id=#{id};
    </select>
</mapper>

  • service: springcloud パッケージの下に新しい service.PaymentService インターフェイスを作成します。
    ここに画像の説明を挿入します
package com.angenin.springcloud.service;

import com.angenin.springcloud.entities.Payment;
import org.apache.ibatis.annotations.Param;


public interface PaymentService {
    
    

    int create(Payment payment);

    Payment getPaymentById(@Param("id") Long id);
}

  • サービス: サービス パッケージの下に新しい impl.PaymentServiceIpml 実装クラスを作成します。
package com.angenin.springcloud.service.impl;


import com.angenin.springcloud.Dao.PaymentDao;
import com.angenin.springcloud.entities.Payment;
import com.angenin.springcloud.service.PaymentService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class PaymentServiceImpl implements PaymentService {
    
    

    @Resource   //这是java自带的,@Autowired也可以 是spring提供的
    private PaymentDao paymentDao;

    @Override
    public int create(Payment payment) {
    
    
        return paymentDao.create(payment);
    }

    @Override
    public Payment getPaymentById(Long id) {
    
    
        return paymentDao.getPaymentById(id);
    }
}


  • コントローラー: springcloud パッケージの下に新しいコントローラー.PaymentController を作成します。
    ここに画像の説明を挿入します
package com.angenin.springcloud.controller;

import com.angenin.springcloud.entities.CommonResult;
import com.angenin.springcloud.entities.Payment;
import com.angenin.springcloud.service.PaymentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

@RestController
@Slf4j  //日志
public class PaymentController {
    
    

    @Resource
    private PaymentService paymentService;

    //前后端分离,所以不能直接返回对象,数据要先经过CommonResult封装再返回
    @PostMapping("/payment/create")
    public CommonResult create(@RequestBody Payment payment){
    
    
        int result = paymentService.create(payment);
        log.info("******插入的数据为:" + payment);
        log.info("******插入结果:" + result);

        if(result > 0){
    
    
            //插入成功
            return new CommonResult(200, "插入数据库成功", result);
        }else{
    
    
            return new CommonResult(444, "插入数据库失败",null);
        }
    }


    @GetMapping("/payment/get/{id}")
    public CommonResult getPaymentById(@PathVariable("id") Long id){
    
    
        Payment payment = paymentService.getPaymentById(id);
        log.info("******查询结果:" + payment);

        if(payment != null){
    
    
            //查询成功
            return new CommonResult(200, "查询成功", payment);
        }else{
    
    
            return new CommonResult(444, "没有对应记录,查询ID:" + id,null);
        }
    }

}

4.3.3 テスト

  • スタートアッププロジェクト
    ここに画像の説明を挿入します
  • 注: ブラウザは取得のみをサポートし、投稿はサポートしません。
  • get リクエストのテスト: ブラウザ入力http://localhost:8001/payment/get/1、クエリは成功しました。
    ここに画像の説明を挿入します
  • 投稿リクエストのテスト: Postman 入力を使用してhttp://localhost:8001/payment/create投稿リクエストを送信し、データの一部をデータベースに挿入し、そのデータを本文に書き込みます。
    ここに画像の説明を挿入します

4.3.4 ダッシュボード/サービスの実行と実行

  • 実行: プロジェクトの数が比較的少ない場合は、実行ウィンドウを使用してプロジェクトを開始します。
    ここに画像の説明を挿入します

  • ダッシュボードの実行: プロジェクトが多すぎると、アイデアが自動的にこのウィンドウに切り替わって開始されます ( 新版本idea改名为Services)

    • 利点: このウィンドウにより、マルチシリーズ環境のマイクロサービスをより適切に開始できるようになります。
      ここに画像の説明を挿入します
  • 通常、プロジェクトが多くなると自動的にアイデアが切り替わりますが、切り替わらない場合は以下の設定が必要です。

    • アイデアの workspace.xml を変更して、[実行ダッシュボード] ウィンドウをすばやく開きます。
      ここに画像の説明を挿入しますここに画像の説明を挿入します
      ここに画像の説明を挿入します

    • 「Run DashBoard/Services」を開きます (新しいバージョンのアイデアが呼び出されます)。
      ここに画像の説明を挿入します

<component name="RunDashboard">
    <option name="configurationTypes">
      <set>
        <option value="SpringBootApplicationConfigurationType" />
      </set>
    </option>
</component>

  • 学生によっては、アイデアのバージョンが異なるため、シャットダウンして再起動する必要がある場合があります。
    ここに画像の説明を挿入します

4.4 Devtoolsのホットデプロイメント(オプション)

  • コードを変更するたびに手動で再起動する必要はなく、自動的に再起動されます。
  • 開発中に使用され、本番環境は閉じられます

4.4.1 プロジェクトへの開発ツールの追加

  • jar パッケージを追加: サブプロジェクトは以前にインポートされています
    ここに画像の説明を挿入します
        <!--热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

4.4.2 pom.xml へのプラグインの追加

  • pom.xml にプラグインを追加します (親プロジェクトはすでに挿入されています)
    ここに画像の説明を挿入します
    <build>
        <!--你自己的工程名字。这一步写不写都行-->
        <!--<finalName>cloud2020</finalName>-->
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.12.RELEASE</version>
                <configuration>
                    <fork>true</fork>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
        </plugins>
    </build>

4.4.3 自動ビルドの有効化

  • 自動コンパイル オプションを有効にする
    ここに画像の説明を挿入します

4.4.4 の値を更新する

  • ホット登録がオンになっています

  • idea2021.2 より前のバージョン

    • キーの組み合わせ Shift+Ctrl+Alt+/ (Mac システムの場合は、Ctrl をコマンド キーに置き換えます)、レジストリを選択します...
      ここに画像の説明を挿入します
      ここに画像の説明を挿入します
  • idea2021.2以降のバージョン
    ここに画像の説明を挿入します

  • IDEA の再起動: コードを変更した後、自動的に再起動します (コンピューターのパフォーマンスに関連するため、効果は非常に遅くなります)。

  • テスト後、ホット デプロイメントがオフになり、コンピューターのパフォーマンスが低下しました。

4.5 サブプロジェクトの構築: 消費者注文モジュール

4.5.1 マイクロサービスコンシューマ注文モジュールモジュール

マイクロサービスコンシューマー注文モジュール (cloud-consumer-order80)

  • 建クラウド-消費者注文80
    ここに画像の説明を挿入します

  • POMの変更
    ここに画像の説明を挿入します

<?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">
    <parent>
        <artifactId>cloud2020</artifactId>
        <groupId>com.atguigu.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-consumer-order80</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>


  • YML の書き込み: リソース ディレクトリに新しい application.yml ファイルを作成します。
    ここに画像の説明を挿入します
#访问一个网站时,默认是80端口,给用户80端口,用户就可以不用加端口直接访问页面
server:
  port: 80

  • メインブート
    ここに画像の説明を挿入します
package com.angenin.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

  • ビジネスクラス

4.5.2 ビジネスクラスの詳細説明

  • 質問: ビジネス クラスは、クライアント側のデータ層、ビジネス層、および制御層も記述する必要がありますか? ? ?
  • 回答: いいえ、必要なのは制御層とエンティティ クラスだけです。
  • 説明: 現在のシナリオでは、コンシューマー 80 が 8081 マイクロサービス プロバイダーを呼び出します。実際の作業は 8081 マイクロサービス プロバイダーであるため、コンシューマー 80 にはサービス プロバイダーを呼び出すための制御層だけが必要です。

1) エンティティクラスの作成

  • 前の文字モジュールのサブプロジェクトのエンティティ クラスと同じです。
    ここに画像の説明を挿入します
package com.angenin.springcloud.entities;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

//返回给前端的通用json数据串
@Data   //set/get方法
@AllArgsConstructor //全参构造器
@NoArgsConstructor  //无参构造器
public class CommonResult<T> {
    
     //使用泛型比较通用,根据传入的实体类行来进行对应的展现。
    private Integer code;  //状态码
    private String message; //异常提示信息说明
    private T data; //泛型,对应类型的json数据

    //自定义两个参数的构造方法(全参的由注解生成)
    public CommonResult(Integer code, String message){
    
    
        this(code, message, null);
    }
}


-----------------------------------------------

package com.angenin.springcloud.entities;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

//这三个注解是lombok的,除了导入依赖,idea还需要安装插件(具体操作问度娘)
@Data   //set/get方法
@AllArgsConstructor //有参构造器
@NoArgsConstructor  //无参构造器
public class Payment implements Serializable {
    
    
    private long id; //创建表的这个字段用的是BIGINT类型
    private String serial;
}

2) RestTemplate の概要

  • シナリオ: ここで、2 つのサービス間で呼び出しを行う必要があります。ポート 80 は 8001 を呼び出します。元の Web 段階では、2 つのサービス間のサービス通信には httpClient プロトコルが使用されることがわかりました。ここでは、カプセル化されたrestTemplate を使用します。これにより、一度カプセル化されます。httpClient。注文マイクロサービスと支払いマイクロサービス間の水平呼び出しを実現できます。

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

  • それは何ですか?

    • RestTemplate は、リモート HTTP サービスにアクセスするためのさまざまな便利なメソッドを提供します。Restful サービスにアクセスするためのシンプルで便利なテンプレート クラスです。RestサービスにアクセスするためにSpring によって提供されます客户端模板工具集
  • 公式サイトと使い方:

    • 公式ウェブサイトのアドレス: (spring5 を例に挙げます)
      https://docs.spring.io/spring-framework/docs/5.2.2.RELEASE/javadoc-api/org/springframework/web/client/RestTemplate.html
    • 使用法:
      restTemplate を使用してRESTful インターフェイスにアクセスするのは、非常に単純かつ粗雑です。(url, requestMap, ResponseBean.class) これら 3 つのパラメータはそれぞれ、REST リクエストのアドレス、リクエストのパラメータ、HTTP レスポンスの変換先のオブジェクトの種類を表します。
      ここに画像の説明を挿入します

3) config 構成クラス

注: Springboot はコンテナ クラスであるため、RestTemplate オブジェクトを Springboot コンテナに注入する必要があります。
ここに画像の説明を挿入します

package com.angenin.springcloud.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ApplicationContextConfig {
    
    

    //往容器中添加一个RestTemplate
    //RestTemplate提供了多种便捷访问远程http访问的方法
    @Bean
    public RestTemplate restTemplate(){
    
    
        return new RestTemplate();
    }

}

4)コントローラー

  • springcloud パッケージの下に新しいcontroller.OrderControllerを作成します。
    ここに画像の説明を挿入します
package com.angenin.springcloud.controller;

import com.angenin.springcloud.entities.CommonResult;
import com.angenin.springcloud.entities.Payment;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

@RestController
@Slf4j
public class OrderController {
    
    

    public static final String PAYMENT_URL = "http://localhost:8001";

    @Resource
    private RestTemplate restTemplate;

    //因为浏览器只支持get请求,为了方便这里就用get
    @GetMapping("/consumer/payment/create")
    public CommonResult<Payment> create(Payment payment){
    
    
        log.info("********插入的数据:" + payment);
        //postForObject分别有三个参数:请求地址,请求参数,返回的对象类型----写操作
        return restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, CommonResult.class);
    }

    @GetMapping("/consumer/payment/get/{id}")
    public CommonResult<Payment> getPayment(@PathVariable("id") Long id){
    
    
        log.info("********查询的id:" + id);
        //getForObject两个参数:请求地址,返回的对象类型----读操作
        return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
    }
}


4.5.3 テスト

  • 消費者と生産者を始める
  • http://localhost/consumer/payment/get/1データをブラウザに入力すると、データのクエリが正常に実行されました。(80は省略可能----テストクエリ)
    ここに画像の説明を挿入します
  • http://localhost/consumer/payment/create?serial=王五データをブラウザに入力すると、データのクエリが正常に実行されました。(データ挿入テスト)
    ここに画像の説明を挿入します
    • 注: @RequestBody アノテーションを持つサブプロジェクト支払いモジュールのみが正常に挿入できます。
    • @RequestBody は主に、フロントエンドからバックエンドに渡される JSON 文字列内のデータ (リクエスト本文内のデータ) を受信するために使用されます。パラメーターを渡すために最も一般的に使用されるリクエスト本文は間違いなく POST リクエストです。そのため、@RequestBody を使用する場合は、データを受信するには、通常は POST を使用して送信されます。バックエンドの同じ受信メソッドでは、@RequestBody と @RequestParam() を同時に使用できます。@RequestBody は 1 つまでですが、複数の @RequestParam() を使用できます。
      ここに画像の説明を挿入します
  • 実行ウィンドウが実行から実行ダッシュボードに自動的に切り替わらない場合は、設定を実行する必要があります。詳細については、 4.3.4を参照してください。

4.6 プロジェクトの再構築

  • 問題を観察します。システム内に重複した部分があるため、リファクタリングします。
    ここに画像の説明を挿入します
  • 解決策: 重複したコードや類似のコードをパブリック プロジェクトに抽出し、誰もが展開して使用できるようにします。
    • このプロジェクトは、重複したコードを送信するだけでなく、サービス インターフェイス、サードパーティ インターフェイス、およびツール クラスをこのプロジェクトに統合することもできます。

4.6.1 パブリック プロジェクトの作成:cloud-api-commons

  • Maven を使用してビルドすることも、ブート プラグイン Spring Initializr を使用してビルドすることもできます。
    • Maven ビルド: インターネット接続は必要ありません。メインのスタートアップ クラス、構成クラスを手動で追加し、jar パッケージを手動で追加する必要があります。
    • Plug-in Spring Initializr の構築: インターネット接続が必要で、メインのスタートアップ クラス、構成クラス、基本的な jar パッケージ、テスト クラスが自動的に作成されます。もちろん、追加の jar パッケージも手動で追加する必要があります。
    • 静的ディレクトリは、Web 依存関係を追加した後に生成されます。

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

4.6.2 pom ファイルの変更

  • Hutool は単なる JAVA ツールキットであり、コードを簡素化し、車輪の再発明を避けるのに役立ちます。すべてのプログラマーは、自分の作業の蓄積を表す独自のツールキットを持っています。Hutool は、全員が蓄積したツールを収集するだけです。Hutool は、ほとんどの企業向けのツールをほぼカバーしています。仕事。
    ここに画像の説明を挿入します
<?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">
    <parent>
        <artifactId>cloud2020</artifactId>
        <groupId>com.atguigu.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-api-commons</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--   hutool是个功能强大的JAVA工具包,官网:https://hutool.cn/    -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.1.0</version>
        </dependency>
    </dependencies>


</project>

4.6.3 エンティティクラスの変更

  • 2 つの共通エンティティ クラスをこのパブリック プロジェクトにコピーします。
    ここに画像の説明を挿入します
package com.angenin.springcloud.entities;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

//返回给前端的通用json数据串
@Data   //set/get方法
@AllArgsConstructor //全参构造器
@NoArgsConstructor  //无参构造器
public class CommonResult<T> {
    
     //使用泛型比较通用,根据传入的实体类行来进行对应的展现。
    private Integer code;  //状态码
    private String message; //异常提示信息说明
    private T data; //泛型,对应类型的json数据

    //自定义两个参数的构造方法(全参的由注解生成)
    public CommonResult(Integer code, String message){
    
    
        this(code, message, null);
    }
}

************************************************
package com.angenin.springcloud.entities;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

//这三个注解是lombok的,除了导入依赖,idea还需要安装插件(具体操作问度娘)
@Data   //set/get方法
@AllArgsConstructor //有参构造器
@NoArgsConstructor  //无参构造器
public class Payment implements Serializable {
    
    
    private long id; //创建表的这个字段用的是BIGINT类型
    private String serial;
}


4.6.4 maven命令clean install

  • このパブリック プロジェクトをパッケージ化し、ローカルのパブリック ウェアハウスに公開して、他の 2 つのプロジェクトから呼び出せるようにします。
    ここに画像の説明を挿入します

4.6.5 注文 80 と支払い 8001 を個別に変更する

  • 元のエンティティ フォルダーを削除します
    ここに画像の説明を挿入します
  • POM コンテンツをそれぞれ貼り付けます
    ここに画像の説明を挿入します
        <!-- 引用自己定义的api通用包,可以使用Payment支付Entity -->
        <dependency>
            <groupId>com.angenin.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>

4.6.6 テスト

  • プロデューサーコンシューマーを開始する
  • 個別にテスト: クエリ挿入
    http://localhost/consumer/payment/get/1
    http://localhost/consumer/payment/create?serial=赵六
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します

4.6.7 現在のプロジェクト図面

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

おすすめ

転載: blog.csdn.net/aa35434/article/details/124853339