首頁 >Java >java教程 >建構分散式、安全的Spring Cloud微服務飛行系統

建構分散式、安全的Spring Cloud微服務飛行系統

王林
王林原創
2023-06-22 08:06:09886瀏覽

隨著雲端運算的發展和企業業務的不斷擴張,微服務架構成為了一個非常流行的系統架構。其中,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提供了Ribbon來支援負載平衡。

在服務消費者的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進行分發。

建立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提供了Security來支援安全性管理。

在服務提供者和服務消費者應用程式的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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn