Linux系統 Centos7 環境基於Docker部署Rocketmq服務

来源:https://www.cnblogs.com/mazhilin/archive/2020/07/07/13258674.html
-Advertisement-
Play Games

消息隊列 基本概述 MQ,Message Queue,基於TCP協議構建的簡單協議,區別於具體的通信協議。 基於通信協議定義和抽象的更高層次的通信模型,一般都是生產者和消費者模型,又或者說服務端和客戶端模型。 生產者/消費者模型:一般通過定義生產者和消費者實現消息通信從而屏蔽複雜的底層通信協議。應用 ...


消息隊列

基本概述

MQ,Message Queue,基於TCP協議構建的簡單協議,區別於具體的通信協議

  • 基於通信協議定義和抽象的更高層次的通信模型,一般都是生產者和消費者模型,又或者說服務端和客戶端模型

  • 生產者/消費者模型:一般通過定義生產者和消費者實現消息通信從而屏蔽複雜的底層通信協議。應用於分散式應用系統,而且為之提供非同步解耦和削峰填谷的能力,同時也具備互聯網應用所需的海量堆積,高吞吐和可靠性重試機制的特性。

核心概念

  1. 消息主題:Message Topic,一級消息類型,生產者向其發送消息
  2. 消息生產者:Message Producer,消息發佈者,或者消息服務終端,負責生產消息和發送消息到消息主題
  3. 消息消費者:Message Consumer,消息訂閱者,或者消息客戶終端,負責從消息主題接收並處理消費消息
  4. 消息實體:Message Object,消息對象,生產者向消息主題發送並最終傳送給消息者的數據和屬性的符號以及組合
  5. 消息屬性:Message Attributes,消息內容,生產者對消息進行抽象和定義的相關屬性,包含Message Key 和Message Target
  6. 消息組:Message Group,消息分類組別,通稱一類生產者和消費者,通常生產和消費同一類消息,且消息發佈和訂閱的邏輯基本一致

編程思想

數據結構:消息隊列的數據結構採用FIFO方式來定義與實現
設計模式:採用觀察者模式

觀察者模式:定義對象間一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知自動更新

消息流派:

  • 有Broker:基於消息中間件,所有消息通過中間件中轉,基於Broker把消息推送給消費者[消費者主動輪詢]
    1.重Topic:Kafka和RocketMq,Activemq,生產者把消息發送Key和數據到Broker,然後由Broker比較Key之後決定推送給具體的消費者[推送消息給消費者]
    2.輕Topic:Rabbitmq[AMQP],生產者把生產消息且發送Key和數據,消費者定義訂閱的隊列,Broker收到請求之後,按照一定的邏輯和規則計算出相應的Key對應的隊列,然後把消息推送給具體的消費者[消費者向生產者訂閱消息,消費者主動拉取消息]
  • 無Broker:基於Socket網路[傳輸層]直連通信,代表作ZeroMQ

基本概述

Uio5Ps.png

NameServer名稱伺服器[MQ命名空間伺服器],大致相當於 jndi技術,更新和發現 broker服務。用於保存Broker相關元信息,並給生產者和消費者查找Broker消息。每個Broker在啟動都會在名稱伺服器[NameServer]註冊,生產者在發送消息前會根據消息主題到名稱伺服器查詢獲取Broker路由消息,消費者也會定時獲取主題的路由消息。

ps:屬於無狀態服務設計,可橫向擴展,節點之間無通信,可以部署多台機器來標識偽集群。

Broker:消息存儲中心[消息中轉角色],負責存儲和轉發消息。接收來自生產者的消息併進行存儲,消費者從這拉取消息。存儲與消息相關的元數據,主要包括用戶組,消息進度偏移量,隊列消息等。其中Broker分為Master和Slave節點:

  1. Master節點:可讀可寫
  2. Slave節點:只可讀不可寫
    其部署方式:
  • 單機Master:Broker重啟和宕機之後服務不可用,不建議生產使用
  • 多機Master:所有消息伺服器均是Master,沒有Slave。
    優點:配置簡單,單個Master重啟和宕機維護對應用無影響
    缺點:單機重啟和宕機期間,機器上未被消費的消息在機器恢復期間不可訂閱,消息實時性會受影響
  • 多機Master多機Slave[同步雙寫]:
    優點:數據和服務無單點故障,Master重啟和宕機消息無延遲,數據和服務可用高
    缺點:相對非同步複製性能較低,發送消息的延時較高
  • 多機Master多機Slave[非同步複製]:
    優點:消息丟失較少,實時性高,Master重啟和宕機可繼續從Slave消費
    缺點:Master重啟和宕機後在磁碟損壞會導致消息丟失,但是情況比較少

