マイクロサービストピック06-クラウドネイティブアプリケーション

序文

前の章では、WebFluxの原理とアプリケーションについて説明しましたこのセクションでは、マイクロサービストピックの内容、合計16のセクションを引き続き共有します。

このセクションの要点は次のとおりです。

  • ブートストラップアプリケーションコンテキスト:Spring Cloudの新しく導入されたブートストラップアプリケーションコンテキストを紹介し、Spring Frameworkアプリケーションコンテキストとの接続を説明し、SpringBootアプリケーションにおけるブートストラップアプリケーションコンテキストの階層関係をさらに理解します。
  • エンドポイントの紹介:コンテキストの再起動:次のような新たに導入されたに基づいて導入エンドポイント(エンドポイント)春の雲春ブーツ、/restartライフサイクル:/pause/resumeなど

SpringCloudの機能

Spring Cloudは、一般的なユースケースにすぐに使える優れたエクスペリエンスと、他のユースケースをカバーする拡張メカニズムを提供することに取り組んでいます。

  • 分散/バージョン管理された構成
  • サービスの登録と発見
  • ルーティング
  • サービス間の呼び出し
  • 負荷分散
  • ブレーカ
  • 分散メッセージング

クラウドネイティブとは何ですか?

SpringCloud(Greenwich.SR5)クラウドネイティブ公式ドキュメント

Cloud Nativeは、継続的デリバリーと価値主導型開発におけるベストプラクティスの容易な採用を促進するアプリケーション開発のスタイルです。関連する分野は、12要素のアプリケーションの構築であり、開発慣行は、たとえば、宣言型プログラミング、管理、および監視の使用を通じて、配信および運用の目標と整合しています。Spring Cloudは、これらの開発スタイルをさまざまな特定の方法で促進します。出発点は、分散システムのすべてのコンポーネントが簡単にアクセスする必要がある一連の機能です。

SpringCloudが構築されているSpringBootは、これらの機能の多くをカバーしています。Spring Cloudは、SpringCloudコンテキストとSpringCloudCommonsの2つのライブラリとしてより多くの機能を提供します。Spring Cloud Contextは、ApplicationContext Spring Cloudアプリケーション用のユーティリティと特別なサービス(ブートコンテキスト、暗号化、更新スコープ、環境エンドポイント)を提供します。Spring Cloud Commonsは、さまざまなSpring Cloud実装(Spring CloudNetflixやSpringCloud Consulなど)で使用される抽象クラスと共通クラスのセットです。

クラウドネイティブとは何ですか?開発の方向性は?誰かがついにそれを手に入れました!

Springアプリケーションのコンテキスト- ApplicationContext

あなたがうまくやりたいのなら、あなたは最初にあなたの道具を研ぐ必要があります!SpringCloudをよく学ぶにはSpringBootの基礎が必要であり、SpringBootをよく学ぶにはSpringFrameworkを深く理解する必要があります。Springアプリケーションのコンテキストは、Springフレームワーク全体の非常に重要な部分です。

前の章ApplicationContextSpringアプリケーションのコンテキストについて何度も言及しましたComponent。また、このシリーズの最初のセクションで「派生」という注釈についても言及しましたでは、接続は何ですか?Springアプリケーションのコンテキストのレベルをどのように理解する必要がありますか?

春のイベント

春のイベントの主要なクラスを確認します。

イベントクラス:ApplicationEvent

イベントリスナー: ApplicationListener

イベントブロードキャスター:ApplicationEventMulticasterその唯一の実装クラスSimpleApplicationEventMulticaster

イベント送信者:ApplicationEventPublisher

コンテキストレベルを理解する

Q:クラス階層:BeanFactoryApplicationContext

A:ApplicationContextこのクラスを見るとListableBeanFactoryうまく拡張されていますHierarchicalBeanFactory

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
		MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
    
    
		...
}

構造の観点からApplicationContextBeanFactory実装関連付けられています。ApplicationContext抽象実装クラスにAbstractRefreshableApplicationContextは、プロパティbeanFactoryが含まれていますDefaultListableBeanFactory

ここに画像の説明を挿入
実際にAppliationContext継承されBeanFactoyます。

