文章目錄
- 背景
- Spring Integration
- Spring Integration的幾個重要概念
- Spring Integration內建模式實戰
- 入口網關
- 消息過濾器
- 處理單元(發送消息)
- 內建元件
- 修改使用者服務業務邏輯
- 功能測試
- 小結
背景
《Spring全家桶的深入學習(一):Spring起步》《Spring全家桶的深入學習(二):基于SpringMVC開發web應用》《Spring全家桶的深入學習(三):實作資料持久化》《Spring全家桶的深入學習(四):使用Spring Data實作資料持久化》《Spring全家桶的深入學習(五):使用Spring Security安全架構保護web應用》《Spring全家桶的深入學習(六):Spring的配置屬性》《Spring全家桶的深入學習(七):Spring內建REST API服務》《Spring全家桶的深入學習(八):Spring內建JavaMailSender實作郵件發送》《Spring全家桶的深入學習(九):Spring內建RabbitMQ實作異步消息處理》
- 在前九篇文章中我們已經實作了一個簡單的使用者郵箱登記的web應用,将資料儲存到mysql資料庫中,并利用安全架構對web頁面進行保護及實作了管理者的注冊登入,又通過Spring的配置屬性完成了自定義的各種配置。
- 接下來我們開始了解Spring與應用的內建的基本概念,內建了REST API服務,通過JavaMailSender實作了郵件發送,及通過RabbitMQ實作異步消息的處理。
- 本章我們将會了解Spring Integration架構,通過實戰演練掌握Spring內建模式帶來的高效率應用。
Spring Integration
- 在企業級開發中,某個應用程式或子產品往往需要完成讀取消息、通過路由與外部API互動、生成日志檔案、消息異步處理等一系列任務;我們會把這一系列任務組成一個或多個管道流,并定義為ESB(Enterprise Service Bus )企業服務總線(總線方式把點對點、多對多的連接配接方式變成一對一的方式):
Spring Integration 正是企業級服務總線的實作:Spring Integration實作通用的內建模式,每個模式都實作為一個元件,消息會通過該元件在管道中傳遞資料。借助Spring配置,我們可以将這些元件組裝成一個管道,資料可以通過這個管道來流動。
Spring Integration在系統内提供實作輕量級、事件驅動互動行為的架構
Spring Integration在系統間提供一種基于擴充卡的平台,以支援靈活的系統間互動
Spring Integration的幾個重要概念
- 消息(Message):在Spring Integration中,消息是任何Java對象的通用包裝。
- 網關(gateway):通過接口将資料傳遞到內建流中,即總線入口。
- 通道(channel):将消息從一個元素傳遞到另一個元素。
- 過濾器(filter):基于某些判斷,條件化地允許某些消息通過流。
- 轉換器(transformer):改變消息的值和/或将消息載荷從一種類型轉換成另一種類型。
以上重要概念具體可參考 《Enterprise Integration Patterns》(企業內建模式)
Spring Integration內建模式實戰
- 在上一篇《Spring全家桶的深入學習(九):Spring內建RabbitMQ實作異步消息處理》文章中,UseService與RabbitMQ發送消息服務直接點對點對接,如果我們對這個通知過程再加入根據郵箱位址資訊過濾發送,記錄日志資訊等子產品 ,則使用者服務類需要同步擴充。
- 顯然,我們希望把《通知使用者處理子產品》這個流程進行內建,UseService隻與這個流程的入口進行單點連接配接,屏蔽在這個流程中的複雜處理單元,更有利于流程的擴充。
- 使用者通知內建服務
入口網關
/**
* Spring Integration網關入口
*
* @author zhuhuix
* @date 2020-07-15
*/
@Component
@MessagingGateway(defaultRequestChannel = "registerChannel")
public interface RegisterMessageGateway {
/**
* 注冊通知流程
*
* @param user 使用者資訊
*/
void registerMessageFlow(User user);
}
消息過濾器
/**
* Spring Integration過濾器
*
* @author zhuhuix
* @date 2020-07-15
*/
@Component
public class RegisterMessageFilter implements GenericSelector<User> {
@Override
public boolean accept(User user) {
if ((user == null || user.getId() == null || user.getId().equals(0L))) {
return false;
} else {
return true;
}
}
}
處理單元(發送消息)
/**
* Spring Integration消息發送
*
* @author zhuhuix
* @date 2020-07-15
*/
@Component
public class RegisterRabbitMQSendHandler implements GenericHandler<User> {
@Autowired
private RabbitTemplate rabbitTemplate;
@Override
public Object handle(User user, MessageHeaders messageHeaders) {
rabbitTemplate.convertAndSend(user);
return null;
}
}
內建元件
/**
* Spring Integration DSL配置
*
* @author zhuhuix
* @date 2020-07-15
*/
@Configuration
public class RegisterIntegrationConfig {
@Bean
public IntegrationFlow registerFlow(RegisterRabbitMQSendHandler registerRabbitMQSendHandler
, RegisterMessageFilter registerMessageFilter) {
return IntegrationFlows
// 從registerChannel消息通道擷取消息
.from(MessageChannels.direct("registerChannel"))
// 過濾
.filter(registerMessageFilter)
// 發送郵件
.handle(registerRabbitMQSendHandler)
.get();
}
}
修改使用者服務業務邏輯
/**
* 基于SpringMVC架構開發web應用--使用者服務類
*
* @author zhuhuix
* @date 2020-07-03
* @date 2020-07-04 增加通過jdbcTemplate處理資料
* @date 2020-07-07 将jdbcTemplate處理資料程式改為Spring Data JPA的處理方式
* @date 2020-07-10 增加删除deleteUser和查找findUser
* @date 2020-07-13 首次儲存使用者後通過郵件管理器發送通知郵件
* @date 2020-07-14 将同步發送通知郵件的功能變更為通過消息隊列異步發送
* @date 2020-07-15 通過調用注冊通知流程元件,屏蔽調用消息隊列
*/
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private RegisterMessageGateway registerMessageGateway;
// 傳回所有的使用者
public List<User> listUsers() {
return (List<User>) userRepository.findAll();
}
// 儲存使用者
public User saveUser(User user) {
// 儲存資料
userRepository.save(user);
// 調用注冊通知流程
registerMessageGateway.registerMessageFlow(user);
return user;
}
// 删除使用者
public void deleteUser(Long id) {
userRepository.deleteById(id);
}
// 查找使用者
public User findUser(Long id) {
return userRepository.findById(id).get();
}
// 根據名稱查找使用者
public List<User> searchUser(String name) {
return userRepository.findByName(name);
}
}
功能測試
小結
- 借助Spring Integration能夠定義ESB內建流,在總線内部可以對流中的消息(資料)進行相應處理。
- 消息網關做為內建流的入口,
- 在消息流動的過程中,消息可以進行過濾、轉換、切分、聚合、路由等處理。
- 消息通道連接配接內建流中的各個元件。
- Spring Integration可以實作快速封裝企業流程,統一入出接口,可以簡化大規模的業務系統中錯綜複雜的元件調用關系。
- 由于現階段網際網路微服務架構的流行,就象ESB企業服務總線一樣,Spring Integration目前也處于比較尴尬的境地。