隨著雲端運算的發展和企業業務的不斷擴張,微服務架構成為了一個非常流行的系統架構。其中,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提供了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中進行設定。
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
在微服務架構中,由於服務之間的依賴關係非常複雜,一些服務宕機或出現問題可能會導致整個系統的崩潰。為了因應這種情況,我們可以使用斷路器來進行服務降級處理。
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提供了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中文網其他相關文章!