ps:一個Master可以對應多個Slave,但是一個Slave只能對應一個Master。Master和Slave的對應關係通過指定相同的BrokerName,不同的BrokerId來定義。BrokerId為0表示Master,BrokerId非0表示Slave。然後所有的Broker和Name Server上的節點建立長連接,定時註冊Topic信息到所有Name Server。

Producer消息生產者->負責生產消息,生產者向消息伺服器發送業務應用程式生成的消息。主要有同步發送和非同步發送方式兩種,其中:

  • 同步發送:消息發送方發出數據後,在消息接收方發送響應之後再發送下一個數據。一般適用於重要消息通知場景[重要通知郵件,營銷簡訊推送]
  • 非同步發送:消息發送方發出數據後,不用等待接收方發迴響應,接著發送下一個數據。一般適用於鏈路耗時較長,而對響應時間敏感的業務場景[視頻上傳通知 啟動自動轉碼服務處理通知]
  • 單向發送:負責發送消息而不等待伺服器回應且沒有回調函數觸發。一般適用於對可靠性要求不高的業務場景[日誌收集]

ps:Producer與Name Server其中一個節點建立連接。定期從Name Server取Topic信息。並與提供該Topic信息的Master建立長連接。Producer也可以集群部署。

Consumer消息消費者 負責消費消息,從消息伺服器拉取消息並將其輸入用戶應用程式中。主要分為拉取型消費者和推送型消費者:
拉取型消費者:Pull Consumer->主動從消息伺服器拉取消息,只要批量拉取消息,用戶就會啟動消費過程
推送型消費者:Push Consumer->封裝消息的拉取,消費進度和其它內部維護工作,消息到達之後便執行回調介面留給用戶應用程式來實現。屬於被動消費類型,Push拉取時需要註冊消息費者監聽器,當監聽器被觸發之後開始消費消息。

ps:Consumer 與Name Server 集群中的其中一個節點(隨機選擇)建立長連接,定期從Name Server 取Topic 路由信息,並向提供Topic服務的Master、Slave建立長連接,且定時向Master、Slave發送心跳。Consumer既可以從Master訂閱消息,也可以從Slave訂閱消息,訂閱規則由Broker配置決定。

部署Rocketmq

拉取rocketmq鏡像:docker pull foxiswho/rocketmq
1.查詢鏡像images:docker search rocketmq

