>  기사  >  Java  >  분산되고 안전한 Spring Cloud 마이크로서비스 비행 시스템 구축

분산되고 안전한 Spring Cloud 마이크로서비스 비행 시스템 구축

王林
王林원래의
2023-06-22 08:06:09844검색

클라우드 컴퓨팅의 발전과 기업 비즈니스의 지속적인 확장으로 인해 마이크로서비스 아키텍처는 매우 인기 있는 시스템 아키텍처가 되었습니다. 그중 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 애플리케이션 생성:

@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {

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

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는 다운그레이드 기능입니다.

  1. 보안

분산 시스템에서는 보안 문제가 매우 중요합니다. 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

여기서 이름과 비밀번호는 각각 사용자의 이름과 비밀번호입니다. 실제 애플리케이션에서는 사용자 인증 및 권한 관리를 위해 보다 안전한 방법을 사용해야 한다는 점에 유의해야 합니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.