博客专区 > 王孟君的博客 > 博客详情
一步步完成Maven+Spring+Dubbo+Zookeeper的整合示例
王孟君 发表于1周前
一步步完成Maven+Spring+Dubbo+Zookeeper的整合示例
  1. 发表于 1周前
  2. 阅读 1231
  3. 收藏 153
  4. 点赞 2
  5. 评论 4
“粉丝福利”_IT在线,精品课程讲解!>>>   
本文给出一个整合Maven+Spring+Dubbo+Zookeeper的示例,并且一步步给出完成步骤,并对其中可能遇到的问题进行解决~

Maven模块化

创建一个名为dubbo-demo的Maven工程,该工程包含三个模块
  1. dubbo-demo-interface   (定义对外开放接口)
  2. dubbo-demo-provider   (接口实现)
  3. dubbo-demo-consumer (接口调用)
dubbo-demo工程中的pom.xml文件如下: <project xmlns="http://maven.apache.org/POM/4.0.0" 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.xxx.dubbo.demo</groupId> <artifactId>dubbo-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>dubbo-demo-provider</module> <module>dubbo-demo-consumer</module> <module>dubbo-demo-interface</module> </modules> </project> 关于dubbo-demo Maven工程的模块化构建,请参考博文【使用Maven构建模块化工程 接下来,我们就一步一步来完成interface、provider以及consumer模块的内容~

模块interface

定义接口

创建一个接口(GreetingService),包含一个hello接口,如: package com.xxx.dubbo.demo.service; /** * @author wangmengjun * */ public interface GreetingService { String hello(String name); } 简单的接口就定义好了~ 有了接口,就可以在Provider中完成接口的实现,并暴露接口服务为Dubbo服务给其它模块使用(如consumer)~

模块Provider

添加依赖包

  1. 添加interface依赖包
<dependency> <groupId>com.xxx.dubbo.demo</groupId> <artifactId>dubbo-demo-interface</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
  1. 添加spring依赖包
<!--引入Spring依赖包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.framework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.framework.version}</version> </dependency>
  1. 添加dubbo依赖包
<!-- Dubbo相关 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.4-snapshot</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.18.1-GA</version> </dependency> <!-- https://mvnrepository.com/artifact/io.netty/netty --> <dependency> <groupId>io.netty</groupId> <artifactId>netty</artifactId> <version>3.10.6.Final</version> </dependency>
  1. 添加zk-client依赖包
<!-- ZK-client --> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency>   dubbo-demo-provider模块详细的pom.xml文件如下: <project xmlns="http://maven.apache.org/POM/4.0.0" 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> <parent> <groupId>com.xxx.dubbo.demo</groupId> <artifactId>dubbo-demo</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>dubbo-demo-provider</artifactId> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.framework.version>4.3.6.RELEASE</spring.framework.version> </properties> <dependencies> <dependency> <groupId>com.xxx.dubbo.demo</groupId> <artifactId>dubbo-demo-interface</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!--引入Spring依赖包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.framework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.framework.version}</version> </dependency> <!-- Dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.4-snapshot</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.18.1-GA</version> </dependency> <!-- https://mvnrepository.com/artifact/io.netty/netty --> <dependency> <groupId>io.netty</groupId> <artifactId>netty</artifactId> <version>3.10.6.Final</version> </dependency> <!-- ZK-client --> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> </dependencies> </project>

实现接口

编写GreetingService的实现类GreetingServiceImpl, 并实现hello方法~ package com.xxx.dubbo.demo.service.impl; import java.util.Date; import com.xxx.dubbo.demo.service.GreetingService; /** * @author wangmengjun * */ public class GreetingServiceImpl implements GreetingService { public String hello(String name) { System.out.println("Hello Service is calling : " + new Date()); String greetMessage = "Hello, " + name; return greetMessage; } }

配置XML文件

  1. spring-dubbo-provider.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd "> <description>Dubbo Demo Service</description> <!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="dubbo-demo-provider" /> <!-- 使用zookeeper注册中心暴露服务地址 --> <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" client="zkclient" /> <!-- dubbo缓存 --> <dubbo:protocol id="dubbo" name="dubbo" port="20880" threadpool="cached" threads="100" /> <!-- Greeting服务 --> <bean id="greetingService" class="com.xxx.dubbo.demo.service.impl.GreetingServiceImpl" /> <dubbo:service protocol="dubbo" interface="com.xxx.dubbo.demo.service.GreetingService" ref="greetingService" /> </beans>
  1. applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <!--服务层配置 --> <import resource="classpath:spring-dubbo-provider.xml" /> </beans>

编写启动类

