Zeebe服務學習1-簡單部署與實現demo


1.Zeebe是什么?

Camunda公司研發的工作流引擎Zeebe,目標是對微服務的編排。具體詳細介紹可以參考官網:https://zeebe.io/what-is-zeebe/

2.背景

隨着微服務的發展,大家都單體服務進行了拆分,解耦,這樣做引發了另外的一個問題:之前一個接口實現的功能,現在需要調用幾個接口才能完成。如何解決這些原子性的接口呢?

這時候我們想到了Zeebe服務。

3.服務部署

  3.1 第一步:安裝環境,不管你是Linux系統還是Win系統,首先需要安裝上docker,因為我的機器是Win系統,本文就是介紹Windows系統下安裝使用情況

  確保機器已經安裝docker(沒有安裝的可以下載docker-win,進行安裝)

3.2 第二步:在cmd里面執行命令:

docker run --name zeebe -p 26500:26500 camunda/zeebe:latest

  至此,Zeebe服務已經安裝成功了。

4.demo

4.1 第一步:創建一個控制台項目,這個應該都會

4.2 第二步:在項目中引用Zeebe客戶端的nuget包,目前版本是0.11.0

4.3 第三步:建模,使用Zeebe Modeler工具進行建模

我需要實現的流程是:

 

 具體的BPMN代碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:zeebe="http://camunda.org/schema/zeebe/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_1011qyd" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Zeebe Modeler" exporterVersion="0.6.2">
  <bpmn:process id="instock-process" name="instock-process" isExecutable="true">
    <bpmn:startEvent id="start" name="start">
      <bpmn:outgoing>SequenceFlow_instock</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:serviceTask id="createinstock" name="createinstock">
      <bpmn:extensionElements>
        <zeebe:taskDefinition type="createinstock" retries="3" />
        <zeebe:ioMapping>
          <zeebe:input source="InStockData" target="InStockData" />
        </zeebe:ioMapping>
      </bpmn:extensionElements>
      <bpmn:incoming>SequenceFlow_instock</bpmn:incoming>
      <bpmn:outgoing>SequenceFlow_modifystock</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:sequenceFlow id="SequenceFlow_instock" name="SequenceFlow_instock" sourceRef="start" targetRef="createinstock" />
    <bpmn:serviceTask id="modifystock" name="modifystock">
      <bpmn:extensionElements>
        <zeebe:taskDefinition type="modifystock" retries="3" />
        <zeebe:ioMapping>
          <zeebe:input source="StockData" target="StockData" />
        </zeebe:ioMapping>
      </bpmn:extensionElements>
      <bpmn:incoming>SequenceFlow_modifystock</bpmn:incoming>
      <bpmn:outgoing>SequenceFlow_gateway</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:sequenceFlow id="SequenceFlow_modifystock" name="SequenceFlow_modifystock" sourceRef="createinstock" targetRef="modifystock" />
    <bpmn:exclusiveGateway id="checknum" name="checknum">
      <bpmn:incoming>SequenceFlow_gateway</bpmn:incoming>
      <bpmn:outgoing>morethan300</bpmn:outgoing>
      <bpmn:outgoing>lessthan300</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:sequenceFlow id="SequenceFlow_gateway" name="SequenceFlow_gateway" sourceRef="modifystock" targetRef="checknum" />
    <bpmn:serviceTask id="notify" name="notify">
      <bpmn:extensionElements>
        <zeebe:taskDefinition type="notify" retries="3" />
      </bpmn:extensionElements>
      <bpmn:incoming>morethan300</bpmn:incoming>
      <bpmn:outgoing>SequenceFlow_end</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:sequenceFlow id="morethan300" name="&#62;=300" sourceRef="checknum" targetRef="notify">
      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">stocknum&gt;=300</bpmn:conditionExpression>
    </bpmn:sequenceFlow>
    <bpmn:endEvent id="end" name="end">
      <bpmn:incoming>lessthan300</bpmn:incoming>
      <bpmn:incoming>SequenceFlow_end</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="lessthan300" name="lessthan300" sourceRef="checknum" targetRef="end">
      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">stocknum&lt;300</bpmn:conditionExpression>
    </bpmn:sequenceFlow>
    <bpmn:sequenceFlow id="SequenceFlow_end" name="SequenceFlow_end" sourceRef="notify" targetRef="end" />
  </bpmn:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="instock-process">
      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="start">
        <dc:Bounds x="112" y="159" width="36" height="36" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="119" y="202" width="23" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="ServiceTask_0zssdcw_di" bpmnElement="createinstock">
        <dc:Bounds x="265" y="137" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="SequenceFlow_0yllvib_di" bpmnElement="SequenceFlow_instock">
        <di:waypoint x="148" y="177" />
        <di:waypoint x="265" y="177" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="163" y="159" width="88" height="27" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="ServiceTask_1db0jmn_di" bpmnElement="modifystock">
        <dc:Bounds x="481" y="137" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="SequenceFlow_1uaplin_di" bpmnElement="SequenceFlow_modifystock">
        <di:waypoint x="365" y="177" />
        <di:waypoint x="481" y="177" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="383" y="159" width="80" height="27" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="ExclusiveGateway_1sjnk3d_di" bpmnElement="checknum" isMarkerVisible="true">
        <dc:Bounds x="723" y="152" width="50" height="50" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="722" y="128" width="51" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="SequenceFlow_1hhfiqd_di" bpmnElement="SequenceFlow_gateway">
        <di:waypoint x="581" y="177" />
        <di:waypoint x="723" y="177" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="610" y="159" width="85" height="27" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="ServiceTask_016w4wa_di" bpmnElement="notify">
        <dc:Bounds x="954" y="319" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="SequenceFlow_1ffqddr_di" bpmnElement="morethan300">
        <di:waypoint x="748" y="202" />
        <di:waypoint x="748" y="359" />
        <di:waypoint x="954" y="359" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="839" y="341" width="32" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="EndEvent_01b3gni_di" bpmnElement="end">
        <dc:Bounds x="1208" y="159" width="36" height="36" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="1217" y="202" width="19" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="SequenceFlow_00imkpl_di" bpmnElement="lessthan300">
        <di:waypoint x="773" y="177" />
        <di:waypoint x="1208" y="177" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="961" y="159" width="60" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="SequenceFlow_0c9jvp6_di" bpmnElement="SequenceFlow_end">
        <di:waypoint x="1004" y="319" />
        <di:waypoint x="1004" y="177" />
        <di:waypoint x="1208" y="177" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="977" y="245" width="85" height="27" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn:definitions>