[root@centos-meteor ~]# docker search rocketmq
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
styletang/rocketmq-console-ng      rocketmq-console-ng                             20                                      
rocketmqinc/rocketmq               Image repository for Apache RocketMQ            17                                      
foxiswho/rocketmq                  rocketmq                                        14                                      
laoyumi/rocketmq                                                                   10                                      [OK]
xlxwhy/rocketmq                    alibaba's rocketmq                              4                                       
huanwei/rocketmq-broker                                                            2                                       
2019liurui/rocketmq-broker         RocketMQ broker image for RocketMQ-Operator     1                                       
2019liurui/rocketmq-namesrv        RocketMQ name service image for RocketMQ-Ope…   1                                       
apacherocketmq/rocketmq            Docker Image for Apache RocketMQ                1                                       
rocketmqinc/rocketmq-operator      The Kubernetes operator for RocketMQ            0                                       
2019liurui/rocketmq-operator       Kubernetes Operator for RocketMQ !              0                                       
apacherocketmq/rocketmq-operator   RocketMQ Operator is to manage RocketMQ serv…   0                                       
coder4/rocketmq                    rocketmq                                        0                                       [OK]
rocketmqinc/rocketmq-namesrv       Customized RocketMQ Name Server Image for Ro…   0                                       
rocketmqinc/rocketmq-broker        Customized RocketMQ Broker Image for RocketM…   0                                       
slpcat/rocketmq-console-ng                                                         0                                       
huanwei/rocketmq                                                                   0                                       
huanwei/rocketmq-broker-k8s                                                        0                                       
king019/rocketmq                   rocketmq                                        0                                       
pengzu/rocketmq-console-ng         web console for rocketmq ,this code is from …   0                                       
fengzt/rocketmq-broker             apache rocketmq 4.2.0 broker server(官方文檔…       0                                       
huanwei/rocketmq-operator                                                          0                                       
slpcat/rocketmq                                                                    0                                       
fengzt/rocketmq-nameserver         apache rocketmq 4.2.0 nameserver                0                                       
icyblazek/rocketmq                 RocketMQ                                        0                                       
[root@centos-meteor ~]# 

2.執行:docker pull foxiswho/rocketmq

3.創建docker存儲根目錄並且授權:
mkdir docker && chmod -R 777 docker/

[root@centos-meteor /]# cd docker/
[root@centos-meteor docker]# pwd
/docker
[root@centos-meteor docker]# 

4.部署名稱伺服器rocketmq-namesrv-server[9876]:

rocketmq-namesrv-server

docker run -itd --restart=always --privileged=true -p 9876:9876 --name rocketmq-namesrv-server -v /docker/rocketmq/namesrv/logs:/root/rocketmq/logs -v /docker/rocketmq/namesrv/store:/root/rocketmq/store -e "MAX_POSSIBLE_HEAP=100000000" -e "JAVA_OPTS=-Duser.home=/opt" -e "JAVA_OPT_EXT=-server -Xms512m -Xmx512m -Xmn256m" rocketmqinc/rocketmq sh mqnamesrv

docker run -itd --restart=always --privileged=true -p 9876:9876 --name  rocketmq-namesrv-server -v /docker/rocketmq/namesrv/logs:/root/rocketmq/logs -v /docker/rocketmq/namesrv/store:/root/rocketmq/store -e "MAX_POSSIBLE_HEAP=100000000" -e "JAVA_OPTS=-Duser.home=/opt" -e "JAVA_OPT_EXT=-server -Xms512m -Xmx512m -Xmn256m" rocketmqinc/rocketmq sh mqnamesrv

ps:創建/docker/rocketmq/namesrv/logs和/docker/rocketmq/namesrv/store目錄

5.部署消息伺服器rocketmq-broker-server[10911]:

rocketmq-broker-server

docker run -itd --restart=always --privileged=true -p 10909:10909 -p 10911:10911 -p 10912:10912 --name rocketmq-broker-server --link rocketmq-namesrv-server:namesrv -v /docker/rocketmq/broker/logs:/root/rocketmq/logs -v /docker/rocketmq/broker/store:/root/rocketmq/store -v /docker/rocketmq/broker/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf -e "NAMESRV_ADDR=namesrv:9876" -e "MAX_POSSIBLE_HEAP=200000000" -e "JAVA_OPTS=-Duser.home=/opt" -e "JAVA_OPT_EXT=-server -Xms512m -Xmx512m -Xmn256m" rocketmqinc/rocketmq sh mqbroker -c /opt/rocketmq-4.4.0/conf/broker.conf

docker run -itd --restart=always --privileged=true -p 10909:10909 -p 10911:10911 -p 10912:10912 --name  rocketmq-broker-server --link rocketmq-namesrv-server:namesrv -v /docker/rocketmq/broker/logs:/root/rocketmq/logs -v /docker/rocketmq/broker/store:/root/rocketmq/store -v /docker/rocketmq/broker/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf -e "NAMESRV_ADDR=namesrv:9876" -e "MAX_POSSIBLE_HEAP=200000000" -e "JAVA_OPTS=-Duser.home=/opt" -e "JAVA_OPT_EXT=-server -Xms512m -Xmx512m -Xmn256m" rocketmqinc/rocketmq sh mqbroker -c /opt/rocketmq-4.4.0/conf/broker.conf

ps:
1.創建/docker/rocketmq/broker/logs和/docker/rocketmq/broker/store目錄
2.編寫broker.conf配置文件:

brokerClusterName = rocketmq-cluster  
brokerName = broker-server 
brokerId = 0  
deleteWhen = 04  
fileReservedTime = 48  
# Broker 的角色
# - ASYNC_MASTER 非同步複製Master
# - SYNC_MASTER 同步雙寫Master
# - SLAVE
brokerRote=ASYNC_MASTER
brokerRole = ASYNC_MASTER  
flushDiskType = ASYNC_FLUSH  
# 如果是本地程式調用雲主機 mq,這個需要設置成 雲主機 IP
brokerIP1=Server-IP
#限制的消息大小
maxMessageSize=65536
# 檢測物理文件磁碟空間
diskMaxUsedSpaceRatio=88
mapedFileSizeCommitLog=1073741824
mapedFileSizeConsumeQueue=50000000
#併發send線程數,多線程來發送消息可能會出現broker busy
sendMessageThreadPoolNums=128
useReentrantLockWhenPutMessage=true
#在發送消息時,自動創建伺服器不存在的topic,預設創建的隊列數 
defaultTopicQueueNums=8
highSpeedMode=false
commercialBaseCount=1
maxErrorRateOfBloomFilter=20
accessMessageInMemoryMaxRatio=40
#無讀寫客戶端存活時間
clientChannelMaxIdleTimeSeconds=120
flushDelayOffsetInterval=10000
serverSocketRcvBufSize=131072
#單次 Pull 消息(記憶體)傳輸的 最大位元組數
maxTransferBytesOnMessageInMemory=262144
clientManageThreadPoolNums=32
serverChannelMaxIdleTimeSeconds=120
serverCallbackExecutorThreads=0
enablePropertyFilter=false
transientStorePoolSize=5
enableConsumeQueueExt=false
#rocketmq server config
serverPooledByteBufAllocatorEnable=true
serverSocketRcvBufSize=131072
#rocketmq client config

6.部署控制後臺rocketmq-consloe-server[8082]:

rocketmq-consloe-server

docker run -itd -p 8082:8080 --restart=always --privileged=true --name rocketmq-console-server -v /docker/rocketmq/console/data:/tmp -e "JAVA_OPTS=-Drocketmq.namesrv.addr=47.104.22.10:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" -e "JAVA_OPT_EXT=-server -Xms512m -Xmx512m -Xmn256m -Duser.home=/opt" styletang/rocketmq-console-ng:latest

docker run -itd -p 8082:8080  --restart=always --privileged=true  --name rocketmq-console-server -v /docker/rocketmq/console/data:/tmp -e "JAVA_OPTS=-Drocketmq.namesrv.addr=Server-IP:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" -e "JAVA_OPT_EXT=-server -Xms512m -Xmx512m -Xmn256m -Duser.home=/opt" styletang/rocketmq-console-ng:latest

ps:
1.創建/docker/rocketmq/console/data目錄
2.Server-IP為broker.conf配置brokerIP1值

7.最終部署結果:
UFZUL6.png

整合Rocketmq開發實戰

1.配置Rocketmq的Maven依賴:

<!-- https://mvnrepository.com/artifact/org.apache.rocketmq/rocketmq-client -->
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-client</artifactId>
    <version>4.4.0</version>
</dependency>

ps:
1.目前rocketmq最新版本是4.7.1:

<!-- https://mvnrepository.com/artifact/org.apache.rocketmq/rocketmq-client -->
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-client</artifactId>
    <version>4.7.1</version>
</dependency>

2.這裡選擇的是rocketmq版本[4.4.0],因為部署是4.4.0版本,推薦部署版本相同的rocketmq

2.創建pivotal-cloud-queue工程:
UFe878.png

ps:創建消息隊列統一模塊工程,在業務應用程式服務模塊依賴該工程,並封裝消息生產者[Producer]和消息消費者[Consumer]處理類。

3.封裝rocketmq屬性配置類:

添加spring-boot-configuration-processor依賴:

  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
    <scope>provided</scope>
 </dependency>
 <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-configuration-processor</artifactId>
   <optional>true</optional>
 </dependency>

編寫RocketmqProperties屬性配置類:
UFMlo6.png

package com.pivotal.cloud.queue.properties;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
 * @className: com.pivotal.cloud.queue.properties.RocketmqProperties
 * @title: RocketmqProperties
 * @description: 封裝Pivotal項目RocketmqProperties類
 * @content: PivotalCloud項目系統RocketmqProperties自定義屬性配置類
 * @author: marklin
 * @datetime: 2020-07-07 01:32
 * @version: 1.0.0
 * @copyright: Copyright © 2018-2020 Pivotal Systems Incorporated. All rights reserved.
 */
@Data
@Configuration
@ConfigurationProperties(prefix = "pivotal.cloud.rocketmq")
public class RocketmqProperties {
    /**
     * rocketmq消息隊列生產者-Producer
     */
    private final Producer producer = new Producer();

    /**
     * rocketmq消息隊列消費者-Consumer
     */
    private final Consumer consumer = new Consumer();

    @Data
    public static class Producer {
    }

    @Data
    public static class Consumer {
    }
}

編寫RocketmqConfiguration配置類:
UFM2Os.png

package com.pivotal.cloud.queue.configuration;

import com.pivotal.cloud.queue.properties.RocketmqProperties;
import lombok.AllArgsConstructor;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
 * @className: com.pivotal.cloud.queue.configuration.RocketmqConfiguration
 * @title: RocketmqConfiguration
 * @description: 封裝Pivotal項目RocketmqConfiguration類
 * @content: //TODO
 * @author: marklin
 * @datetime: 2020-07-07 02:25
 * @version: 1.0.0
 * @copyright: Copyright © 2018-2020 Pivotal Systems Incorporated. All rights reserved.
 */
@AllArgsConstructor
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties({RocketmqProperties.class})
public class RocketmqConfiguration {
}

編寫RocketmqTemplate生產者模板類:

package com.pivotal.cloud.queue.template;

/**
 * @className: com.pivotal.cloud.queue.template.RocketmqTemplate
 * @title: RocketmqTemplate
 * @description: 封裝Pivotal項目RocketmqTemplate類
 * @content: PivotalCloud項目系統RocketmqTemplate生產者模板類
 * @author: marklin
 * @datetime: 2020-07-07 02:48
 * @version: 1.0.0
 * @copyright: Copyright © 2018-2020 Pivotal Systems Incorporated. All rights reserved.
 */
public class RocketmqTemplate {
}

編寫RocketmqListener消費者監聽器類:
UFMsfS.png

package com.pivotal.cloud.queue.listener;

/**
 * @className: com.pivotal.cloud.queue.listener.RocketmqListener
 * @title: RocketmqListener
 * @description: 封裝Pivotal項目RocketmqListener類
 * @content: PivotalCloud項目系統RocketmqListener消費者監聽器類
 * @author: marklin
 * @datetime: 2020-07-07 02:52
 * @version: 1.0.0
 * @copyright: Copyright © 2018-2020 Pivotal Systems Incorporated. All rights reserved.
 */
public interface RocketmqListener {
}

編寫META-INF/spring.factories工廠類:
UFM5kV.png

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.pivotal.cloud.queue.configuration.RocketmqConfiguration,\
  com.pivotal.cloud.queue.configuration.RabbitmqConfiguration,\
  com.pivotal.cloud.queue.configuration.ActivemqConfiguration,\
  com.pivotal.cloud.queue.configuration.KafkaConfiguration,

版權聲明:本文為博主原創文章,遵循相關版權協議,如若轉載或者分享請附上原文出處鏈接和鏈接來源。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 前幾天,我接到了一個項目,模塊中要寫一個卡券效果,當時沒有圖片,也就是要用css來實現,當時我是懵逼的,也沒有寫過這樣的,一時間不知道怎麼寫,畢竟要寫的像UI設計的一樣美觀。我就只好求救我的大神級別的同事了。不僅css玩的溜,人家JavaScript玩的更溜,閣下實在是佩服。 常見的卡券樣式如 ...
  • 題目 function Foo() { getName = function () { alert (1); }; return this; } Foo.getName = function () { alert (2);}; Foo.prototype.getName = function ()  ...
  • 具體開發中遇到的問題如下, 數據表格內的 內容 通過 table.cache["SampleList"] 修改後,重新渲染或重新載入會導致當前操作的分頁 和 配置被清空。我修改了第5頁第X行的X列值,重新渲染後就回到了最原始第1頁或重新調用了介面。 Layui 官方提供的文檔 提供的刷新表格方法有幾 ...
  • 今天看見徒弟寫個css屬性這麼慢,是在是看不下去了,就問了他有沒有用過一些輔助工具,他說沒有,額。。。我也是很無語,沒辦法,誰叫我是他師傅呢。還是要盡到一個師傅的責任。所以就利用休息時間給他講了19個輔助工具,滿滿的乾貨呀。我這也是第一次給別人說這麼多,這麼詳細,想想還不錯,教給別人東西的感覺是不一 ...
  • 2020年是充滿機遇與挑戰的一年,這一年註定不平凡。隨著5G商用、傳統產業數字化轉型加快,我們完全可以想象到互聯網行業即將迎來自己的“高光時刻”,因此,現在學習web前端正當時。 那麼,對於零基礎小白而言,如何才能快速學習web前端呢?下麵,就為大家分享2020年web前端學習路線。 很多對於web ...
  • 本文將介紹 CSS 中一個非常有意思的屬性 mask 。 顧名思義,mask 譯為遮罩。在 CSS 中,mask 屬性允許使用者通過遮罩或者裁切特定區域的圖片的方式來隱藏一個元素的部分或者全部可見區域。 其實 mask 的出現已經有一段時間了,只是沒有特別多實用的場景,在實戰中使用的非常少,本文將羅 ...
  • 背景 我是一名程式員,從事前端開發,一個月15K,在北京雖是月光族但日子也還可以過下去;女朋友就沒有這麼幸運了,受疫情的影響,公司裁員。。。從4月開始就一直在找工作,但都不順利,不是工資低到可憐就是面試後沒有下文; 身邊的朋友都開玩笑的說,你也可以和你男朋友一樣從事前端開發呀!!! 我天。。。反對。 ...
  • 上次成功搭建了vue + electron的helloworld程式,這次將electron應用打包及自動升級的流程梳理了一下。 1. 應用打包 使用electron builder打包只需要在vue.config.js中配置即可,這裡需要註意的是,預設情況下electron builder打包出來 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...