ホームページ  >  記事  >  Java  >  分散型で安全な Spring Cloud マイクロサービス フライト システムを構築する

分散型で安全な Spring Cloud マイクロサービス フライト システムを構築する

王林
王林オリジナル
2023-06-22 08:06:09845ブラウズ

クラウド コンピューティングの発展とエンタープライズ ビジネスの継続的な拡大に伴い、マイクロサービス アーキテクチャは非常に人気のあるシステム アーキテクチャになりました。その中で、現在最もよく使用されているマイクロサービス フレームワークは Spring Boot と Spring Cloud です。 Spring Cloud は、サービスの登録と検出、ルーティング、負荷分散、構成管理、サーキット ブレーカーなど、マイクロサービスの開発と管理をサポートする豊富なコンポーネントを提供します。

この記事では、Spring Cloud の強力な機能を実証するケースとして、分散型で安全な Spring Cloud マイクロサービス フライング システムを構築します。

  1. サービスの登録と検出

まず、サービスを登録して検出する必要があります。 Spring Cloud は、サービスの登録と検出を実現するのに役立つ Eureka を提供します。 Eureka Server を通じてサービスの登録と検出を完了します。

Eureka Server アプリケーションの作成:

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

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

application.properties での設定:

server.port=8761

eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

サービス プロバイダー アプリケーションとサービス コンシューマー アプリケーションでは、それを Eureka Server に登録する必要があります。

サービス プロバイダーの application.properties で構成:

spring.application.name=flight-service-provider
server.port=8080

eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

サービス コンシューマーの application.properties で構成:

spring.application.name=flight-service-consumer
server.port=8081

eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
  1. サービス間通信

サービスプロバイダーは Spring MVC を通じて RESTful インターフェースを作成します:

@RestController
@RequestMapping("/flights")
public class FlightController {

    @GetMapping("/{flightId}")
    public ResponseEntity<Flight> getFlight(@PathVariable Integer flightId) {
        Flight flight = new Flight(flightId, "Shanghai", "Beijing", new Date());
        return new ResponseEntity<>(flight, HttpStatus.OK);
    }
}

サービスコンシューマーは Spring RestTemplate を通じてサービスを呼び出します:

@Service
public class FlightService {

    @Autowired
    private RestTemplate restTemplate;

    @Value("${service.provider.url}")
    private String serviceProviderUrl;

    public Flight getFlight(Integer flightId) {
        return restTemplate.getForObject(serviceProviderUrl + "/flights/{flightId}", Flight.class, flightId);
    }
}

その中には、service.provider があります。 URL はアプリケーション内にあります。プログラムの application.properties で設定します。

  1. 負荷分散

実際のアプリケーションでは、サービス プロバイダーが複数のインスタンスにデプロイされる可能性が高く、このとき、システムのパフォーマンスを向上させるために負荷分散を実行する必要があります。 . パフォーマンスと可用性。 Spring Cloud は、負荷分散をサポートするためのリボンを提供します。

サービスコンシューマの application.properties で設定します:

service.provider.url=http://flight-service-provider/
spring.cloud.loadbalancer.ribbon.enabled=true

FlightService で負荷分散された RestTemplate を使用します:

@Service
public class FlightService {

    @Autowired
    @LoadBalanced
    private RestTemplate restTemplate;

    @Value("${service.provider.name}")
    private String serviceProviderName;

    public Flight getFlight(Integer flightId) {
        return restTemplate.getForObject("http://" + serviceProviderName + "/flights/{flightId}", Flight.class, flightId);
    }
}

その中に、service.provider.name があります。アプリケーションはプログラムの application.properties で設定します。

  1. 構成管理

Spring Cloud は、アプリケーション構成を簡単に管理するための Config を提供します。アプリケーション構成を Git リポジトリに保存し、Config Server を通じて配布できます。

Create Config Server application:

