クラウド コンピューティングの発展とエンタープライズ ビジネスの継続的な拡大に伴い、マイクロサービス アーキテクチャは非常に人気のあるシステム アーキテクチャになりました。その中で、現在最もよく使用されているマイクロサービス フレームワークは Spring Boot と Spring Cloud です。 Spring Cloud は、サービスの登録と検出、ルーティング、負荷分散、構成管理、サーキット ブレーカーなど、マイクロサービスの開発と管理をサポートする豊富なコンポーネントを提供します。
この記事では、Spring Cloud の強力な機能を実証するケースとして、分散型で安全な Spring Cloud マイクロサービス フライング システムを構築します。
まず、サービスを登録して検出する必要があります。 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/
サービスプロバイダーは 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 で設定します。
実際のアプリケーションでは、サービス プロバイダーが複数のインスタンスにデプロイされる可能性が高く、このとき、システムのパフォーマンスを向上させるために負荷分散を実行する必要があります。 . パフォーマンスと可用性。 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 で設定します。
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
マイクロサービス アーキテクチャでは、サービス間の依存関係が非常に複雑であるため、一部のサービスでのダウンタイムや問題がシステム全体の崩壊を引き起こす可能性があります。この状況に対処するには、サーキット ブレーカーを使用してサービスの低下に対処できます。
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はダウングレード関数です。
<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 サイトの他の関連記事を参照してください。