Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Xuân Hội nhập là gì?

Spring cung cấp hỗ trợ tích hợp ứng dụng trên các khuôn khổ doanh nghiệp bằng cách sử dụng tiện ích mở rộng có tên là Spring Integration . Mục tiêu chính là tạo điều kiện thuận lợi cho các ứng dụng với các lĩnh vực kinh doanh đa dạng; công nghệ hướng tới khả năng tương tác theo chiều ngang trong toàn doanh nghiệp. Nó bổ sung tính năng nhắn tin nhẹ và tích hợp với các hệ thống và dịch vụ bên ngoài bằng cách sử dụng khung bộ điều hợp. Bài viết này nhằm mục đích cung cấp hiểu biết cơ bản về Tích hợp mùa xuân và cách nó mở rộng qua mô hình lập trình mùa xuân.

Tổng quan

Ứng dụng thương mại không gì khác ngoài giải pháp cho các vấn đề do các đơn vị kinh doanh đặt ra. Mức độ và độ phức tạp của các vấn đề quyết định liệu giải pháp ở quy mô doanh nghiệp hay chỉ là một vài dòng mã. Vấn đề với ứng dụng doanh nghiệp là đôi khi, một phần của giải pháp đã có sẵn bằng cách sử dụng các công nghệ cũ có thể không hiệu quả về chi phí để xây dựng lại từ đầu để phù hợp với các công nghệ mới hơn, có thể là phần cứng hoặc phần mềm mới. Đây là một vấn đề điển hình với các ứng dụng kế thừa. Do đó, những gì chúng ta có thể làm là tạo ra các thành phần mới hơn hoạt động tương hỗ với hệ thống hiện có. Đây là tích hợp ứng dụng . Tuy nhiên, vấn đề không kết thúc ở đó. Không dễ dàng gì để tạo ra các thành phần hoạt động liền mạch với các thành phần hiện có mà không áp đặt các hạn chế không cần thiết đối với hiệu quả của nhau. Cần phải xem xét nghiêm túc để tích hợp liền mạch nhiều thành phần. Spring Integration xem xét những vấn đề này và cung cấp môi trường cho các nhà phát triển viết mã để dễ dàng tích hợp. Spring xác định các mô hình chung có liên quan và thực hiện công việc với ít sự can thiệp của nhà phát triển.

Khớp nối lỏng lẻo

Bởi vì giải pháp phải sử dụng nhiều phần, mỗi phần phải có các mối quan tâm riêng biệt theo cách kết hợp lỏng lẻo nhất có thể. Sự phát triển của một thành phần không được đặt ra các tác động nghiêm trọng về thiết kế và bảo trì đối với thành phần khác. Một tình huống tách rời hoàn toàn không phù hợp để tích hợp, cũng như không thể chấp nhận một khớp nối chặt chẽ. Do đó, trò chơi là thiết kế các thành phần theo cách liên kết lỏng lẻo nhất có thể. Có một số cách để giảm khớp nối trong ứng dụng Spring:chèn phụ thuộc hoặc kiến ​​trúc hướng sự kiện . Kiến trúc hướng sự kiện là một thuật ngữ rộng và có sự khác biệt rất rõ ràng giữa kiến ​​trúc hướng thông điệp, hay MOM. Mặc dù chúng không giống nhau về mặt kỹ thuật, vì mục đích này, chúng tôi có thể sử dụng các thuật ngữ thay thế cho nhau ở đây. Chỉ vì lợi ích của những người theo chủ nghĩa thuần túy, sự khác biệt cơ bản giữa hướng sự kiện và hướng thông điệp là các thông điệp hướng người nhận trong khi các sự kiện là vô hướng; nếu không, việc thực hiện chúng hầu như không có sự phân định rõ ràng. Đừng đi sâu vào vấn đề đó ở đây; thay vào đó, hãy tập trung vào cách kiến ​​trúc hướng sự kiện được sử dụng với Tích hợp mùa xuân.

Tích hợp mùa xuân theo hướng sự kiện

Trong kiến ​​trúc hướng sự kiện, một ứng dụng phức tạp được chia thành nhiều thành phần dịch vụ. Các thành phần này tương tác thông qua các sự kiện được tạo bởi các thành phần khác, được gọi là nhà xuất bản của các sự kiện. Các thành phần khác quan tâm đến sự kiện cụ thể đó đăng ký sự kiện đó và thực hiện hành động thích hợp để đáp lại. Về bản chất, đây là mô hình nhà xuất bản-người đăng ký làm việc trên các sự kiện.

Một sự thay đổi cụ thể trong trạng thái là một sự kiện. Như đã nêu, một sự kiện được gửi đến các bên quan tâm và người đăng ký sự kiện có thể chọn phản hồi bằng cách cung cấp dịch vụ như thực hiện quy trình kinh doanh, xuất bản một sự kiện khác hoặc có thể hoàn toàn bỏ qua sự kiện đó. Điều đó có nghĩa là các sự kiện, sau khi được công bố, không có bất kỳ trách nhiệm nào đối với phản hồi của người đăng ký. Đây là một kịch bản tách rời và kiến ​​trúc hướng sự kiện thúc đẩy các kịch bản ghép nối lỏng lẻo như vậy. Khớp nối lỏng đặc biệt thích hợp để thực hiện quy trình công việc theo thời gian thực mà Spring Integration yêu cầu.