ここで使用されるデザインパターンは、継承および拡張されたデコレータパターンであり、基礎となる実装は拡張された例に基づいています。

総括する:

  • BeanFactory これは、Beanのライフサイクルを管理する実際のBeanコンテナです。

  • ApplicationContextこれには、BeanFactory職務およびその他の機能が含まれます。

Q:ApplicationContext継承されたHierarchicalBeanFactory、開発者向けのヒント?

A:からのApplicationContextBeanライフサイクル管理機能。BeanFactoryこれはHierarchicalBeanFactoryサブインターフェースであり、BeanFactory階層関係があることを示しています。またgetParent()親を返すメソッドもありApplicationContext、それらのサブインターフェイスConfigurableApplicationContextは親のApplicationContext能力を設定しています。

類推:

  • BeanFactory(10個のBeanを管理)
  • BeanFactory(20個のBeanを管理)
  • ClassLoader(10クラスをロード)
  • ClassLoader(20クラスをロード)

デモデモ:Springコンテキストを開始するように設定する

@EnableAutoConfiguration
@RestController
public class SpringBootApplicationBootstrap {
    
    

    public static void main(String[] args) {
    
    

        AnnotationConfigApplicationContext parentContext = new AnnotationConfigApplicationContext();
        parentContext.setId("test");
        // 在"test" 上下文注册一个 "helloWorld" String 类型的 Bean
        parentContext.registerBean("helloWorld", String.class, "Hello,World");
        // 启动"test" 上下文
        parentContext.refresh();

        new SpringApplicationBuilder(SpringBootApplicationBootstrap.class)
                .parent(parentContext) // 显式地设置双亲上下文
                .run(args);
    }

    @Autowired // String message Bean
    @Qualifier("helloWorld") // Bean 名称,来自于 “test” 上下文
    private String message;

    @RequestMapping("")
    public String index() {
    
    
        return message;
    }

}

このコンテキストを実行して、http:// localhost:9091 /アクチュエータ/ beansアクセスします。

ここに画像の説明を挿入
子コンテキストは親コンテキストによってアクティブ化される必要があることを説明します。上の図に示されているコンテキスト関係は次のとおりです。

  1. application-1そのparentIdはtestです
  2. そのparentIdがブートストラップであることをテストします
  3. そのparentIdのブートストラップは null

Spring Boot1.xにはデフォルトでApplicationContextがあります。コンテキストを個別に管理する場合、2つのApplicationContextがあります。
Spring Boot 2.0はApplicationContextをマージし、SpringCloudはBootstrapApplicationContextを追加します。

ブートストラップがどのリソースを早くロードする必要があるかを意味しますか?

Bootstrapアプリケーションのコンテキストを理解する

キーコールの実装

SpringBootの実装

  • org.springframework.boot.builder.ParentContextApplicationContextInitializer

SpringCloudの実装

  • org.springframework.cloud.bootstrap.BootstrapApplicationListener監視するイベントはですApplicationEnvironmentPreparedEvent推論の意味:Environment準備完了(調整済み)

技術協会:Springアプリケーションコンテキストレベル、Springイベント

環境を理解する

SpringBoot外部構成の公式ドキュメント

理解SpringBootアクチュエータエンドポイント

通常、SpringBootはヘルスチェックを実行し、このテクノロジーを使用すると言いますが、実際のアプリケーションでは、セキュリティを確保するために、さまざまなエンドポイント権限が設定されます。ここでは、基本的な状況を簡単に紹介します。

スタートアップクラスを設定する