@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {

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

Configure in application.properties:

server.port=8888

spring.cloud.config.server.git.uri=https://github.com/xxx/xxx.git
spring.cloud.config.server.git.search-paths=config-repo

サービス プロバイダーとサービス コンシューマーでは、Config Server アプリケーションの構成を通じて取得できます。

サービス プロバイダーの application.yml で構成します:

spring:
  application:
    name: flight-service-provider
  cloud:
    config:
      uri: http://localhost:8888
      label: master
      profile: dev

サービス コンシューマーの application.yml で構成します:

spring:
  application:
    name: flight-service-consumer
  cloud:
    config:
      uri: http://localhost:8888
      label: master
      profile: dev
  1. サーキット ブレーカー

マイクロサービス アーキテクチャでは、サービス間の依存関係が非常に複雑であるため、一部のサービスでのダウンタイムや問題がシステム全体の崩壊を引き起こす可能性があります。この状況に対処するには、サーキット ブレーカーを使用してサービスの低下に対処できます。

Spring Cloud は、サーキット ブレーカー機能をサポートする Hystrix を提供します。

サービスコンシューマのapplication.ymlに設定:

spring:
  application:
    name: flight-service-consumer
  cloud:
    config:
      uri: http://localhost:8888
      label: master
      profile: dev
  loadbalancer:
    ribbon:
      enabled: true
  circuitbreaker:
    enabled: true
    resilience4j:
      enabled: false
      circuitBreaker:
        backend: flight-service-provider
        failureRateThreshold: 50

FlightControllerに@HystrixCommandアノテーションを追加:

@RestController
@RequestMapping("/flights")
public class FlightController {

    @Autowired
    private FlightService flightService;

    @GetMapping("/{flightId}")
    @HystrixCommand(fallbackMethod = "defaultGetFlight")
    public ResponseEntity<Flight> getFlight(@PathVariable Integer flightId) {
        Flight flight = flightService.getFlight(flightId);
        if (flight != null) {
            return new ResponseEntity<>(flight, HttpStatus.OK);
        } else {
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
    }

    public ResponseEntity<Flight> defaultGetFlight(Integer flightId) {
        return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

このうち、defaultGetFlightはダウングレード関数です。

    #セキュリティ
分散システムでは、セキュリティの問題は非常に重要です。 Spring Cloud はセキュリティ管理をサポートするセキュリティを提供します。

サービス プロバイダーおよびサービス コンシューマ アプリケーションの pom.xml を追加します:

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

サービス プロバイダーおよびサービス コンシューマ アプリケーションの application.yml で構成します:

security:
  basic:
    enabled: true

spring:
  security:
    user:
      name: user
      password: password

このうち、nameとpasswordはそれぞれユーザー名とパスワードです。実際のアプリケーションでは、ユーザーの認証と認可の管理には、より安全な方法を使用する必要があることに注意してください。

FlightController のクラス レベルで @PreAuthorize アノテーションを追加します:

@RestController
@RequestMapping("/flights")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public class FlightController {

    @Autowired
    private FlightService flightService;

    @GetMapping("/{flightId}")
    public ResponseEntity<Flight> getFlight(@PathVariable Integer flightId) {
        Flight flight = flightService.getFlight(flightId);
        if (flight != null) {
            return new ResponseEntity<>(flight, HttpStatus.OK);
        } else {
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
    }
}

このうち、@PreAuthorize アノテーションは、FlightController でセキュリティ検証を実行するために使用されます。実際のアプリケーションでは、メソッドごとに異なるセキュリティ検証を実行できます。

このようにして、分散型で安全な Spring Cloud マイクロサービス フライト システムの構築が完了しました。この記事のケースを通じて、Spring Cloud がマイクロサービスの構築に役立つ豊富なコンポーネントを提供していることがわかります。同時に、サービスの登録と検出、サービス間通信、負荷分散、構成管理、サーキット ブレーカー、セキュリティ、その他の問題など、マイクロサービス アーキテクチャによってもたらされるいくつかの課題にも注意を払う必要があります。実際のアプリケーションでは、特定のシナリオに基づいてテクノロジーの選択と構成を行う必要があります。

以上が分散型で安全な Spring Cloud マイクロサービス フライト システムを構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。