RabbitMQ的企業級應用

2020-12-05 淚流雲

一、添加用戶和虛擬主機

點擊虛擬主機名稱,可以給用戶授權當前主機

二、Hellow World

1、引入相關依賴

<dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>4.5.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.3.2</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency>

2、創建連接的工具類

package com.epoint.cn.util;import com.rabbitmq.client.Connection;import com.rabbitmq.client.ConnectionFactory;/* 用於創建連接的工具類* */public class ConnectionUtil {public static Connection getConnection() throws Exception { ConnectionFactory connectionFactory = new ConnectionFactory(); connectionFactory.setHost("127.0.0.1"); connectionFactory.setPort(5672); connectionFactory.setUsername("lly"); connectionFactory.setPassword("lly"); connectionFactory.setVirtualHost("llyhost");return connectionFactory.newConnection(); } }

3、生產者

package com.epoint.cn.service;import com.epoint.cn.util.ConnectionUtil;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;public class Sender {private static final String QUEUE="hellowTest";public static void main(String[] args) throws Exception{//獲取連接Connection connection=ConnectionUtil.getConnection();//創建通道Channel channel=connection.createChannel();//聲明隊列,如果隊列存在什麼都不做,否則創建隊列 //參數1:隊列的名稱 //參數2:是否持久化隊列,我們的隊列模式是在內存中的,如果rabbitmq重啟會消失,如果為true會自動保存到erlang自帶的資料庫 //參數3:是否排外,倆個作用,一個是當我們的連接關閉後是否自動刪除隊列,第二個作用是是否私有當前隊列,如果私有,其他通道不可以訪問 //參數4:是否自動刪除 //參數5:一些其他參數channel.queueDeclare(QUEUE,false,false,false,null);//發送內容channel.basicPublish("",QUEUE,null,"淚流雲".getBytes());//關閉連接channel.close(); } }

4、消費者

package com.epoint.cn.service;import com.epoint.cn.util.ConnectionUtil;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.Consumer;import com.rabbitmq.client.QueueingConsumer;public class Receiver {private static final String QUEUE = "hellowTest";public static void main(String[] args) throws Exception {Connection connection = ConnectionUtil.getConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE, false, false, false, null); QueueingConsumer consumer = new QueueingConsumer(channel);//接收消息,參數2是自動確認channel.basicConsume(QUEUE, true, consumer);while (true) {//獲取消息QueueingConsumer.Delivery delivery = consumer.nextDelivery(); String s = new String(delivery.getBody()); System.out.print(s); } } }

三、Work模式

一個生產者,一個消息隊列,2個消費者

1、 生產者

package com.epoint.cn.service;import com.epoint.cn.util.ConnectionUtil;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;public class Sender {private static final String QUEUE="work";public static void main(String[] args) throws Exception{//獲取連接Connection connection=ConnectionUtil.getConnection();//創建通道Channel channel=connection.createChannel();//聲明隊列,如果隊列存在什麼都不做,否則創建隊列 //參數1:隊列的名稱 //參數2:是否持久化隊列,我們的隊列模式是在內存中的,如果rabbitmq重啟會消失,如果為true會自動保存到erlang自帶的資料庫 //參數3:是否排外,倆個作用,一個是當我們的連接關閉後是否自動刪除隊列,第二個作用是是否私有當前隊列,如果私有,其他通道不可以訪問 //參數4:是否自動刪除 //參數5:一些其他參數channel.queueDeclare(QUEUE,false,false,false,null);//發送內容for(int i=0;i<100;i++) { channel.basicPublish("",QUEUE,null,("淚流雲"+i).getBytes()); }//關閉連接channel.close(); connection.close(); } }

2、 消費者1

package com.epoint.cn.service;import com.epoint.cn.util.ConnectionUtil;import com.rabbitmq.client.*;import java.io.IOException;public class Receiver1 {private static final String QUEUE = "work";public static void main(String[] args) throws Exception {Connection connection = ConnectionUtil.getConnection();final Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE, false, false, false, null); channel.basicQos(1);//告訴伺服器在我們沒有確認當前消息完成之前,不要給我發新的消息DefaultConsumer consumer=new DefaultConsumer(channel) { @Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {//當我們接收到消息調用System.out.println("消費者1的消息內容是:"+new String(body));//模擬耗時try { Thread.sleep(10); }catch (Exception e){ }//確認channel.basicAck(envelope.getDeliveryTag(),false);//參數2為false表示確認收到消息,true為拒絕收到消息} };//註冊消費者,參數2手動確認,代表我們收到消息後需要手動告訴伺服器我收到消息了channel.basicConsume(QUEUE,false,consumer); } }

3、 消費者2

package com.epoint.cn.service;import com.epoint.cn.util.ConnectionUtil;import com.rabbitmq.client.*;import java.io.IOException;public class Receiver2 {private static final String QUEUE = "work";public static void main(String[] args) throws Exception {Connection connection = ConnectionUtil.getConnection();final Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE, false, false, false, null); channel.basicQos(1);//告訴伺服器在我們沒有確認當前消息完成之前,不要給我發新的消息DefaultConsumer consumer=new DefaultConsumer(channel) { @Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {//當我們接收到消息調用System.out.println("消費者2的消息內容是:"+new String(body));//模擬耗時try { Thread.sleep(200); }catch (Exception e){ }//確認channel.basicAck(envelope.getDeliveryTag(),false);//參數2為false表示確認收到消息,true為拒絕收到消息} };//註冊消費者,參數2手動確認,代表我們收到消息後需要手動告訴伺服器我收到消息了channel.basicConsume(QUEUE,false,consumer); } }

四、消費訂閱模式

發送消息到交換機,倆個隊列綁定到同一個交換機,從交換機獲取到相同的消息

1、 生產者

package com.epoint.cn.publish;import com.epoint.cn.util.ConnectionUtil;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;public class Sender {private static final String EXCHANGE_NAME = "testexchange";public static void main(String[] args) throws Exception {Connection connection = ConnectionUtil.getConnection(); Channel channel = connection.createChannel();//聲明交換機channel.exchangeDeclare(EXCHANGE_NAME, "fanout");//定義一個交換機,類型是fanout,即發布訂閱模式channel.basicPublish(EXCHANGE_NAME, "", null, "發布訂閱模式-".getBytes());//關閉連接channel.close(); connection.close(); } }

2、 消費者1

package com.epoint.cn.publish;import com.epoint.cn.util.ConnectionUtil;import com.rabbitmq.client.*;import java.io.IOException;public class Recever1 {private static final String EXCHANGE_NAME = "testexchange";public static void main(String[] args) throws Exception {Connection connection = ConnectionUtil.getConnection();final Channel channel = connection.createChannel(); channel.queueDeclare("testqueue1", false, false, false, null);//綁定隊列到交換機channel.queueBind("testqueue1", EXCHANGE_NAME, ""); channel.basicQos(1); DefaultConsumer defaultConsumer = new DefaultConsumer(channel) { @Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { System.out.println("消費者111" + new String(body)); channel.basicAck(envelope.getDeliveryTag(), false); } }; channel.basicConsume("testqueue1", false, defaultConsumer); } }

3、 消費者2

package com.epoint.cn.publish;import com.epoint.cn.util.ConnectionUtil;import com.rabbitmq.client.*;import java.io.IOException;public class Recever2 {private static final String EXCHANGE_NAME = "testexchange";public static void main(String[] args) throws Exception {Connection connection = ConnectionUtil.getConnection();final Channel channel = connection.createChannel(); channel.queueDeclare("testqueue2", false, false, false, null);//綁定隊列到交換機channel.queueBind("testqueue2", EXCHANGE_NAME, ""); channel.basicQos(1); DefaultConsumer defaultConsumer = new DefaultConsumer(channel) { @Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { System.out.println("消費者222" + new String(body)); channel.basicAck(envelope.getDeliveryTag(), false); } }; channel.basicConsume("testqueue2", false, defaultConsumer); } }

五、route路由模式

發送者發送消息到交換機,可以有多個隊列關聯到交換機,然而跟消費訂閱模式不一樣,不是每個消費者都能獲取到消息,而需要根據key來判斷。

1、 生產者

package com.epoint.cn.route;import com.epoint.cn.util.ConnectionUtil;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;public class Sender {private static final String EXCHANGE_NAME = "routeexchange";public static void main(String[] args) throws Exception {Connection connection = ConnectionUtil.getConnection(); Channel channel = connection.createChannel();//聲明交換機channel.exchangeDeclare(EXCHANGE_NAME, "direct");//定義路由格式的交換機channel.basicPublish(EXCHANGE_NAME, "key3", null, "路由模式-".getBytes());//關閉連接channel.close(); connection.close(); } }

2、 消費者1

package com.epoint.cn.route;import com.epoint.cn.util.ConnectionUtil;import com.rabbitmq.client.*;import java.io.IOException;public class Recever1 {private static final String EXCHANGE_NAME = "routeexchange";public static void main(String[] args) throws Exception {Connection connection = ConnectionUtil.getConnection();final Channel channel = connection.createChannel(); channel.queueDeclare("routequeue1", false, false, false, null);//綁定隊列到交換機channel.queueBind("routequeue1", EXCHANGE_NAME, "key1"); channel.queueBind("routequeue1", EXCHANGE_NAME, "key2"); channel.basicQos(1); DefaultConsumer defaultConsumer = new DefaultConsumer(channel) { @Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { System.out.println("消費者111" + new String(body)); channel.basicAck(envelope.getDeliveryTag(), false); } }; channel.basicConsume("routequeue1", false, defaultConsumer); } }

3、 消費者2

package com.epoint.cn.route;import com.epoint.cn.util.ConnectionUtil;import com.rabbitmq.client.*;import java.io.IOException;public class Recever2 {private static final String EXCHANGE_NAME = "routeexchange";public static void main(String[] args) throws Exception {Connection connection = ConnectionUtil.getConnection();final Channel channel = connection.createChannel(); channel.queueDeclare("routequeue2", false, false, false, null);//綁定隊列到交換機channel.queueBind("routequeue2", EXCHANGE_NAME, "key1"); channel.queueBind("routequeue2", EXCHANGE_NAME, "key3"); channel.basicQos(1); DefaultConsumer defaultConsumer = new DefaultConsumer(channel) { @Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { System.out.println("消費者2222" + new String(body)); channel.basicAck(envelope.getDeliveryTag(), false); } }; channel.basicConsume("routequeue2", false, defaultConsumer); } }

六、topic模式

Topic模式跟路由模式的區別是key的對應引入了通配符,而路由模式需要key值完全一致,用「*」和「#」匹配,「*」只能匹配一個詞,而「#可以匹配多個」

1、生產者

package com.epoint.cn.topic;import com.epoint.cn.util.ConnectionUtil;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;public class Sender {private static final String EXCHANGE_NAME = "topicexchange";public static void main(String[] args) throws Exception {Connection connection = ConnectionUtil.getConnection(); Channel channel = connection.createChannel();//聲明交換機channel.exchangeDeclare(EXCHANGE_NAME, "topic"); channel.basicPublish(EXCHANGE_NAME, "key.3.1", null, "topic模式11-".getBytes());//關閉連接channel.close(); connection.close(); } }

2、消費者1

package com.epoint.cn.topic;import com.epoint.cn.util.ConnectionUtil;import com.rabbitmq.client.*;import java.io.IOException;public class Recever1 {private static final String EXCHANGE_NAME = "topicexchange";public static void main(String[] args) throws Exception {Connection connection = ConnectionUtil.getConnection();final Channel channel = connection.createChannel(); channel.queueDeclare("topicqueue1", false, false, false, null);//綁定隊列到交換機channel.queueBind("topicqueue1", EXCHANGE_NAME, "key.#"); channel.queueBind("topicqueue1", EXCHANGE_NAME, "asa"); channel.basicQos(1); DefaultConsumer defaultConsumer = new DefaultConsumer(channel) { @Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { System.out.println("消費者111" + new String(body)); channel.basicAck(envelope.getDeliveryTag(), false); } }; channel.basicConsume("topicqueue1", false, defaultConsumer); } }

3、消費者2

package com.epoint.cn.topic;import com.epoint.cn.util.ConnectionUtil;import com.rabbitmq.client.*;import java.io.IOException;public class Recever2 {private static final String EXCHANGE_NAME = "topicexchange";public static void main(String[] args) throws Exception {Connection connection = ConnectionUtil.getConnection();final Channel channel = connection.createChannel(); channel.queueDeclare("topicqueue2", false, false, false, null);//綁定隊列到交換機channel.queueBind("topicqueue2", EXCHANGE_NAME, "key.*"); channel.queueBind("topicqueue2", EXCHANGE_NAME, "asa.1"); channel.basicQos(1); DefaultConsumer defaultConsumer = new DefaultConsumer(channel) { @Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { System.out.println("消費者222" + new String(body)); channel.basicAck(envelope.getDeliveryTag(), false); } }; channel.basicConsume("topicqueue2", false, defaultConsumer); } }

七、Spring的整合

1、pom依賴

<!--rabbitmq依賴 --><dependency><groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit</artifactId> <version>1.7.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.3.7.RELEASE</version> </dependency>

2、applicationContext

<!--1、定義連接工廠--><rabbit:connection-factory id="connectionFactory" host="127.0.0.1" username="lly" port="5672" password="lly"virtual-host="llyhost"></rabbit:connection-factory><!--消息是發送到交換機還是隊列--><!--定義rabbitmq的模板,如果發送到隊列則寫隊列,如果發送到交換機則寫交換機--><rabbit:template id="template" exchange="fanoutexchange" connection-factory="connectionFactory"></rabbit:template> <rabbit:admin connection-factory="connectionFactory"></rabbit:admin><!--定義隊列--><rabbit:queue name="myqueue" auto-declare="true"></rabbit:queue><!--定義交換機--><rabbit:fanout-exchange name="fanoutexchange" auto-delete="true"><!--將隊列綁定到交換機--><rabbit:bindings> <rabbit:binding queue="myqueue"></rabbit:binding> </rabbit:bindings> </rabbit:fanout-exchange><!--定義監聽器,當收到消息的時候會執行內部的配置--><rabbit:listener-container connection-factory="connectionFactory"><!--定義哪個類裡面的什麼方法用於收到的消息--><rabbit:listener ref="consumer" method="test" queue-names="myqueue"></rabbit:listener> </rabbit:listener-container><!--定義消費者--><bean id="consumer" class="com.epoint.cn.spring.MyConsumer"></bean>

3、消費者類

package com.epoint.cn.spring;public class MyConsumer {public void test(String message){ System.out.println(message); } }

4、 測試類

package com.epoint.cn.spring;import org.springframework.amqp.rabbit.core.RabbitTemplate;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class MyTest {public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); RabbitTemplate rabbitTemplate=applicationContext.getBean(RabbitTemplate.class); rabbitTemplate.convertAndSend("hellow!"); ((ClassPathXmlApplicationContext) applicationContext).destroy(); } }

八、rabbitmq持久化

消息發出去之後,萬一還沒有獲取到,ranbbitmq伺服器被重啟會導致數據丟失,這時候就需要持久化

1、生產者

package com.epoint.cn.route;import com.epoint.cn.util.ConnectionUtil;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.MessageProperties;public class Sender {private static final String EXCHANGE_NAME = "exchangesf";public static void main(String[] args) throws Exception {Connection connection = ConnectionUtil.getConnection(); Channel channel = connection.createChannel();//聲明持久化交換機channel.exchangeDeclare(EXCHANGE_NAME, "direct",true,false,null);//定義路由格式的交換機channel.basicPublish(EXCHANGE_NAME, "key1", MessageProperties.PERSISTENT_TEXT_PLAIN, "持久化消息1".getBytes());//關閉連接channel.close(); connection.close(); } }

2、消費者

package com.epoint.cn.route;import com.epoint.cn.util.ConnectionUtil;import com.rabbitmq.client.*;import java.io.IOException;public class Recever1 {private static final String EXCHANGE_NAME = "exchangesf";public static void main(String[] args) throws Exception {Connection connection = ConnectionUtil.getConnection(); Channel channel = connection.createChannel(); channel.exchangeDeclare(EXCHANGE_NAME, "direct",true,false,null); channel.queueDeclare("routequeue", true, false, false, null);//綁定隊列到交換機channel.queueBind("routequeue", EXCHANGE_NAME, "key1"); DefaultConsumer defaultConsumer = new DefaultConsumer(channel) { @Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { System.out.println("收到消息" + new String(body)); } }; channel.basicConsume("routequeue", true, defaultConsumer); } }

相關焦點

  • 浪潮NF8480M5,支撐新時代的企業級應用
    伴隨著雲、大數據、AI等創新技術和應用的發展普及,企業信息化應用系統以及應用環境都變得越來越複雜。傳統網際網路時代,提到企業級核心應用,大部分人都會想到資料庫、ERP、CRM等,但是,新出現的雲、大數據以及商業決策等都是影響全面的應用系統,是新的企業級核心應用。
  • RabbitMQ——什麼情況下應用RabbitMQ?
    RabbitMQ 簡介#MQ全稱為Message Queue, 消息隊列(MQ)是一種應用程式對應用程式的通信方法。應用程式通過讀寫出入隊列的消息(針對應用程式的數據)來通信,而無需專用連接來連結它們。消息傳遞指的是程序之間通過在消息中發送數據進行通信,而不是通過直接調用彼此來通信,直接調用通常是用於諸如遠程過程調用的技術。排隊指的是應用程式通過 隊列來通信。
  • 深信服發布企業級分布式存儲aStor-EDS
    在大會主論壇上,深信服副總裁陳彥彬隆重發布了深信服2019年春季重量級新品:企業級分布式存儲 aStor-EDS,標誌著深信服在雲計算領域又添一款強勢產品。  作為深信服雲計算業務版圖新成員,深信服企業級分布式存儲 aStor-EDS 集合 AI 人工智慧技術,通過分布式架構構建雲存儲服務資源。本次共發布兩個型號的分布式存儲一體機,以及可部署在 X86 伺服器上的 EDS 軟體。
  • 企業級路由要搬回家用?看完這幾點再考慮考慮吧
    我們平時所用到的路由器其實我們都可以稱之為家用路由器,和家用路由器相對應的就是企業級路由器。一聽到企業級路由,都認為企業級路由會更厲害一些。不少人有這樣的疑問,既然性能那麼強為什麼不能拿到家裡來用,畢竟現在的企業級路由也可以做的十分輕巧。但性能強大就真的合適嗎?三點告訴你不要把企業級路由器搬回家第一、外觀相比家用路由不美觀。
  • 北大教授耗時一年編寫最新版Spring Boot企業級應用開發實戰PDF版
    前言鑑於Spring Boot技術人才在社會上的需求依然很旺盛,而市面上有關Spring Boot學習資料,大多停留在「Hello World」級別的案例,缺乏使用Spring Boot來構建完整企業級應用實戰的能力。
  • 浪潮NF8380M5和NE5250M5入選CRN2019年度十大企業級伺服器
    浪潮NE5250M5入選CRN全球十大企業級伺服器  CRN雜誌為美國著名渠道媒體,內容覆蓋15萬供應商企業以及150萬科技領域受眾,在商業  CRN認為,伺服器市場未來的增長點主要來自人工智慧、雲計算、VDI(virtual desktop infrastructure)以及邊緣計算等應用,據此,伺服器市場的頭部廠商如Dell、HPE、浪潮圍繞異構加速、存儲、IO負載等方面對伺服器進行優化設計。
  • 慧榮科技推出搭配完整Turkey的16通道PCIe 4.0 NVMe企業級SSD主控...
    SM8266提供完整的開發平臺,包括NVMe固件堆棧和硬體參考設計套件,讓客戶的企業級SSD能大幅縮短產品開發時程,搶佔市場先機。慧榮科技市場營銷暨研發資深副總段喜亭表示:「SM8266是目前市場上唯一能夠提供完整Turnkey的PCIe Gen 4企業級SSD解決方案。慧榮上一代的Gen 3 Turnkey解決方案讓我們累積更豐富的客戶產品開發及銷售經驗。
  • rabbitMQ系列高級整合應用rabbitTemplate
    本文是《rabbitMq精講系列》教程中的:rabbitMQ精講系列第二十篇高級整合應用第三篇 rabbitTemplate對象。系列教程,建議從第一篇看起。
  • 深信服重磅發布:企業級分布式存儲aStor-EDS
    在大會主論壇上,深信服副總裁陳彥彬隆重發布了深信服 2019 年春季重量級新品:企業級分布式存儲aStor-EDS,標誌著深信服在雲計算領域又添一款強勢產品。作為深信服雲計算業務版圖新成員,深信服企業級分布式存儲aStor-EDS集合AI人工智慧技術,通過分布式架構構建雲存儲服務資源。本次共發布兩個型號的分布式存儲一體機,以及可部署在X86 伺服器上的EDS軟體。
  • 雲計算告別DIY時代 專有雲挑起企業級市場大梁
    而針對困擾客戶的「數據孤島」、「煙囪式應用」、「割裂的跨部門協作」等問題。阿里雲推出了基於專有公共雲與「中臺架構」的整體解決方案。以真正的雲與真正解決客戶困境的網際網路架構開啟企業以雲來推進數位化轉型的最佳實踐。
  • 紫光發布企業級SSD P8260硬碟:3D快閃記憶體、主控、內存均為紫光產品……
    強大硬體與高效固件之間的完美結合,可以為用戶提供多樣化、差異化的高性能、高可靠性、高穩定性特質的企業級SSD。該產品在安全存儲領域具有較強競爭力,能夠針對不同用戶的需求提供理想的定製化選擇。目前,紫光P8260提供1TB/2TB兩種容量,以及AIC和U.2兩種產品形態接口。
  • 奇點鄰近:中國企業級服務領域存在千億美金市值的機會
    第三我們現在的經濟是全球化的經濟,我們任何一個APP和網站,任何一個應用都可能會有幾千、幾萬、到現在幾十萬、幾百萬甚至上千萬的用戶,現在的時間點隨著各種各樣的東西興起,一個APP可能一夜時間獲取一百萬用戶。以前覺得這完全不可能,原來開發一個應用程式,大多數情況下是由公司內部幾十個人在使用。現在一個APP是由幾千萬人在用,這是一個非常大的變化。
  • 大黃狗管車|憑什麼稱為高質量的企業級貨車車隊管理系統軟體?
    我爸爸給我買了一個大黃狗管車我一點也不用操心了@大黃狗管車總有人問憑什麼我稱為高質量的企業級貨車車隊管理系統軟體?
  • 阿里雲發布ECS企業級產品家族 19款實例族涵蓋173個應用場景
    為滿足企業級客戶對計算的高標準需求,8月9日,阿里雲正式發布雲伺服器ECS企業級產品家族,目前已推出面向173種企業應用場景的19款實例。該系列適合在複雜的企業計算環境下,滿足對於高性能、高可靠的計算需求。
  • 象輯首推企業級智能網格預報,助商業氣象邁上新臺階
    由此,近年來,在數值天氣預報基礎上,應用AI、大數據、雲計算技術的「智能網格預報」應運而生。所謂「網格」預報,就是以定量的客觀預報模型輸出的格點預報為基礎的天氣預報。隨著氣象衛星的發展和信息技術的有力支撐,數值天氣預報的解析度和準確性持續提升。
  • 基於OSGi和Spring開發Web應用
    作為一個新的事實上的工業標準,OSGi 已經受到了廣泛的關注, 其面向服務(接口)的基本思想和動態模塊部署的能力, 是企業級應用長期以來一直追求的目標。Spring 是一個著名的 輕量級 J2EE 開發框架,其特點是面向接口編程和非侵入式的依賴注入。
  • Tanzu雲原生平臺與Tanzu Pivotal Labs應用現代化服務能力相結合...
    幫助企業定製和規劃清晰的上雲路徑,提供健壯的企業級PaaS/CaaS平臺,豐富和強大的CI/CD,DevOps等軟體工具套件,並利用業界領先的最佳實踐和方法論幫助企業對流程和文化做出變革,以適應上雲後的一系列變化,助力企業以更靈活的姿態面對市場。
  • 企業級雲原生:TKEStack 騰訊雲原生開源實踐之路
    導語丨TKEStack 是騰訊開源的一款集強壯性和易用性於一身的企業級容器編排引擎,是開放原子開源基金會的孵化項目之一。本文是對TKEStack 開源項目負責人汝英哲、TKEStack 高級產品經理何鵬飛在雲+社區沙龍online的分享整理,介紹 TKEStack 的開源方法論,希望與大家一同交流。
  • 青雲科技與米文動力以雲邊融合創新軌道交通應用
    9月28日,青雲QingCloud (qingcloud.com)宣布與面向全球的智能邊緣計算產品及解決方案提供商米文動力達成戰略合作,在企業邊緣端算力提升需求日益顯著的背景下, 雙方將共同拓展雲邊融合的行業創新應用,加速不同領域智能應用的產業化進程。