本文来给大家介绍下基于Spring配置的方式来搭建dubbo中的服务提供端和消费端
provider和consumer的搭建
1.项目结构
项目采用Maven聚合功能,共有三个模块,结构如下:
dubbo-common
dubbo-consumer
dubbo-provider
模块说明
模块 说明
dubbo-common 公共模块,用来存放服务提供者和消费则所需的所有的接口和pojo类,实现代码的复用,dubbo-provider和dubbo-consumer都需要引入这个包,所以我们需要先 mvn clean install
dubbo-provider 服务提供者
dubbo-consumer 服务消费者
2.具体实现
2.1dubbo-common
package com.bobo.pojo; public class Person { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } @Override public String toString() { return "Person [id=" + id + ", name=" + name + "]"; } public void setName(String name) { this.name = name; } }
UserService.java
接口中定义
package com.bobo.service; import com.bobo.pojo.Person; public interface UserService { String sayHello(String name); String testPojo(Person person); }
2.2 provider
pom.xml
引入相关的依赖
<dependencies> <!-- 依赖公共模块 --> <dependency> <groupId>com.bobo</groupId> <artifactId>dubbo-common</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!-- 引入Spring的依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.21.RELEASE</version> </dependency> <!-- 引入日志的依赖 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> </dependency> <!-- 引入dubbo框架(服务端、客户端通用) --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> <exclusions> <exclusion> <artifactId>spring</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <!-- 因为dubbo服务端需要注册服务到zk中,因此依赖zkClient包 --> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> </dependencies>
Spring配置文件
在spring配置文件中设置dubbo的相关信息
<?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:context="http://www.springframework.org/schema/context" 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://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="dubboProvider" /> <!-- 使用zookeeper注册中心暴露服务地址 --> <dubbo:registry protocol="zookeeper" address="192.168.88.171:2181,192.168.88.172:2181,192.168.88.173:2181" /> <!-- 用dubbo协议在20880端口暴露服务 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 启用monitor模块 --> <dubbo:monitor protocol="registry" /> <bean id="userService" class="com.bobo.service.UserServiceImpl" /> <!-- 声明需要暴露的服务接口 --> <dubbo:service interface="com.bobo.service.UserService" ref="userService" group="dubbo" version="1.0.0" timeout="3000"/> </beans>
zookeeper的配置方式如下:
<dubbo:registry address="zookeeper://192.168.88.171:2181" />
或者
<dubbo:registry protocol="zookeeper" address="192.168.88.171:2181" />
如果有多个ip地址
<dubbo:registry address="zookeeper://192.168.88.171:2181?backup=192.168.88.172:2181,192.168.88.173:2181" />
或者
<dubbo:registry protocol="zookeeper" address="192.168.88.171:2181,192.168.88.172:2181,192.168.88.173:2181" />
另外你还可以在同一个 Zookeeper 服务器上划分多个分组
<dubbo:registry id="registry1" protocol="zookeeper" address="10.20.153.10:2181" gr oup="registry1" /> <dubbo:registry id="registry2" protocol="zookeeper" address="10.20.153.10:2181" gro up="registry2" />
在同一个 Zookeeper 服务器上划分了两个分组,也就是会有两颗树目录,树根分别为 registry1 和 registry2。
UserServiceImpl
接口实现类
public class UserServiceImpl implements UserService { @Override public String sayHello(String name) { //让当前当前线程休眠2s try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("-------"+name); return name+"----000"; } @Override public String testPojo(Person person) { System.out.println(person.getName()+"/t"+person.getId()); return "你好啊..."; } }
log4j.properties
log4j.rootLogger=INFO,A1 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout
测试启动
package com.bobo.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { public static void main(String[] args) throws InterruptedException { ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); //挂起当前线程,如果没有改行代码,服务提供者进程会消亡,服务消费者就发现不了提供者了 Thread.currentThread().join(); } }
服务已经成功注册到了zookeeper中
在这里插入图片描述
2.3 consumer
pom.xml
引入相关的依赖
<dependencies> <!-- 依赖公共模块 --> <dependency> <groupId>com.bobo</groupId> <artifactId>dubbo-common</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!-- 依赖Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.21.RELEASE</version> </dependency> <!-- log4j的依赖 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> </dependency> <!-- 引入dubbo框架(服务端、客户端通用) --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> <exclusions> <exclusion> <artifactId>spring</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <!-- 因为dubbo服务端需要注册服务到zk中,因此依赖zkClient包 --> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> </dependencies>
Spring配置文件
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 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://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --> <dubbo:application name="dubboConsumer" /> <!-- 使用zookeeper注册中心暴露发现服务地址 --> <dubbo:registry protocol="zookeeper" address="192.168.88.171:2181,192.168.88.172:2181,192.168.88.173:2181" /> <!-- 启动monitor--> <dubbo:monitor protocol="registry" /> <!-- 生成远程服务代理,可以和本地bean一样使用demoService --> <dubbo:reference id="userService" interface="com.bobo.service.UserService" group="dubbo" version="1.0.0" timeout="3000"/> </beans>
log4j.properties
log4j.rootLogger=INFO,A1 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout
TsetConsumer.java
package com.bobo.test; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.bobo.service.UserService; public class TestConsumer { public static void main(String[] args) { ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); final UserService demoService = (UserService) ac.getBean("userService"); System.out.println(demoService.sayHello("哈哈哈")); } }
测试输出
说明服务消费者已经正常调用了服务提供方的服务了!