
spring整合dubbo实现跨服务调用
spring整合dubbo实现多个服务之间相互调用最近刚学习了dubbo,一个开源优秀的RPC框架,使用的是spring整合dubbo实现多服务之间调用,当然现在基于注解版本的,以及整合springboot版本的都已经实现,可以在dubbo官网中查看,以后也会慢慢更新相应的博客,所以这里从最基本也是最繁杂的spring配置文件开始。在实现这个服务相互调用之前,我们有必要了解dubbo的整体架构。D
spring整合dubbo实现多个服务之间相互调用
最近刚学习了dubbo,一个开源优秀的RPC框架,使用的是spring整合dubbo实现多服务之间调用,当然现在基于注解版本的,以及整合springboot版本的都已经实现,可以在dubbo官网中查看,以后也会慢慢更新相应的博客,所以这里从最基本也是最繁杂的spring配置文件开始。
在实现这个服务相互调用之前,我们有必要了解dubbo的整体架构。
Dubbo Register:dubbo注册中心,服务提供者启动时将服务注册到注册中心中,服务消费者启动时从注册中心查找对应的服务进行消费,注册中心目前可以用zk(zookeeper)等作为注册中心,可以自行从网上下载安装。
Dubbo Exporter:生产者,提供服务给消费者消费
Dubbo Invoker:消费者,消费生产者提供的服务
Dubbo Monitor:监控,可以监控生产者和消费者服务发布以及消费情况,以及其他相应情况。
在写生产者和消费者之前,我们将javabean和interface等单独聆取出来作为一个公共项目,然后打成jar包放在本地,最后在生产者和消费者的pom文件中导入依赖即可。
实体类,接口等。
<dependency>
<groupId>com.atguigu.gmall</groupId>
<artifactId>gmall-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
然后再生产者消费者的pom文件中导入这个依赖即可,就可以获得公共的实体类和接口。
生产者代码:
第一步:导入依赖
因为使用dubbo和zk,所以自然要导入这两个依赖。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.12</version>
</dependency>
//这个依赖是因为出现了ClassNoDef的错误,导入即可解决
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.32.Final</version>
</dependency>
<!-- 由于注册中心使用的是zookeeper,引入操作zookeeper的客户端,zk2.6版本之后导入curator,2.6之前
导入zkClient-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
2:功能提供类
//模拟从数据库返回的两条数据
public class UserServiceImpl implements UserService {
public List<UserAddress> getUserAddressList(String userId) {
UserAddress address1 = new UserAddress(1, "江西省南昌市", "1", "李老师", "123", "Y");
UserAddress address2 = new UserAddress(2, "江西省上饶市", "1", "郑老师", "456", "Y");
return Arrays.asList(address1,address2);
}
}
3.配置文件
<?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">
<!--1.指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名-->
<dubbo:application name="user-service-provider"></dubbo:application>
<!--2.指定注册中心的位置-->
<dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>
<!-- <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>-->
<!--3.指定通信规则(通信协议?通信端口)-->
<dubbo:protocol name="dubbo" port="20880"></dubbo:protocol>
<bean id="userServiceImpl" class="com.atguigu.gmall.service.impl.UserServiceImpl"/>
<!--暴露服务 ref:只想真正的服务实现-->
<dubbo:service interface="service.UserService" ref="userServiceImpl"></dubbo:service>
</beans>
4:测试类
public class MainApplication {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml");
context.start();
System.in.read();
}
}
消费者代码实现
1.导入依赖,同生产者依赖一样,可以直接复用。
2.消费者代码
//把该类注入到spring容器中
@Service
public class OrderServiceImpl implements OrderService {
@Resource
UserService userService;
public void initOrder(String userId) {
System.out.println("用户id"+userId);
//1.查询用户的收货地址
List<UserAddress> addressList = userService.getUserAddressList(userId);
for (UserAddress userAddress:addressList){
System.out.println(userAddress);
}
}
}
3.配置文件
<?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"
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-3.0.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<context:component-scan base-package="com.atguigu.gmall.service.impl"></context:component-scan>
<!--1.指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名-->
<dubbo:application name="order-service-consumer"></dubbo:application>
<dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>
<!-- 声明需要调用的远程服务的接口:生成远程服务代理-->
<dubbo:reference interface="service.UserService" id="userService"></dubbo:reference>
</beans>
4:测试代码
public class MainApplication {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");
OrderService bean = context.getBean(OrderService.class);
bean.initOrder("1");
System.in.read();
}
}
注意导入的curator版本一定要低一点,否则会报错。其中有什么描述的不恰当的还望指教。
最后效果图如下所示:
更多推荐