Thành phần tích hợp mùa xuân

Là một phần mở rộng của Spring framework, Spring Integration về cơ bản bổ sung ba thành phần:thông điệp, kênh thông báo và thiết bị đầu cuối. Các nhà phát triển của Spring Integration đã nhận ra mô hình chung của các điểm tương đồng là hoạt động lẫn nhau giữa các kiến ​​trúc, miền và công nghệ khác nhau trong lĩnh vực doanh nghiệp. Do đó, bằng cách giới thiệu thông điệp thông qua thành phần sử dụng đường ống và bộ lọc, mô hình này đã trở thành cơ sở để tích hợp ứng dụng. Các thành phần bộ lọc tiêu thụ hoặc tạo ra các thông báo trong khi các đường ống, được gọi là kênh trong Tích hợp mùa xuân, mô tả luồng thông báo giữa các bộ lọc.

Có rất nhiều phức tạp liên quan. Tham khảo các liên kết trong phần Tài liệu tham khảo để biết thêm chi tiết. Ở đây, thay vào đó, hãy tập trung vào triển khai đơn giản với DirectChannel .

Một ví dụ nhanh

Ví dụ trong Liệt kê 1 là ứng dụng Spring BOOT triển khai Tích hợp mùa xuân với DirectChannel . Ở đây, kênh tin nhắn được sử dụng để tách điểm cuối của nhà xuất bản và người đăng ký. Kênh thông báo được sử dụng để thiết lập kết nối với các thành phần bộ lọc và bộ điều hợp. Ví dụ này khá đơn giản và sử dụng DirectChannel với nhà xuất bản-người đăng ký và mô hình liên lạc điểm-điểm. Lưu ý rằng mã này còn thô sơ và cách triển khai đơn giản để minh họa ý tưởng về Tích hợp mùa xuân.

<?xml version="1.0" encoding="UTF-8"?>
<project 
      xmlns_xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi_schemaLocation="http://maven.apache.org/POM/4.0.0
      http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.mano.example</groupId>
   <artifactId>spring-integration</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>spring-integration</name>
   <description>Demo project for Spring BOOT</description>
   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.0.6.RELEASE</version>
      <relativePath/> <!-- look up parent from
         repository -->
   </parent>
   <properties>
      <project.build.sourceEncoding>
         UTF-8
      </project.build.sourceEncoding>
      <project.reporting.outputEncoding>
         UTF-8
      </project.reporting.outputEncoding>
      <java.version>1.8</java.version>
   </properties>
   <dependencies>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>
            spring-boot-starter-integration
         </artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>
            spring-boot-starter-test
         </artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>
   <build>
      <plugins>
         <plugin>
            <groupId>
               org.springframework.boot
            </groupId>
            <artifactId>
               spring-boot-maven-plugin
            </artifactId>
         </plugin>
      </plugins>
   </build>
</project>

Liệt kê 1: pom.xml, phụ thuộc Spring BOOT cho giải pháp Tích hợp mùa xuân

package com.mano.example.springintegration.model;
import java.util.Date;
public class Tweet {
   private long tid;
   private String text;
   private Date time;
   private String hashTag;
   @Override
   public String toString() {
      return "Tweet{" +
         "tid=" + tid +
         ", text='" + text + ''' +
         ", time=" + time +
         ", hashTag='" + hashTag + ''' +
         '}';
   }
   public long getTid() {
      return tid;
   }
   public void setTid(long tid) {
      this.tid = tid;
   }
   public String getText() {
      return text;
   }
   public void setText(String text) {
      this.text = text;
   }
   public Date getTime() {
      return time;
   }
   public void setTime(Date time) {
      this.time = time;
   }
   public String getUser() {
      return hashTag;
   }
   public void setUser(String hashTag) {
      this.hashTag = hashTag;
   }
}

Liệt kê 2: Tweet.java, lớp mô hình

package com.mano.example.springintegration.repo;
import com.mano.example.springintegration.model.Tweet;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Component
public class TweetPublisher {
   private static long id;
   public List<Tweet> getTweets(){
      List<Tweet> tweets = new ArrayList<>();
      tweets.add(createTweet("Storms in Pacific","#weather"));
      tweets.add(createTweet("what's up developers?","#dev"));
      tweets.add(createTweet("Chinese delicacy in Amazon",
         "#traveller"));
      tweets.add(createTweet("inflation down by 2%","#stock"));
      tweets.add(createTweet("save river","#environment"));
      tweets.add(createTweet("New star found","#astronaut"));
      tweets.add(createTweet("Learn math quickly","#tutor"));
      tweets.add(createTweet("Save animals","#bovine"));
      tweets.add(createTweet("stars are favorable now",
         "#astro"));
      tweets.add(createTweet("social unrest in the world",
         "#concern"));
      return tweets;
   }
   Tweet createTweet(String text, String hashTag){
      Tweet tweet = new Tweet();
      tweet.setTid(id++);
      tweet.setUser(hashTag);
      tweet.setText(text);
      tweet.setTime(new Date());
      return tweet;
   }
}