编写一个启动类Main package com.xxx.dubbo.demo.main; import java.io.IOException; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { @SuppressWarnings("resource") public static void main(String[] args) throws IOException { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( "applicationContext.xml"); context.start(); System.in.read(); } } 其中,
System.in.read(); 的作用是控制台输入任何字符退出~ 因为本文示例provider不是web工程,这个操作只是保持provider的服务一直开着~
接下来,我们继续来完成模块Consumer的代码和配置~

模块Consumer

添加依赖包

  1. 添加interface依赖包
<dependency> <groupId>com.xxx.dubbo.demo</groupId> <artifactId>dubbo-demo-interface</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
  1. 添加spring依赖包
<!--引入Spring依赖包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.framework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.framework.version}</version> </dependency>
  1. 添加dubbo依赖包
<!-- Dubbo相关 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.4-snapshot</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.18.1-GA</version> </dependency> <!-- https://mvnrepository.com/artifact/io.netty/netty --> <dependency> <groupId>io.netty</groupId> <artifactId>netty</artifactId> <version>3.10.6.Final</version> </dependency>
  1. 添加zk-client依赖包
<!-- ZK-client --> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> dubbo-demo-consumer模块详细的pom.xml文件如下: <project xmlns="http://maven.apache.org/POM/4.0.0" 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> <parent> <groupId>com.xxx.dubbo.demo</groupId> <artifactId>dubbo-demo</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>dubbo-demo-consumer</artifactId> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.framework.version>4.3.6.RELEASE</spring.framework.version> </properties> <dependencies> <dependency> <groupId>com.xxx.dubbo.demo</groupId> <artifactId>dubbo-demo-interface</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!--引入Spring依赖包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.framework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.framework.version}</version> </dependency> <!-- Dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.4-snapshot</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.18.1-GA</version> </dependency> <!-- https://mvnrepository.com/artifact/io.netty/netty --> <dependency> <groupId>io.netty</groupId> <artifactId>netty</artifactId> <version>3.10.6.Final</version> </dependency> <!-- ZK-client --> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> </dependencies> </project>

配置XML文件

  1. spring-dubbo-consume.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd "> <description>Dubbo Demo Service</description> <!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="DemoProvider" /> <!-- 使用zookeeper注册中心暴露服务地址 --> <dubbo:registry protocol="zookeeper" address="172.0.0.1:2181" client="zkclient" /> <!-- dubbo缓存 --> <dubbo:protocol id="dubbo" name="dubbo" port="20880" threadpool="cached" threads="100" /> <!-- 生成远程服务代理,可以和本地bean一样使用demoService --> <dubbo:reference id="greetingService" interface="com.xxx.dubbo.demo.service.GreetingService" /> </beans>
  1. applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <!--服务层配置 --> <import resource="classpath:spring-dubbo-consumer.xml" /> </beans>

编写测试类

dubbo-demo-consumer模块下,创建一个调用interface接口的方法~ package com.xxx.dubbo.demo.main; import java.io.IOException; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.xxx.dubbo.demo.service.GreetingService; public class Main { @SuppressWarnings("resource") public static void main(String[] args) throws IOException { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); context.start(); GreetingService greetingService = (GreetingService) context.getBean("greetingService"); String greetMessage = greetingService.hello("Eric"); System.out.println("Consumer ==> " + greetMessage); context.destroy(); } }

Zookeeper安装和配置

安装

可以从zookeeper官网下载zookeeper安装包~ 本文使用的版本是3.4.6, 将下载的安装包解压缩即可。

配置

进入Zookeeper安装目录下的conf目录~ 复制zoo_sample.conf文件,并将复制的配置文件取名为zoo.conf~ 其内容如下: # The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/tmp/zookeeper # the port at which the clients will connect clientPort=2181 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1 简单使用的话,可以不做修改~
至此,interface,provider以及consumer模块已经准备好,zookeeper也已经准备好~ 接下来就可以做相关的测试了~

测试 & 结果

启动Zookeeper

进入Zookeeper安装路径下的bin目录~
window系统中,启动zkServer.cmdLinux中,启动zkServer.sh~
启动zookeeper服务,

启动提供者

运行dubbo-demo-provider模块中的Main类~
  1. 运行之后,出现如下问题:
log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment). log4j:WARN Please initialize the log4j system properly.
  1. 根据描述 ,解决方法很简单,配置一个log4j.properties文件在resouce下即可