View Code

4.4 第四步:寫代碼

(1)客戶端代碼:

 internal class Program
    {
        private static readonly string DemoProcessPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Resources", "instock-process.bpmn");
        private static readonly string ZeebeUrl = "127.0.0.1:26500";
        private static dynamic WorkflowInstanceVariables = new
        {
            stocknum = 100
        };
        public static async Task Main(string[] args)
        {
            InitClient.Initialize();

            // create zeebe client
            var client = ZeebeClient.NewZeebeClient(ZeebeUrl);
            // deploy
            // var deployResponse = await client.NewDeployCommand().AddResourceFile(DemoProcessPath).Send();

            // create workflow instance
            // var workflowKey = deployResponse.Workflows[0].WorkflowKey;//2251799813685495
            // 模擬調用
            var workflowInstance = await client
                .NewCreateWorkflowInstanceCommand()
                .WorkflowKey(2251799813685495)
                .Variables(JsonConvert.SerializeObject(WorkflowInstanceVariables))
                .Send();

        }
}

(2)服務端代碼:

 internal class Program
    {
        private static Dictionary<string, string> JobTypeAndMethod = new Dictionary<string, string>()
        {
            { "createinstock","InStockJobHandler"},
            { "modifystock","StockJobHandler"},
            { "notify","NotifyJobHandler"}
        };
        private static readonly string ZeebeUrl = "127.0.0.1:26500";
        public static async Task Main(string[] args)
        {
            InitClient.Initialize();

            // create zeebe client
            var client = ZeebeClient.NewZeebeClient(ZeebeUrl);

            // open job worker
            await OpenJobWorkers(client);
        }

        private static Task OpenJobWorkers(IZeebeClient client)
        {
            
            using (var signal = new EventWaitHandle(false, EventResetMode.AutoReset))
            {
                foreach (var item in JobTypeAndMethod)
                {
                    client.NewWorker()
                        .JobType(item.Key)
                        .Handler(JobHandlerFactory.GetJobType(item.Value))
                        .MaxJobsActive(5)
                        .Name(item.Key)
                        .AutoCompletion()
                        .PollInterval(TimeSpan.FromSeconds(1))
                        .Timeout(TimeSpan.FromSeconds(10))
                        .Open();
                }
                // blocks main thread, so that worker can run
                signal.WaitOne();
            }
            return Task.CompletedTask;
        }

    }

客戶端的代碼中,只有第一次會將BPMN文件進行部署,Zeebe服務會返回一個Key,之后如果建模數據不發生改變的情況下,就可以直接使用key進行調用即可了,如果發生變化需要再一次部署才行;

每次部署都會改變工作流程的Version值(默認獲取的事latestVersion)。

至此,一個簡單的Zeebe Demo實現了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM