4000-520-616
欢迎来到免疫在线!(蚂蚁淘生物旗下平台)  请登录 |  免费注册 |  询价篮
主营:原厂直采,平行进口,授权代理(蚂蚁淘为您服务)
咨询热线电话
4000-520-616
当前位置: 首页 > 新闻动态 >
热卖商品
新闻详情
Mule的学习(一、mule的认知)_Walker_zmc的博客-CSDN博客
来自 : CSDN技术社区 发布时间:2021-03-25

参考 https://blog.csdn.net/a_victory/article/details/70216772 

https://blog.csdn.net/lishehe/article/details/33394895 

https://www.cnblogs.com/enjoyingsoft/p/10132360.html

一、Mule的介绍

一个以Java为核心的轻量级的消息框架和整合平台。它使得开发人员可以快速 简单的连接多个应用。 
目前许多公司都使用了Mule 比如Walmart,HP,Sony,Deutsche Bank 以及 CitiBank等公司。 
Mule基于Enterprise Service 
Bus(ESB)架构思想。ESB的主要特性是通过扮演一个中转系统的角色 允许不同的应用系统交互 中转系统在内网或Internet上的应用系统间搬运数据。 
目前市场上有一些商业的ESB实现。尽管如此 大部分提供有限的功能 或在已存应用服务器 消息服务器之上构建 将你锁定在特定的供应商 将你固定的ESB厂商 。Mule是供应商中立的 因此不同厂商的实现可以插入进来。当你使用Mule时 永远不会锁定的特定的供应商。

和传统的ESB不一样 Mule ESB是一个轻量级的ESB 内核基于SEDA模型和Spring框架构建。基于Spring 意味有着非常灵活的扩展性。同时Mule ESB不仅仅是一个ESB 它也是流行的微服务体系中的一部分。

Mule有两个版本 社区版和企业版。 
社区版是免费 企业版是收费的 企业版相比于社区版功能丰富许多 它们的比较如下

\"\"

 

1、相比同类框架而言 提供很多优势 包含

\"\"

Mule近期推出了Mule3 Mule3的新增特点-云连接 Cloud Connect  
提供了可以用简单安全的方式为企业提供基于云技术的数据和服务。它的核心是IBeans 一个轻量级、可重用的接口 用于Web技术的连接扩展和数据服务。

\"\"

Mule云包括以下内容 
1、 Integration Beans 合成bean 他们是可重用的云接口 可以注入到组件中 可以接受外部的服务 比如说亚马逊、推特、Facebook等 并且是一种简单的接收服务、管理安全机制的方法。请求验证、数据传输、错误挂起等也可以通过这种方法来实现。 