log4j.properties的内容简单如下: # Rules reminder: # DEBUG < INFO < WARN < ERROR < FATAL # Global logging configuration log4j.rootLogger=INFO,stdout ## Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=[%-5p][%d{yyyy-MM-dd HH:mm:ss,SSS}] %l - %m%n   重新运行Main类,可以看出来,provider已经成功启动~ [INFO ][2017-05-18 21:06:13,577] org.springframework.context.support.AbstractApplicationContext.prepareRefresh(AbstractApplicationContext.java:582) - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@46309a10: startup date [Thu May 18 21:06:13 CST 2017]; root of context hierarchy [INFO ][2017-05-18 21:06:13,626] org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [applicationContext.xml] [INFO ][2017-05-18 21:06:13,717] org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [spring-dubbo-provider.xml] [INFO ][2017-05-18 21:06:13,779] - using logger: com.alibaba.dubbo.common.logger.log4j.Log4jLoggerAdapter [INFO ][2017-05-18 21:06:14,097] com.alibaba.dubbo.config.spring.ServiceBean.onApplicationEvent(ServiceBean.java:107) - [DUBBO] The service ready on spring started. service: com.xxx.dubbo.demo.service.GreetingService, dubbo version: 2.5.4-SNAPSHOT, current host: 127.0.0.1 [INFO ][2017-05-18 21:06:14,213] com.alibaba.dubbo.config.ServiceConfig.exportLocal(ServiceConfig.java:513) - [DUBBO] Export dubbo service com.xxx.dubbo.demo.service.GreetingService to local registry, dubbo version: 2.5.4-SNAPSHOT, current host: 127.0.0.1 [INFO ][2017-05-18 21:06:14,213] com.alibaba.dubbo.config.ServiceConfig.doExportUrlsFor1Protocol(ServiceConfig.java:473) - [DUBBO] Export dubbo service com.xxx.dubbo.demo.service.GreetingService to url dubbo://192.168.102.51:20880/com.xxx.dubbo.demo.service.GreetingService?anyhost=true&application=dubbo-demo-provider&dubbo=2.5.4-SNAPSHOT&generic=false&interface=com.xxx.dubbo.demo.service.GreetingService&methods=hello&pid=18448&side=provider&threadpool=cached&threads=100&timestamp=1495112774127, dubbo version: 2.5.4-SNAPSHOT, current host: 127.0.0.1 [INFO ][2017-05-18 21:06:14,214] com.alibaba.dubbo.config.ServiceConfig.doExportUrlsFor1Protocol(ServiceConfig.java:484) - [DUBBO] Register dubbo service com.xxx.dubbo.demo.service.GreetingService url dubbo://192.168.102.51:20880/com.xxx.dubbo.demo.service.GreetingService?anyhost=true&application=dubbo-demo-provider&dubbo=2.5.4-SNAPSHOT&generic=false&interface=com.xxx.dubbo.demo.service.GreetingService&methods=hello&pid=18448&side=provider&threadpool=cached&threads=100&timestamp=1495112774127 to registry registry://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?application=dubbo-demo-provider&client=zkclient&dubbo=2.5.4-SNAPSHOT&pid=18448&registry=zookeeper&timestamp=1495112774106, dubbo version: 2.5.4-SNAPSHOT, current host: 127.0.0.1 [INFO ][2017-05-18 21:06:14,397] com.alibaba.dubbo.remoting.transport.AbstractServer.<init>(AbstractServer.java:69) - [DUBBO] Start NettyServer bind /0.0.0.0:20880, export /192.168.102.51:20880, dubbo version: 2.5.4-SNAPSHOT, current host: 127.0.0.1 [INFO ][2017-05-18 21:06:14,434] org.I0Itec.zkclient.ZkEventThread.run(ZkEventThread.java:64) - Starting ZkClient event thread. [INFO ][2017-05-18 21:06:14,443] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:zookeeper.version=3.3.3-1073969, built on 02/23/2011 22:27 GMT [INFO ][2017-05-18 21:06:14,443] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:host.name=wangmengjun-PC [INFO ][2017-05-18 21:06:14,443] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:java.version=1.7.0_79 [INFO ][2017-05-18 21:06:14,443] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:java.vendor=Oracle Corporation [INFO ][2017-05-18 21:06:14,444] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:java.home=C:\Program Files\Java\jre7 [INFO ][2017-05-18 21:06:14,444] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:java.class.path=F:\JavaDeveloper\workspaces\SpringMVCDubboExample\dubbo-demo\dubbo-demo-provider\target\classes;F:\JavaDeveloper\workspaces\SpringMVCDubboExample\dubbo-demo\dubbo-demo-interface\target\classes;D:\java_tools\Reponsitories\Maven\org\springframework\spring-core\4.3.6.RELEASE\spring-core-4.3.6.RELEASE.jar;D:\java_tools\Reponsitories\Maven\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;D:\java_tools\Reponsitories\Maven\org\springframework\spring-context\4.3.6.RELEASE\spring-context-4.3.6.RELEASE.jar;D:\java_tools\Reponsitories\Maven\org\springframework\spring-aop\4.3.6.RELEASE\spring-aop-4.3.6.RELEASE.jar;D:\java_tools\Reponsitories\Maven\org\springframework\spring-beans\4.3.6.RELEASE\spring-beans-4.3.6.RELEASE.jar;D:\java_tools\Reponsitories\Maven\org\springframework\spring-expression\4.3.6.RELEASE\spring-expression-4.3.6.RELEASE.jar;D:\java_tools\Reponsitories\Maven\com\alibaba\dubbo\2.5.4-snapshot\dubbo-2.5.4-snapshot.jar;D:\java_tools\Reponsitories\Maven\org\javassist\javassist\3.18.1-GA\javassist-3.18.1-GA.jar;D:\java_tools\Reponsitories\Maven\io\netty\netty\3.10.6.Final\netty-3.10.6.Final.jar;D:\java_tools\Reponsitories\Maven\com\github\sgroschupf\zkclient\0.1\zkclient-0.1.jar;D:\java_tools\Reponsitories\Maven\org\apache\zookeeper\zookeeper\3.3.3\zookeeper-3.3.3.jar;D:\java_tools\Reponsitories\Maven\jline\jline\0.9.94\jline-0.9.94.jar;D:\java_tools\Reponsitories\Maven\junit\junit\3.8.1\junit-3.8.1.jar;D:\java_tools\Reponsitories\Maven\log4j\log4j\1.2.14\log4j-1.2.14.jar [INFO ][2017-05-18 21:06:14,444] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:java.library.path=C:\Program Files\Java\jre7\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Common Files\lenovo\easyplussdk\bin;.;C:\Program Files\Java\jdk1.7.0_79\bin;D:\develop\apache-jmeter-2.13\bin;C:\Program Files\TortoiseSVN\bin;D:\develop\Databases\Mysql\mysql-5.6.20\bin;D:\develop\Sonar\sonar-runner-2.4\bin;D:\develop\Sonar\sonarqube-5.1.1\bin;D:\develop\python\python-2.7.10\python.exe;C:\Program Files\TortoiseGit\bin;D:\develop\ZeroC\ZeroCIce-3.6.2\bin;D:\develop\apache-maven-3.3.3\bin;D:\develop\Sonar\sonar-scanner-2.8\bin;F:\JavaDeveloper\SQL\mysql-5.7.17-winx64\bin;F:\JavaDeveloper\Nodejs\nodejs7\;C:\Users\wangmengjun\AppData\Local\Programs\Python\Python36\Scripts\;C:\Users\wangmengjun\AppData\Local\Programs\Python\Python36\;C:\Users\wangmengjun\AppData\Local\Programs\Python\Python35\Scripts\;C:\Users\wangmengjun\AppData\Local\Programs\Python\Python35\;C:\Program Files (x86)\OpenVPN\bin;C:\Users\wangmengjun\AppData\Local\Microsoft\WindowsApps;C:\Users\wangmengjun\AppData\Roaming\npm;. [INFO ][2017-05-18 21:06:14,444] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:java.io.tmpdir=C:\Users\WANGME~1\AppData\Local\Temp\ [INFO ][2017-05-18 21:06:14,444] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:java.compiler=<NA> [INFO ][2017-05-18 21:06:14,444] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:os.name=Windows 8.1 [INFO ][2017-05-18 21:06:14,445] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:os.arch=amd64 [INFO ][2017-05-18 21:06:14,445] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:os.version=6.3 [INFO ][2017-05-18 21:06:14,445] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:user.name=wangmengjun [INFO ][2017-05-18 21:06:14,445] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:user.home=C:\Users\wangmengjun [INFO ][2017-05-18 21:06:14,445] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:user.dir=F:\JavaDeveloper\workspaces\SpringMVCDubboExample\dubbo-demo\dubbo-demo-provider [INFO ][2017-05-18 21:06:14,446] org.apache.zookeeper.ZooKeeper.<init>(ZooKeeper.java:373) - Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=30000 watcher=org.I0Itec.zkclient.ZkClient@7251c1ad [INFO ][2017-05-18 21:06:14,454] org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1041) - Opening socket connection to server /127.0.0.1:2181 [INFO ][2017-05-18 21:06:14,456] org.apache.zookeeper.ClientCnxn$SendThread.primeConnection(ClientCnxn.java:949) - Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session [INFO ][2017-05-18 21:06:14,608] org.apache.zookeeper.ClientCnxn$SendThread.readConnectResult(ClientCnxn.java:738) - Session establishment complete on server 127.0.0.1/127.0.0.1:2181, sessionid = 0x15c1ba12c860000, negotiated timeout = 30000 [INFO ][2017-05-18 21:06:14,610] org.I0Itec.zkclient.ZkClient.processStateChanged(ZkClient.java:449) - zookeeper state changed (SyncConnected) [INFO ][2017-05-18 21:06:14,611] com.alibaba.dubbo.registry.support.AbstractRegistry.register(AbstractRegistry.java:302) - [DUBBO] Register: dubbo://192.168.102.51:20880/com.xxx.dubbo.demo.service.GreetingService?anyhost=true&application=dubbo-demo-provider&dubbo=2.5.4-SNAPSHOT&generic=false&interface=com.xxx.dubbo.demo.service.GreetingService&methods=hello&pid=18448&side=provider&threadpool=cached&threads=100&timestamp=1495112774127, dubbo version: 2.5.4-SNAPSHOT, current host: 127.0.0.1 [INFO ][2017-05-18 21:06:14,699] com.alibaba.dubbo.registry.support.AbstractRegistry.subscribe(AbstractRegistry.java:325) - [DUBBO] Subscribe: provider://192.168.102.51:20880/com.xxx.dubbo.demo.service.GreetingService?anyhost=true&application=dubbo-demo-provider&category=configurators&check=false&dubbo=2.5.4-SNAPSHOT&generic=false&interface=com.xxx.dubbo.demo.service.GreetingService&methods=hello&pid=18448&side=provider&threadpool=cached&threads=100&timestamp=1495112774127, dubbo version: 2.5.4-SNAPSHOT, current host: 127.0.0.1 [INFO ][2017-05-18 21:06:14,758] com.alibaba.dubbo.registry.support.AbstractRegistry.notify(AbstractRegistry.java:422) - [DUBBO] Notify urls for subscribe url provider://192.168.102.51:20880/com.xxx.dubbo.demo.service.GreetingService?anyhost=true&application=dubbo-demo-provider&category=configurators&check=false&dubbo=2.5.4-SNAPSHOT&generic=false&interface=com.xxx.dubbo.demo.service.GreetingService&methods=hello&pid=18448&side=provider&threadpool=cached&threads=100&timestamp=1495112774127, urls: [empty://192.168.102.51:20880/com.xxx.dubbo.demo.service.GreetingService?anyhost=true&application=dubbo-demo-provider&category=configurators&check=false&dubbo=2.5.4-SNAPSHOT&generic=false&interface=com.xxx.dubbo.demo.service.GreetingService&methods=hello&pid=18448&side=provider&threadpool=cached&threads=100&timestamp=1495112774127], dubbo version: 2.5.4-SNAPSHOT, current host: 127.0.0.1