Liệt kê 3: TweetPublisher.java, điền dữ liệu tweet

package com.mano.example.springintegration.pub;
import com.mano.example.springintegration.model.Tweet;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.support
   .MessageBuilder;
import org.springframework.stereotype.Component;
@Component
public class Tweeter {
   private DirectChannel channel;
   @Value("#{tweetChannel}")
   public void setChannel(DirectChannel channel) {
      this.channel = channel;
   }
   public void sendTweetReaders(Tweet tweet) {
      System.out.println("New Tweet - " + tweet.toString());
      channel.send(MessageBuilder.withPayload(tweet)
         .build());
   }
}

Liệt kê 4: Tweeter.java, lớp nhà xuất bản

package com.mano.example.springintegration.sub;
import com.mano.example.springintegration.model.Tweet;
import org.springframework.integration
   .MessageRejectedException;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHandler;
import org.springframework.messaging.MessagingException;
import org.springframework.stereotype.Component;
@Component
public class TweetReader implements MessageHandler {
   @Override
   public void handleMessage(Message<?> message)
         throws MessagingException {
      Object payload = message.getPayload();
      if (payload instanceof Tweet) {
         receiveAndAcknowledge((Tweet) payload);
      } else {
        throw new MessageRejectedException(message,
           "Unknown data type has been received.");
      }
   }
   void receiveAndAcknowledge(Tweet tweet) {
      System.out.println("Hi Tweeter, this is Reader #"
         + System.identityHashCode(this) +
         "." + "Received tweet - " + tweet.toString()
         + "n");
   }
}

Liệt kê 5: TweetReader.java, lớp người đăng ký

package com.mano.example.springintegration;
import com.mano.example.springintegration.incoming
   .TweetPublisher;
import com.mano.example.springintegration.model.Tweet;
import com.mano.example.springintegration.pub.Tweeter;
import com.mano.example.springintegration.sub.TweetReader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure
   .SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.messaging.MessageChannel;
import java.util.List;
@SpringBootApplication
@ComponentScan(basePackages = "com.mano.example.springintegration")
public class SpringIntegrationApplication {

   @Autowired
   private TweetPublisher tweetPublisher;
   @Autowired
   private Tweeter tweeter;
   @Autowired
   private DirectChannel channel;
   @Bean
   public MessageChannel tweetChannel(){
      return new DirectChannel();
   }
   @Bean
   public CommandLineRunner commandLineRunner
         (ApplicationContext context){
      return args -> {
         channel.subscribe(new TweetReader());
         channel.subscribe(new TweetReader());
         channel.subscribe(new TweetReader());
         List<Tweet> tweets = tweetPublisher.getTweets();
         for (Tweet tweet: tweets){
            tweeter.sendTweetReaders(tweet);
         }
      };
   }

   public static void main(String[] args) {
      SpringApplication.run(SpringIntegrationApplication
         .class, args);
   }
}

Liệt kê 6: SpringIntegrationApplication.java, lớp ứng dụng chính

Kết luận

Lưu ý rằng có rất nhiều điều với Spring Integration được minh họa ở đây. Nó chỉ là phần nổi của tảng băng chìm. Các chi tiết quan trọng bị lược bỏ. Tham khảo tài liệu Spring để biết thêm chi tiết về điều này; liên kết được đưa ra dưới đây. Spring Integration có những lợi thế, chẳng hạn như Inversion of Control (IoC), lập trình hướng khía cạnh để giải quyết mối quan tâm xuyên suốt và những lợi thế cốt lõi khác của Spring Framework theo ý của nó. Spring Integration đưa nó đi xa hơn. Các nhà phát triển của Spring Integration không cần biết về cách thức, thời điểm và vị trí của dữ liệu. Khung xử lý cách logic nghiệp vụ được thực thi bằng cách điều động thông điệp qua các thành phần thích hợp. Ngoài lược đồ cấu hình XML thông thường, trình khởi động Spring BOOT cung cấp các phụ thuộc bắt buộc để bắt đầu mã mà không cần lo lắng về các phụ thuộc.

Tài liệu tham khảo

  • Tổng quan về Tích hợp Mùa xuân
  • Hội nhập mùa xuân

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cấu hình truy vấn thân thiện với băng thông cho Cơ sở dữ liệu Azure SQL

  2. Chốt FGCB_ADD_REMOVE

  3. T-SQL là gì?

  4. Dell Boomi

  5. Tạo một tập hợp hoặc trình tự không có vòng lặp - phần 2