2、 Rest / JAX-RS REST协议 即REST(Representational State Transfer表述性状态转移)是一种针对网络应用的设计和开发方式 可以降低开发的复杂性 提高系统的可伸缩性。  
现在Jersey 已经是Mule核心部署的一部分 提供本地化的对REST和JAX-RS的支持 例如Apache CXF。Jersey现在已经在易配置和高可扩展性方面做的非常优秀。Jersey现在使用一种包含很多Jersey资源的接口实现组件来替代终端类型的实现方式。 
3、 AJAX Mule现在直接融合了Javascript应用。Mule3包括了服务终端和Javascript客户端允许事件被直接发布到浏览器 并且事件可以从浏览器进行发布。 
4、 Web Service 现在对Web Service的发布的配置将更加容易 其扩展性也进一步加强。 
5、 ATOM and RSS Mule 3 现在能够较好的支持ATOM了。 
6、 JSON Support Mule3包含对JSON数据绑定和JSON传输的支持。 
7、 JAXB Support 支持组件XML绑定将自动进行 并且也添加了新的JAXB传输。 
其他的一些支持  
1、FLOW 配置的流程化。 
2、Patterns 配置的模式化 可以极大简化配置 将不同情况的配置进行模式化划分。 
3、Annotation 改进后新的注释方法对组件中的注入反转、transformers的发布、组件方法的Pol有很大作用。 
4、Deployment 支持单一服务和组服务的热部署。同时支持部署模型定义。 结构上的提高  
5、Message Processor API 消息处理API Mule3其内部处理方式较为灵活 能够在将来其他模式调整时适应外部服务组件。 
6、Message Exchange Patterns 消息交换模式 消息在Mule3中的流转将更加精确和灵活。 
7、Message Property Scoping 消息属性作用域。较好的实现了属性的作用范围。 
8、Lifecycle Improvements 生命周期的改进。优化了Mule的开启和关闭行为 热部署也在这方面得以展现 并支持JSR-250 生命周期注释方法。 
9、Exception Handing 异常处理 异常处理的兼容性更好 并且有错误行为预处理功能。 
10、Automatic Transformation 自动转换 Mule3增强了自动转换引擎 用于进行数据绑定 例如XML/JAX、JSON 并支持自定义。 
11、CXF Now a Module CXF现在在Mule3中作为一个模块 在Mule3中对CXF进行了优化 使得CXF的用户与普通的管道/过滤器元素一样。 
12、REST Mule的开发团队十分看好REST 在其文档中使用了“enjoy”这个单词来形容REST 可见使用REST协议开发Mule3服务应该是比较合适的。 Mule3其他的一些变化  
1、Message factories 消息工厂 从底层将消息翻译成MuleMessage格式。所有MuleMessage都是由消息工厂创建的。 
2、XQuery Support 对XQuery支持。 
3、Dynamic Endpoints 动态终端 Mule中的终端可以动态构造 通过Mule传输的消息可以构造终端地址。 
4、JBoss jBPM 文档中说明Mule从很早以前就开始与JBoss jBPM进行整合了 但是在Mule3中 对其进行了改善 并将JBoss jBPM版本升级到了4.4版本。 
5、Transaction Enhancements Transaction被增强 通过配置元素属性 Mule可获知在Mule外部Transaction已经开始了。 
6、AXIS Code Removed from Mule AXIS代码在Mule3中被移除 其将作为一个独立模块存在。
• Mule 组件可以是任何你想要的类型。你可以简单的集成任何东西, 从POJO到其他框架的组件。
• Mule 和 ESB 模型使得重大的组件重用。不象其他的框架 Mule允许你在不做任何变化的情况下使用已存组件。组件不强制要求有Mule特性的代码 就可以在Mule中运行 没有程序式的API强制要求。业务逻辑和消息逻辑完全分离。
• 消息 Messages 可以是任何格式 从SOAP到二进制图片文件 binary image files 。Mule没有强制任何架构上的设计约束 例如XML消息或 WSDL服务约束。
• 可以一些拓扑结构上部署Mule 不仅仅是ESB。因为它是轻量级 和 嵌入式的 Mule能降低上线时间 提高生产力 为工程提供安全 可伸缩的应用系统 它适应变化 在需要时提高或降低系统规模。

特性

功能强大 易于使用(Easy to learn, powerful to use)
集成、部署非常方便(Integrate with anything, deploy anywhere)  
提供了超过120个用来集成协议、应用的连接器和模板 足够应对常见的企业级应用集成问题 支持云端。

拖拽式的图形化界面设计器(Drag-and-drop graphical design)  
使用Anypoint Studio这个图形化设计的IDE 开发人员可以高效地创建集成流程。

使用常见的工具(Use the tools you know)  
Mule ESB使用的是一些主流的开发工具 如Eclipse、Maven, Spring and Ant 开发人员可以很容易上手。

专为开发者而设计 被全球企业所选择(Designed for developers, chosen by global enterprises)

一个安全的平台(A secure platform)  
系统会阻止未经授权的访问 保护敏感的数据 通过Anypoint Enterprise Security的安全管理机制主动防御潜在的攻击。

可扩展的、可靠的、可用的(Scalable, reliable, available) 高吞吐量和高度分布式环境的架构。

Mule ESB的内置高可用性集群和数据网格可以确保不会有消息丢失。 内置可见性(Built-in visibility)
提供查看运行性能的界面 监控关键的统计数据 并可以设置SLA报警 为诊断和解决性能问题提供极大便利。

封装性——管理应用系统和组件之间的交互 不管它们是否在同一个VM(Visual Machine-虚拟机 即JVM-Java虚拟机)或在Internet上 不管底层使用的传输协议。不管应用系统使用的是哪些不同的技术 包括 JMS Web Services JDBC HTTP 等 Mule可以无缝的在他们之间进行处理交互动作。
高度可扩展性——允许你以很小的规模开始 随着时间的推移 连接更多的应用系统。