消费者调用

接下来,最后一个步骤就是在dubbo-demo-consumer中,调用Dubbo服务即可~ 运行中的Main类,结果如下: [INFO ][2017-05-18 21:08:45,916] org.springframework.context.support.AbstractApplicationContext.prepareRefresh(AbstractApplicationContext.java:582) - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@6ff58334: startup date [Thu May 18 21:08:45 CST 2017]; root of context hierarchy [INFO ][2017-05-18 21:08:45,966] org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [applicationContext.xml] [INFO ][2017-05-18 21:08:46,059] org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [spring-dubbo-consumer.xml] [INFO ][2017-05-18 21:08:46,118] - using logger: com.alibaba.dubbo.common.logger.log4j.Log4jLoggerAdapter [INFO ][2017-05-18 21:08:46,533] com.alibaba.dubbo.registry.support.AbstractRegistry.loadProperties(AbstractRegistry.java:232) - [DUBBO] Load registry store file C:\Users\wangmengjun\.dubbo\dubbo-registry-127.0.0.1.cache, data: {com.xxx.dubbo.demo.service.GreetingService=empty://192.168.102.51:20880/com.xxx.dubbo.demo.service.GreetingService?anyhost=true&application=dubbo-demo-provider&category=configurators&check=false&dubbo=2.5.4-SNAPSHOT&generic=false&interface=com.xxx.dubbo.demo.service.GreetingService&methods=hello&pid=18448&side=provider&threadpool=cached&threads=100&timestamp=1495112774127}, dubbo version: 2.5.4-SNAPSHOT, current host: 127.0.0.1 [INFO ][2017-05-18 21:08:46,545] org.I0Itec.zkclient.ZkEventThread.run(ZkEventThread.java:64) - Starting ZkClient event thread. [INFO ][2017-05-18 21:08:46,554] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:zookeeper.version=3.3.3-1073969, built on 02/23/2011 22:27 GMT [INFO ][2017-05-18 21:08:46,554] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:host.name=wangmengjun-PC [INFO ][2017-05-18 21:08:46,554] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:java.version=1.7.0_79 [INFO ][2017-05-18 21:08:46,554] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:java.vendor=Oracle Corporation [INFO ][2017-05-18 21:08:46,554] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:java.home=C:\Program Files\Java\jre7 [INFO ][2017-05-18 21:08:46,555] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:java.class.path=F:\JavaDeveloper\workspaces\SpringMVCDubboExample\dubbo-demo\dubbo-demo-consumer\target\classes;F:\JavaDeveloper\workspaces\SpringMVCDubboExample\dubbo-demo\dubbo-demo-interface\target\classes;D:\java_tools\Reponsitories\Maven\org\springframework\spring-core\4.3.6.RELEASE\spring-core-4.3.6.RELEASE.jar;D:\java_tools\Reponsitories\Maven\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;D:\java_tools\Reponsitories\Maven\org\springframework\spring-context\4.3.6.RELEASE\spring-context-4.3.6.RELEASE.jar;D:\java_tools\Reponsitories\Maven\org\springframework\spring-aop\4.3.6.RELEASE\spring-aop-4.3.6.RELEASE.jar;D:\java_tools\Reponsitories\Maven\org\springframework\spring-beans\4.3.6.RELEASE\spring-beans-4.3.6.RELEASE.jar;D:\java_tools\Reponsitories\Maven\org\springframework\spring-expression\4.3.6.RELEASE\spring-expression-4.3.6.RELEASE.jar;D:\java_tools\Reponsitories\Maven\com\alibaba\dubbo\2.5.4-snapshot\dubbo-2.5.4-snapshot.jar;D:\java_tools\Reponsitories\Maven\org\javassist\javassist\3.18.1-GA\javassist-3.18.1-GA.jar;D:\java_tools\Reponsitories\Maven\io\netty\netty\3.10.6.Final\netty-3.10.6.Final.jar;D:\java_tools\Reponsitories\Maven\com\github\sgroschupf\zkclient\0.1\zkclient-0.1.jar;D:\java_tools\Reponsitories\Maven\org\apache\zookeeper\zookeeper\3.3.3\zookeeper-3.3.3.jar;D:\java_tools\Reponsitories\Maven\jline\jline\0.9.94\jline-0.9.94.jar;D:\java_tools\Reponsitories\Maven\junit\junit\3.8.1\junit-3.8.1.jar;D:\java_tools\Reponsitories\Maven\log4j\log4j\1.2.14\log4j-1.2.14.jar [INFO ][2017-05-18 21:08:46,555] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:java.library.path=C:\Program Files\Java\jre7\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Common Files\lenovo\easyplussdk\bin;.;C:\Program Files\Java\jdk1.7.0_79\bin;D:\develop\apache-jmeter-2.13\bin;C:\Program Files\TortoiseSVN\bin;D:\develop\Databases\Mysql\mysql-5.6.20\bin;D:\develop\Sonar\sonar-runner-2.4\bin;D:\develop\Sonar\sonarqube-5.1.1\bin;D:\develop\python\python-2.7.10\python.exe;C:\Program Files\TortoiseGit\bin;D:\develop\ZeroC\ZeroCIce-3.6.2\bin;D:\develop\apache-maven-3.3.3\bin;D:\develop\Sonar\sonar-scanner-2.8\bin;F:\JavaDeveloper\SQL\mysql-5.7.17-winx64\bin;F:\JavaDeveloper\Nodejs\nodejs7\;C:\Users\wangmengjun\AppData\Local\Programs\Python\Python36\Scripts\;C:\Users\wangmengjun\AppData\Local\Programs\Python\Python36\;C:\Users\wangmengjun\AppData\Local\Programs\Python\Python35\Scripts\;C:\Users\wangmengjun\AppData\Local\Programs\Python\Python35\;C:\Program Files (x86)\OpenVPN\bin;C:\Users\wangmengjun\AppData\Local\Microsoft\WindowsApps;C:\Users\wangmengjun\AppData\Roaming\npm;. [INFO ][2017-05-18 21:08:46,555] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:java.io.tmpdir=C:\Users\WANGME~1\AppData\Local\Temp\ [INFO ][2017-05-18 21:08:46,555] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:java.compiler=<NA> [INFO ][2017-05-18 21:08:46,556] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:os.name=Windows 8.1 [INFO ][2017-05-18 21:08:46,556] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:os.arch=amd64 [INFO ][2017-05-18 21:08:46,556] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:os.version=6.3 [INFO ][2017-05-18 21:08:46,556] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:user.name=wangmengjun [INFO ][2017-05-18 21:08:46,556] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:user.home=C:\Users\wangmengjun [INFO ][2017-05-18 21:08:46,557] org.apache.zookeeper.Environment.logEnv(Environment.java:97) - Client environment:user.dir=F:\JavaDeveloper\workspaces\SpringMVCDubboExample\dubbo-demo\dubbo-demo-consumer [INFO ][2017-05-18 21:08:46,558] org.apache.zookeeper.ZooKeeper.<init>(ZooKeeper.java:373) - Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=30000 watcher=org.I0Itec.zkclient.ZkClient@4c52f14d [INFO ][2017-05-18 21:08:46,576] org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1041) - Opening socket connection to server /127.0.0.1:2181 [INFO ][2017-05-18 21:08:46,578] org.apache.zookeeper.ClientCnxn$SendThread.primeConnection(ClientCnxn.java:949) - Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session [INFO ][2017-05-18 21:08:46,605] org.apache.zookeeper.ClientCnxn$SendThread.readConnectResult(ClientCnxn.java:738) - Session establishment complete on server 127.0.0.1/127.0.0.1:2181, sessionid = 0x15c1ba12c860001, negotiated timeout = 30000 [INFO ][2017-05-18 21:08:46,607] org.I0Itec.zkclient.ZkClient.processStateChanged(ZkClient.java:449) - zookeeper state changed (SyncConnected) [INFO ][2017-05-18 21:08:46,628] com.alibaba.dubbo.registry.support.AbstractRegistry.register(AbstractRegistry.java:302) - [DUBBO] Register: consumer://192.168.102.51/com.xxx.dubbo.demo.service.GreetingService?application=DemoProvider&category=consumers&check=false&dubbo=2.5.4-SNAPSHOT&interface=com.xxx.dubbo.demo.service.GreetingService&methods=hello&pid=21572&side=consumer&timestamp=1495112926463, dubbo version: 2.5.4-SNAPSHOT, current host: 192.168.102.51 [INFO ][2017-05-18 21:08:46,702] com.alibaba.dubbo.registry.support.AbstractRegistry.subscribe(AbstractRegistry.java:325) - [DUBBO] Subscribe: consumer://192.168.102.51/com.xxx.dubbo.demo.service.GreetingService?application=DemoProvider&category=providers,configurators,routers&dubbo=2.5.4-SNAPSHOT&interface=com.xxx.dubbo.demo.service.GreetingService&methods=hello&pid=21572&side=consumer&timestamp=1495112926463, dubbo version: 2.5.4-SNAPSHOT, current host: 192.168.102.51 [INFO ][2017-05-18 21:08:46,853] com.alibaba.dubbo.registry.support.AbstractRegistry.notify(AbstractRegistry.java:422) - [DUBBO] Notify urls for subscribe url consumer://192.168.102.51/com.xxx.dubbo.demo.service.GreetingService?application=DemoProvider&category=providers,configurators,routers&dubbo=2.5.4-SNAPSHOT&interface=com.xxx.dubbo.demo.service.GreetingService&methods=hello&pid=21572&side=consumer&timestamp=1495112926463, urls: [dubbo://192.168.102.51:20880/com.xxx.dubbo.demo.service.GreetingService?anyhost=true&application=dubbo-demo-provider&dubbo=2.5.4-SNAPSHOT&generic=false&interface=com.xxx.dubbo.demo.service.GreetingService&methods=hello&pid=18448&side=provider&threadpool=cached&threads=100&timestamp=1495112774127, empty://192.168.102.51/com.xxx.dubbo.demo.service.GreetingService?application=DemoProvider&category=configurators&dubbo=2.5.4-SNAPSHOT&interface=com.xxx.dubbo.demo.service.GreetingService&methods=hello&pid=21572&side=consumer&timestamp=1495112926463, empty://192.168.102.51/com.xxx.dubbo.demo.service.GreetingService?application=DemoProvider&category=routers&dubbo=2.5.4-SNAPSHOT&interface=com.xxx.dubbo.demo.service.GreetingService&methods=hello&pid=21572&side=consumer&timestamp=1495112926463], dubbo version: 2.5.4-SNAPSHOT, current host: 192.168.102.51 [INFO ][2017-05-18 21:08:46,974] com.alibaba.dubbo.remoting.transport.AbstractClient.connect(AbstractClient.java:287) - [DUBBO] Successed connect to server /192.168.102.51:20880 from NettyClient 192.168.102.51 using dubbo version 2.5.4-SNAPSHOT, channel is NettyChannel [channel=[id: 0x5830ab5f, /192.168.102.51:59578 => /192.168.102.51:20880]], dubbo version: 2.5.4-SNAPSHOT, current host: 192.168.102.51 [INFO ][2017-05-18 21:08:46,975] com.alibaba.dubbo.remoting.transport.AbstractClient.<init>(AbstractClient.java:105) - [DUBBO] Start NettyClient wangmengjun-PC/192.168.102.51 connect to the server /192.168.102.51:20880, dubbo version: 2.5.4-SNAPSHOT, current host: 192.168.102.51 [INFO ][2017-05-18 21:08:47,030] com.alibaba.dubbo.config.ReferenceConfig.createProxy(ReferenceConfig.java:423) - [DUBBO] Refer dubbo service com.xxx.dubbo.demo.service.GreetingService from url zookeeper://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?anyhost=true&application=DemoProvider&check=false&dubbo=2.5.4-SNAPSHOT&generic=false&interface=com.xxx.dubbo.demo.service.GreetingService&methods=hello&pid=21572&side=consumer&timestamp=1495112926463, dubbo version: 2.5.4-SNAPSHOT, current host: 192.168.102.51 Consumer ==> Hello, Eric [INFO ][2017-05-18 21:08:47,140] org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:987) - Closing org.springframework.context.support.ClassPathXmlApplicationContext@6ff58334: startup date [Thu May 18 21:08:45 CST 2017]; root of context hierarchy [INFO ][2017-05-18 21:08:47,140] com.alibaba.dubbo.registry.support.AbstractRegistry.unsubscribe(AbstractRegistry.java:343) - [DUBBO] Unsubscribe: consumer://192.168.102.51/com.xxx.dubbo.demo.service.GreetingService?application=DemoProvider&category=providers,configurators,routers&dubbo=2.5.4-SNAPSHOT&interface=com.xxx.dubbo.demo.service.GreetingService&methods=hello&pid=21572&side=consumer&timestamp=1495112926463, dubbo version: 2.5.4-SNAPSHOT, current host: 192.168.102.51 [INFO ][2017-05-18 21:08:47,141] com.alibaba.dubbo.remoting.transport.netty.NettyChannel.close(NettyChannel.java:135) - [DUBBO] Close netty channel [id: 0x5830ab5f, /192.168.102.51:59578 => /192.168.102.51:20880], dubbo version: 2.5.4-SNAPSHOT, current host: 192.168.102.51 [INFO ][2017-05-18 21:08:47,143] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol$1.disconnected(DubboProtocol.java:130) - [DUBBO] disconected from /192.168.102.51:20880,url:dubbo://192.168.102.51:20880/com.xxx.dubbo.demo.service.GreetingService?anyhost=true&application=DemoProvider&check=false&codec=dubbo&dubbo=2.5.4-SNAPSHOT&generic=false&heartbeat=60000&interface=com.xxx.dubbo.demo.service.GreetingService&methods=hello&pid=21572&side=consumer&timestamp=1495112926463, dubbo version: 2.5.4-SNAPSHOT, current host: 192.168.102.51 从上述日志中可以看出,hello接口已经成功调用,并输出了Consumer ==> Hello, Eric 当然,我们可以切换到provider的输出日志,包含hello方法被调用执行的时间信息~ Hello Service is calling : Thu May 18 21:08:47 CST 2017
至此,一个简单的Maven + Spring + Dubbb + Zookeeper整合示例就完成了。后续,可以将provider变成一个Web工程,如springMVC实现等,其中可以和MySQL或者NoSQL(如MongoDB等)集成,进一步完成其它功能~

问题解决参考

No appenders could be found for logger

log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment). log4j:WARN Please initialize the log4j system properly. 根据描述 ,解决方法很简单,配置一个log4j.properties文件在resouce下即可 log4j.properties的内容简单如下: # Rules reminder: # DEBUG < INFO < WARN < ERROR < FATAL # Global logging configuration log4j.rootLogger=INFO,stdout ## Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=[%-5p][%d{yyyy-MM-dd HH:mm:ss,SSS}] %l - %m%n

dubbo标签xml配置文件报错

参考博文【Dubbo标签在xml配置文件中报错的解决方法

整个工程结构

  1. 打赏
  2. 点赞
  3. 收藏
  4. 分享
共有 人打赏支持
粉丝 81
博文 76
码字总数 154244
评论 (4)
刘小菜
很详细。赞一个
蚂蚁搬五岳
不错的文章
北极心
项目打包提供下载就完美了
Andy市民
不错,很详细

×
王孟君
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额:
利发国际官方网