天天看點

Spring全家桶的深入學習(十):Spring Integration內建模式實作企業ESB

文章目錄

  • ​​背景​​
  • ​​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全家桶的深入學習(十):Spring Integration內模組化式實作企業ESB

Spring Integration 正是企業級服務總線的實作:Spring Integration實作通用的內建模式,每個模式都實作為一個元件,消息會通過該元件在管道中傳遞資料。借助Spring配置,我們可以将這些元件組裝成一個管道,資料可以通過這個管道來流動。

Spring Integration在系統内提供實作輕量級、事件驅動互動行為的架構

Spring Integration在系統間提供一種基于擴充卡的平台,以支援靈活的系統間互動

Spring Integration的幾個重要概念
  1. 消息(Message):在Spring Integration中,消息是任何Java對象的通用包裝。
  2. 網關(gateway):通過接口将資料傳遞到內建流中,即總線入口。
  3. 通道(channel):将消息從一個元素傳遞到另一個元素。
  4. 過濾器(filter):基于某些判斷,條件化地允許某些消息通過流。
  5. 轉換器(transformer):改變消息的值和/或将消息載荷從一種類型轉換成另一種類型。
以上重要概念具體可參考 ​​《Enterprise Integration Patterns》(企業內建模式)​​

Spring Integration內建模式實戰

  • 在上一篇​​《Spring全家桶的深入學習(九):Spring內建RabbitMQ實作異步消息處理》​​文章中,UseService與RabbitMQ發送消息服務直接點對點對接,如果我們對這個通知過程再加入根據郵箱位址資訊過濾發送,記錄日志資訊等子產品 ,則使用者服務類需要同步擴充。
  • Spring全家桶的深入學習(十):Spring Integration內模組化式實作企業ESB
  • 顯然,我們希望把《通知使用者處理子產品》這個流程進行內建,UseService隻與這個流程的入口進行單點連接配接,屏蔽在這個流程中的複雜處理單元,更有利于流程的擴充。
  • Spring全家桶的深入學習(十):Spring Integration內模組化式實作企業ESB
  • 使用者通知內建服務
  • Spring全家桶的深入學習(十):Spring Integration內模組化式實作企業ESB
入口網關
/**
 * 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全家桶的深入學習(十):Spring Integration內模組化式實作企業ESB
Spring全家桶的深入學習(十):Spring Integration內模組化式實作企業ESB

小結

  • 借助Spring Integration能夠定義ESB內建流,在總線内部可以對流中的消息(資料)進行相應處理。
  • 消息網關做為內建流的入口,
  • 在消息流動的過程中,消息可以進行過濾、轉換、切分、聚合、路由等處理。
  • 消息通道連接配接內建流中的各個元件。
  • Spring Integration可以實作快速封裝企業流程,統一入出接口,可以簡化大規模的業務系統中錯綜複雜的元件調用關系。
  • 由于現階段網際網路微服務架構的流行,就象ESB企業服務總線一樣,Spring Integration目前也處于比較尴尬的境地。