Mule基于Enterprise Service Bus(ESB)架构思想。Mule的作用

1、面向服务架构SOA 
Service-Oriented Architecture 面向服务的体系结构

一种架构模型 它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署、组合和使用。

什么是SOA? 
程序员 SOA是一种全新的开发技术 新的组件模型 比如说Web Service 
架构设计师 SOA就是一种新的设计模式 方法学 
业务分析人员 SOA就是基于标准的业务应用服务 
IBM: SOA是一种构造分布式系统的方法 它将业务应用功能以服务的形式提供给最终用户应用或其他服务
SOA架构有哪些基本的要求  
SOA在相对较粗的粒度上对应用服务或业务模块进行封装与重用 
服务间保持松散耦合 基于开放的标准 服务的接口描述与具体实现无关 
灵活的架构 -服务的实现细节 服务的位置乃至服务请求的底层协议都应该透明

 

SOA:面向服务的体系结构是一个组件模型 它将应用程序的不同功能单元 称为服务 通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的 它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中的服务可以使用一种统一和通用的方式进行交互。

 

2、ESB  
已经按照SOA的思想提炼出了各种业务服务 公布出来 同样 你发现其他很多人也做了同样的事情。大家都很振奋 开始踊跃的尝试 我调用你的一个服务 你调我的一个服务。啊哈 大家都SOA了。且慢 那么这个SOA给你们带来了什么好处呢 Ok 现在我可以在J2EE环境里调用.Net的组件了 但是原来没有SOA的时候也可以做到的呀。只要两个节点之间互相认可对方的方式 即使不存在公开/统一的服务界面也可以实现点到点的互联。因此我们不得不承认 如果我们只有服务 而服务的请求者和服务的提供者之间仍然需要这种显式的点到点的调用 那么这就不是一个典型的SOA架构。服务的参与双方都必须建立1对1 的联系。

在SOA中 我们还需要这样一个中间层 能够帮助实现在SOA架构中不同服务之间的智能化管理。最容易想到的是这样一个HUB-Spoke结构 在SOA架构中的各服务之间设置一个类似于Hub的中间件 由它充当整个SOA架构的中央管理器的作用。  

       企业服务总线提供可靠消息传输 服务接入 协议转换 数据格式转换 基于内容的路由等功能 屏蔽了服务的物理位置 协议和数据格式.

 ESB在SOA中扮演着重要的角色

        在技术层解决了SOA的整合问题 耦合了应用与应用之间的集成逻辑 使得SOA更灵活 更易于扩展 更敏捷。有了ESB 新建的服务消费者应用程序不需要关心服务的提供者在哪里 使用何种通讯协议 与其交互的数据是怎样的…… 它只需向ESB发出请求 使用开放的、标准的通讯协议。

现在服务的请求者和提供者之间有了一个智能的中转站 服务的请求者不再需要了解服务提供者的细节。

现有这么系统间的服务的交互\\通信\\数据的传递等等,都是需要来整合的,一开始来说在一定程度上解耦合,是不同系统之间通过WebService来各自发布自己的服务,其他需要的再调用即可,但是如果服务过多(颗粒多的话),这种A直接依赖B的这种形式,就显得很臃肿了,交互太多,维护管理起来代价的,

\"\"

 

各个应用系统之间的调用形成了一张网 没有逻辑 随着业务的增加 维护简直就是一场恶梦。

       想要处理这样的关系,学习过设计模式,很容易联系到外观模式的作用,如果有一个可以整合系统间的这样的多线路的调用的就太好了,通过外观代理的方式,来处理,下图示:

\"\"

       各个应用的逻辑很清晰 每个应用都只需要关心如何暴露自己的服务 而调用的应用只需要知道如何调用服务 至于怎么做 去找谁 则完全交给ESB来完成。

       所有的ESB产品都应该可以构建和部署服务。包括对遗留系统的整理、消息的路由、消息格式的转换、执行协议的调解等。