@EnableAutoConfiguration
public class SpringBootApplicationBootstrap {
    
    

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

すべてのWeb管理エンドポイントを開きます

spring.application.name = first-spring-cloud-app
# 设置 Web 服务端口
server.port = 9090
# 设置 Web 管理端口(服务上下文和管理上线独立)
management.server.port = 9091

# 开放 所有Web 管理 Endpoints
management.endpoints.web.exposure.include = *

ログ出力を開始します

Springアプリケーションコンテキストを開始し、アドレスにアクセスします:http:// localhost:9091 /アクチュエータ
ここに画像の説明を挿入
JSON表示:

{
    
    
    "_links":{
    
    
        "self":{
    
    
            "href":"http://localhost:9091/actuator",
            "templated":false
        },
        "auditevents":{
    
    
            "href":"http://localhost:9091/actuator/auditevents",
            "templated":false
        },
        "beans":{
    
    
            "href":"http://localhost:9091/actuator/beans",
            "templated":false
        },
        "health":{
    
    
            "href":"http://localhost:9091/actuator/health",
            "templated":false
        },
        "conditions":{
    
    
            "href":"http://localhost:9091/actuator/conditions",
            "templated":false
        },
        "configprops":{
    
    
            "href":"http://localhost:9091/actuator/configprops",
            "templated":false
        },
        "env":{
    
    
            "href":"http://localhost:9091/actuator/env",
            "templated":false
        },
        "env-toMatch":{
    
    
            "href":"http://localhost:9091/actuator/env/{toMatch}",
            "templated":true
        },
        "info":{
    
    
            "href":"http://localhost:9091/actuator/info",
            "templated":false
        },
        "loggers":{
    
    
            "href":"http://localhost:9091/actuator/loggers",
            "templated":false
        },
        "loggers-name":{
    
    
            "href":"http://localhost:9091/actuator/loggers/{name}",
            "templated":true
        },
        "heapdump":{
    
    
            "href":"http://localhost:9091/actuator/heapdump",
            "templated":false
        },
        "threaddump":{
    
    
            "href":"http://localhost:9091/actuator/threaddump",
            "templated":false
        },
        "metrics-requiredMetricName":{
    
    
            "href":"http://localhost:9091/actuator/metrics/{requiredMetricName}",
            "templated":true
        },
        "metrics":{
    
    
            "href":"http://localhost:9091/actuator/metrics",
            "templated":false
        },
        "scheduledtasks":{
    
    
            "href":"http://localhost:9091/actuator/scheduledtasks",
            "templated":false
        },
        "httptrace":{
    
    
            "href":"http://localhost:9091/actuator/httptrace",
            "templated":false
        },
        "mappings":{
    
    
            "href":"http://localhost:9091/actuator/mappings",
            "templated":false
        },
        "refresh":{
    
    
            "href":"http://localhost:9091/actuator/refresh",
            "templated":false
        },
        "features":{
    
    
            "href":"http://localhost:9091/actuator/features",
            "templated":false
        }
    }
}

上記の構成ファイルでは、すべてのポートを開いているので、次のように/ actuatorにアクセスして公開されているすべてのエンドポイントのアドレスを取得します。

        "beans":{
    
    
            "href":"http://localhost:9091/actuator/beans",
            "templated":false
        },

次に、この時点http:// localhost:9091 / actuator / beansにアクセスします。Springによって監視されているBeanの詳細を取得します。
ここに画像の説明を挿入

環境ポート(/アクチュエータ/ env)を取得します

アクセスポート:http:// localhost:9091 / Actuator / env

ここに画像の説明を挿入

/ actuator / pauseおよび/ actuator / resumeポート

/ actuator / pauseポートと/ actuator / resumeポートはデフォルトで無効になっています。最初に、構成ファイルでエンドポイントを有効にする必要があります。

management.endpoint.restart.enabled=true
management.endpoint.pause.enabled=true
management.endpoint.resume.enabled=true
  • /アクチュエータ/一時停止-> ApplicationContext#stop()-> Spring LifeCycleBeans stop()ただし、LifeCycleインスタンス(ApplicationContext)はLifeCycleBeanと同じではありません

  • /アクチュエータ/履歴書-> ApplicationContext#start()-> Spring LifeCycle Beansstart()

エンドポイントの紹介

Spring Boot Exploration |アクチュエータエンドポイント詳細説明

追記

このセクションのコードアドレス:https//github.com/harrypottry/microservices-project/tree/master/spring-cloud-project/spring-cloud-native-application

アーキテクチャに関する知識の詳細については、Javaに関するこのシリーズの記事に注意してくださいJavaアーキテクトの成長への道

おすすめ

転載: blog.csdn.net/qq_34361283/article/details/106445747