在本章節中,我們將介紹分布式系統和微服務架構的基本概念,分布式系統解決了單體應用面臨的可擴展性、高可用性等問題,而微服務架構進一步提升了系統的可維護性和靈活性,
9.4.1. 分布式系統基本概念
分布式系統是由多個獨立的計算節點組成的系統,這些節點通過網路進行通信和協作, 分布式系統的主要特點是可擴展性、高可用性和容錯性,
- 可擴展性(Scalability):分布式系統可以通過添加更多的計算節點來提升處理能力,以應對不斷增長的業務需求,
- 高可用性(High availability):分布式系統可以在某個節點發生故障時,自動將任務轉移到其他正常節點上,從而保證系統的正常運行,
- 容錯性(Fault tolerance):分布式系統可以在部分節點發生故障時,依然能夠正常提供服務,
9.4.2. 微服務架構基本概念
微服務架構是一種軟體架構風格,它將一個大型應用劃分為多個獨立的、可獨立部署的小型服務,這些小型服務可以使用不同的編程語言和技術堆疊進行開發,它們通過輕量級的通信協議(如HTTP/REST)進行互相呼叫,
微服務架構的主要優勢在于:
- 可維護性(Maintainability):將一個復雜的大型應用劃分為多個小型服務,可以降低每個服務的復雜度,提高代碼的可讀性和可維護性,
- 靈活性(Flexibility):微服務可以獨立進行更新和部署,這意味著我們可以更快地回應業務需求的變化,以及嘗試新的技術和架構,
- 可擴展性(Scalability):我們可以根據每個微服務的需求,獨立地進行橫向擴展,從而提高整個系統的處理能力,
9.4.3. Spring Cloud
Spring Cloud是一個基于Spring Boot的開發工具集,它提供了一系列用于構建分布式系統和微服務架構的解決方案,在本節中,我們將簡要介紹Spring Cloud的主要組件,
- Spring Cloud Config:提供了一個集中式配置管理服務,可以讓所有的微服務從一個中心位置獲取配置資訊,
- Spring Cloud Eureka:提供了一個服務注冊與發現的解決方案,微服務可以向Eureka注冊,然后通過Eureka獲取其他微服務的實體資訊,
- Spring Cloud Ribbon:提供了客戶端負載均衡的功能,通過Ribbon,我們可以將請求自動分發到多個服務實體,從而提高系統的可用性和容錯性,
- Spring Cloud Feign:提供了一個宣告式的HTTP客戶端,通過Feign,我們可以更加簡潔地撰寫服務間的呼叫代碼,
- Spring Cloud Hystrix:提供了熔斷器和執行緒隔離的功能,當某個服務出現故障時,Hystrix可以自動降級服務,從而保證整個系統的穩定性,
- Spring Cloud Zuul:提供了一個API網關服務,通過Zuul,我們可以實作請求路由、負載均衡、認證授權等功能,
9.4.4. 示例:創建一個簡單的微服務應用
在這個示例中,我們將使用Spring Boot和Spring Cloud創建一個簡單的微服務應用,該應用包含兩個服務:一個是用戶服務,另一個是訂單服務,用戶服務負責管理用戶資訊,訂單服務負責管理訂單資訊,訂單服務需要呼叫用戶服務來獲取用戶資訊,
1. 創建Eureka服務注冊中心
首先,我們需要創建一個Eureka服務注冊中心,使用Spring Boot創建一個新專案,并添加以下依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
在application.yml檔案中,配置Eureka服務:
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
在啟動類上添加@EnableEurekaServer注解:
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
2. 創建用戶服務
創建一個新的Spring Boot專案,并添加以下依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
在application.yml檔案中,配置服務名和Eureka服務地址:
spring:
application:
name: user-service
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
創建一個簡單的用戶物體類和控制器:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// 省略getter和setter方法
}
@RestController
@RequestMapping("/users")
public class UserController {
// 這里僅用一個Map模擬資料庫
private final Map<Long, User> userMap = new ConcurrentHashMap<>();
@PostMapping
public User createUser(@RequestBody User user) {
user.setId(userMap.size() + 1L);
userMap.put(user.getId(), user);
return user;
}
@GetMapping("/{id}")
public User getUser(@PathVariable("id") Long id) {
return userMap.get(id);
}
}
在啟動類上添加@EnableDiscoveryClient注解:
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
3. 創建訂單服務
創建一個新的Spring Boot專案,并添加以下依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在application.yml檔案中,配置服務名和Eureka服務地址:
spring:
application:
name: order-service
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
創建一個簡單的訂單物體類和控制器:
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long userId;
// 省略getter和setter方法
}
@RestController
@RequestMapping("/orders")
public class OrderController {
// 這里僅用一個Map模擬資料庫
private final Map<Long, Order> orderMap = new ConcurrentHashMap<>();
@Autowired
private UserServiceClient userServiceClient;
@PostMapping
public Order createOrder(@RequestBody Order order) {
order.setId(orderMap.size() + 1L);
orderMap.put(order.getId(), order);
return order;
}
@GetMapping("/{id}")
public Order getOrder(@PathVariable("id") Long id) {
Order order = orderMap.get(id);
User user = userServiceClient.getUser(order.getUserId());
order.setUser(user);
return order;
}
}
創建一個Feign客戶端來呼叫用戶服務:
@FeignClient("user-service")
public interface UserServiceClient {
@GetMapping("/users/{id}")
User getUser(@PathVariable("id") Long id);
}
在啟動類上添加@EnableDiscoveryClient和@EnableFeignClients注解:
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
}
至此,我們已經創建了一個簡單的微服務應用,用戶服務和訂單服務都向Eureka服務注冊中心注冊了自己,訂單服務可以通過Feign客戶端呼叫用戶服務獲取用戶資訊,
9.4.5. 示例總結
在本示例中,我們使用了Spring Cloud的主要組件來構建一個簡單的微服務應用,Eureka服務注冊中心負責管理服務實體資訊,Feign客戶端簡化了服務間呼叫的代碼,微服務架構使得我們可以獨立地開發、部署和擴展每個服務,
這個示例僅僅涉及到了微服務架構的一些基本概念,在實際專案中,我們還需要考慮其他諸如資料一致性、服務降級、API網關等問題,通過不斷學習和實踐,你會對分布式系統和微服務架構有更加深入的理解,
推薦閱讀:
https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA
https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/554489.html
標籤:其他
上一篇:SCM Manager XSS漏洞復現(CVE-2023-33829)
下一篇:返回列表