Mule 
ESB是一种在松散耦合的服务和应用之间标准的集成方式(即使我们需要一些Hub 那么它们也是以某种服务的形式部署在总线上 相比上面的结构要灵活的多 

- 比单一Hub的形式更开放 总线结构有无限扩展的可能 
- 真正体现了SOA的理念 一切皆为服务 服务在总线(BUS)中处于平等的地位

ESB就是在SOA架构中实现服务间智能化集成与管理的中介 
ESB不是一个应用程序框架 也不是一个企业应用的解决方案。它只是一个基于消息的调用企业服务的通信模块 可以把它嵌入到应用程序框架中 例如嵌入到spring容器里面 或者嵌入到工作流系统中。它的作用是对企业里面的SOA服务的调用提供一个框架和简便的方法。
ESB可以作用于

面向服务的架构 分布式的应用由可重用的服务组成
面向消息的架构 应用之间通过ESB发送和接受消息
事件驱动的架构 应用之间异步地产生和接收消息

首先 在ESB系统中 被集成的对象被明确定义为服务 而不是传统EAI中各种各样的中间件平台 这样就极大简化了在集成异构性上的考虑 因为不管有怎样的应用底层实现 只要是SOA架构中的服务 它就一定是基于标准的。

其次 ESB明确强调消息(Message)处理在集成过程中的作用 这里的消息指的是应用环境中被集成对象之间的沟通。传统的EAI系统中的消息处理大多是被动的 消息的处理需要各自中间件的私有方式支持 例如API的方式。ESB系统由于集成对象统一到服务 消息在应用服务之间传递时格式是标准的 直接面向消息的处理方式成为可能。如果ESB能够在底层支持现有的各种通讯协议 那么对消息的处理就完全不考虑底层的传输细节 而直接通过消息的标准格式定义来进行。这样 在ESB中 对消息的处理就会成为ESB的核心 因为通过消息处理来集成服务是最简单可行的方式。这也是ESB中总线(Bus)功能的体现。ESB的概念不仅仅是提供消息交互的通道 更重要的是提供服务的智能化集成基础架构。

最后 事件驱动成为ESB的重要特征。通常服务之间传递的消息有两种形式 一种是调用(Call) 即请求/回应方式 这是常见的同步模式。还有一种我们称之为单路消息(One-way) 它的目的往往是触发异步的事件 发送者不需要马上得到回复。考虑到有些应用服务是长时间运行的 因此 这种异步服务之间的消息交互也是ESB必须支持的。除此之外 ESB的很多功能都可以利用这种机制来实现 例如 SOA中服务的性能监控等基础架构功能 需要通过ESB来提供数据 当服务的请求通过ESB中转的时候 ESB很容易通过事件驱动机制向SOA的基础架构服务传递信息。

3、主要功能

Mule是一个轻量级的集成平台 Mule不是用来创建多个系统、服务、APIs或者设备之间的点对点集成 而是用来智能管理节点之间的消息路由、数据映射、编排以及使消息可靠地、安全地传递。其他系统和应用接入Mule 让Mule处理所有系统之间的通信 并且可以跟踪和监控发生的一切。

Mule的使用场景

我们来说一下Mule ESB的常见应用场景 可以更好的理解Mule ESB到底可以帮助我们解决什么问题。

1、旧系统改造 开放系统的服务能力。举个例子 我们有一个电商系统 需要调用SAP ERP的订单接口来创建订单。这个时候就需要将SAP的订单服务暴露成我们流行的Rest Service接口 以方便电商系统调用。当然电商系统可以直接使用SAP的JCO包来调用SAP的BAPI Function 但显然暴露一个通用的Rest Service更易于调用。使用Mule ESB实现如下

\"\"

 

2、系统集成。举个例子 很多系统之间数据交互可能还是用FTP目录。尤其是企业跟企业之间的数据交互 比如 A企业丢一个EDI 文件到B企业的FTP目录 然后B企业会从FTP目录下载解析并放置到数据库。这个场景用Mule ESB实现就很方便。

\"\"

 

3、ETL。市面上有很多开源的ETL软件 其实Mule ESB也有ETL的功能 通过Flow设定ETL的数据转换和数据流向。下图就演示了Mule的ETL和数据分发功能。

\"\"

 

Mule安装

用一个相对宽泛的标准来划分 Mule ESB软件可以分成两部分。

一部分是客户端 也就是基于Eclipse的Anypoint Studio 客户端就是用来开发集成应用的 通常面向的用户就是我们的开发人员。由于是基于Eclipse环境 所以Java开发人员会很熟悉 同时Anypoint Studio也可以集成Git SVN Maven Junit Jenkins等一系列生态工具。

当然作为其他语言的开发人员也不用担心 Anypoint Studio是一个可视化的拖拽的开发环境 大部分的工作只需要使用鼠标拖拽组件 配置属性即可。

还要一部分是服务端 也就是Mule Runtime 也可以称作Container 容器 注意不要跟Docker的概念混淆。这里的Container指的是Java Container 你可以大概想象成Tomcat类似的东西。客户端开发的应用就部署运行在Mule Runtime中。

需要注意的是 Mule Runtime是一个独立的Container 只依赖JDK 并不依赖其他第三方的容器。服务器中只需要安装JDK和Mule Runtime 即可运行Mule应用。还有一种不太常见的做法 就是把Mule App跑在第三方的容器里(比如Tomcat等) 通过对容器的扩展来支持Mule App。不过我们不推荐这种做法 还是推荐使用独立的Mule Runtime 也就是官方说的Standalone版本。

五、Mule实战

实战例子一

1:打开开发环境

\"\"
       这个.MFLOW文件存储流信息供可视化编辑器编辑。当你的新项目第一次打开 Mule Studio会自动打开.MFLOW文件 将显示一个空白的画布。

\"\"

主版面

\"\"

在元素板上 每个类别中的构建块按字母顺序排列。为避免滚动 使用选项板的右上角的过滤器工具可以更快速地找到你想要构建块。

\"\"

2:双击HTTP,弹出一下,设置其属性如下

\"\"

3:设置Logger属性

\"\"

4:设置Set Payload属性

\"\"
1、打开任何一个网页浏览器 然后导航至http://localhost:8084/world
2、您的浏览器会显示一条消息 上面写着 Hello  world 。Today is[今天的日期。 

\"\"

当然 world可以修改成你自己任意想输入的信息,后通过ESB拦截,打出相应的信息

\"\"

实战例子二

情景:

1.在浏览器地址栏输入http://localhost:9090/hello-mule?name oliver age 20,会返回 Hello oliver,your age is 10 .

1.在浏览器地址栏输入http://localhost:9090/love-mule?name oliver age 20,会返回 Love oliver,your age is 10 .

配置文件:

[html] view plaincopy

?xml version 1.0  encoding UTF-8 ?    mule xmlns http://www.mulesoft.org/schema/mule/core         xmlns:xsi http://www.w3.org/2001/XMLSchema-instance         xmlns:spring http://www.springframework.org/schema/beans         xmlns:http http://www.mulesoft.org/schema/mule/http         xmlns:vm http://www.mulesoft.org/schema/mule/vm         xsi:schemaLocation           http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd          http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/3.2/mule.xsd          http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/3.2/mule-http.xsd          http://www.mulesoft.org/schema/mule/vm http://www.mulesoft.org/schema/mule/vm/3.2/mule-vm.xsd               !-- 将客户端传过来的Http数据转化成Person对象 --            custom-transformer name HttpDataToPersonTransformer  class com.mule.transformer.HttpDataToPersonTransformer /                !-- 将service操作结果用Html语言封装起来 --         custom-transformer name StringToHtmlTransformer  class com.mule.transformer.StringToHtmlTransformer /                !-- 设置相应内容为text/html格式 --         message-properties-transformer name setHtmlContentType  overwrite true            add-message-property key Content-Type  value text/html  /            !-- Tomcat lowercases headers, need to drop this old one too --            delete-message-property key content-type  /        /message-properties-transformer                !-- 根据客户端传过来的内容,返回相应的Hello语句 --         flow name hello            inbound-endpoint address http://localhost:9090/hello-mule?method sayHello  exchange-pattern request-response                  transformer ref HttpDataToPersonTransformer /                response                    transformer ref StringToHtmlTransformer /                    transformer ref setHtmlContentType /                /response            /inbound-endpoint                      component class com.mule.component.WelcomService /                   /flow                !-- 根绝客户端传过来的内容,返回相应的Love语句 --         flow name love            inbound-endpoint address http://localhost:9090/love-mule?method sayLove  exchange-pattern request-response                  transformer ref HttpDataToPersonTransformer /                response                    transformer ref StringToHtmlTransformer /                    transformer ref setHtmlContentType /                /response            /inbound-endpoint                      component class com.mule.component.WelcomService /                   /flow      /mule   

 

Transformer:

1.HttpDataToperson 将客户端传过来的http数据转换成component所需要Person类型

[html] view plaincopy

package com.mule.transformer;    import org.mule.api.MuleMessage;  import org.mule.api.transformer.TransformerException;  import org.mule.transformer.AbstractMessageTransformer;    import com.mule.domain.Person;    public class HttpDataToPersonTransformer extends AbstractMessageTransformer {         Override      public Object transformMessage(MuleMessage message, String outputEncoding)              throws TransformerException {          String name   message.getInboundProperty( name           String age   message.getInboundProperty( age           if( age   null ) {              age    10           }                            return new Person(name,Integer.parseInt(age));      }    }  

2.StringToHtmlTransformer 将component处理后返回的string类型数据,封装成html数据

 

[java] view plaincopy

package com.mule.transformer;    import org.mule.api.transformer.TransformerException;  import org.mule.transformer.AbstractTransformer;    import com.mule.util.HtmlTemplateUtil;    public class StringToHtmlTransformer extends AbstractTransformer {         Override      protected Object doTransform(Object src, String enc)              throws TransformerException {          String str   (String)src;                    return HtmlTemplateUtil.getSimpleHtml(str);      }    }  

Component:

WelcomService 返回欢迎内容

[java] view plaincopy

package com.mule.component;    import com.mule.domain.Person;    public class WelcomService {            public String sayHello( Person person ){          return   Hello  person.getName() , your age is  person.getAge();      }            public String sayLove( Person person ){          return   Love you  person.getName() , your age is  person.getAge();      }    }  

Person类 : 

[java] view plaincopy

package com.mule.domain;    public class Person {            private String name;      private int age;            public Person(){}            public Person(String name,int age ){          this.name   name;          this.age   age;      }        public String getName() {          return name;      }        public void setName(String name) {          this.name   name;      }        public int getAge() {          return age;      }        public void setAge(int age) {          this.age   age;      }        }  

 

[java] view plaincopy

HtmlTemplateUtil 工具类:用html语句封转给定的text  

[java] view plaincopy

package com.mule.util;    public class HtmlTemplateUtil {            public static String getSimpleHtml( String text ){          String output                        output    html           output    head           output    meta http-equiv \\ Content-Language\\  content \\ en-us\\ /           output    meta http-equiv \\ Content-Type\\  content \\ text/html; charset windows-1252\\ /           output    title Bookstore Administration Console /title           output    /head             output    body link \\ #FFFFFF\\  vlink \\ #FFFFFF\\  alink \\ #FFFFFF\\  bgcolor \\ #990000\\  text \\ #FFFFFF\\                       output   text;                      output    /body             output    br/ a href \\ /bookstore-admin/\\ Return to Home Page /a           output    /html                     return output;      }    }  Mule部署

我们已经在客户端开发完成了Hello world 也顺利跑起来了。但是如何部署到服务端呢。和常见的Java开发一样 我们也需要打包应用。这里我们用的是普通工程 我们通过一个Export操作 即可导出Mule App 当然Mule App也支持Maven工程 可以通过Maven打包 。在工程项目上右击弹出菜单 Export... 然后在对话框中选择Anypoint Studio Project to Mule Deployable Archive。注意这里不要选中Attach project sources。

\"\"

将导出的Zip包放入到Mule Runtime的apps目录下 然后启动Mule Runtime。如果是Linux或者mac 那么在Mule Runtime的bin目录下执行./mule启动命令。如果是Windows 双击执行bin目录mule.bat即可启动。

然后使用Postman访问服务器 你会得到和Studio一样的效果。

 

 

 

 

 

 

 

 

 

本文链接: http://mule.immuno-online.com/view-777818.html

发布于 : 2021-03-25 阅读(0)
公司介绍
品牌分类
联络我们
服务热线:4000-520-616
(限工作日9:00-18:00)
QQ :1570468124
手机:18915418616
官网:http://