在分布式系统中基本没有绝对的服务提供者也没有绝对的服务消费者,即便有那也是极少极少的情况。什么时候会出现这种情况呢?比如说一个分布式系统中有一个日志处理的子系统,那么好了这个子系统基本上就是一个服务的提供者,它基本不会去调用其他的系统。那么对于大多数的分布式系统而言还是存在这种服务的提供者和消费者角色互换的情况。下面就来以上一篇的案例来大概实现一下服务消费者和提供者的角色互换问题。


既然这里要实现服务的消费者变成服务的提供者,那么我这里首先要开始着手操作服务的消费者。好了接下来就是具体的实现的方法:

1:在原来的maven项目的基础上,先创建一个对外提供的接口,然后在服务的消费者里面创建对象实现这个接口。

1.1:创建一个对外提供服务的接口:

package com.alibaba.model;
/**
  * 
  *@description: 商品管理的模块
  *@author chendawei
  */
 public interface CommodityManagerModel {    /**
      * 更新用户的商品
      * @param userMassage 用户信息
      * @return
      */
     public String updateCommodityUser(String userMassage);
 }
 1.2:实现这个接口:package com.alibaba.model.Impl;
import com.alibaba.model.CommodityManagerModel;
/**
  * 
  *@description:  商品管理的模块
  *@author chendawei
  */
 public class CommodityManagerModelImpl implements CommodityManagerModel{    public String updateCommodityUser(String userMassage) {
         return userMassage;
     }}
 2、到此对外提供服务的接口和这个接口的实现类我就写好了,那么接下来我们要创建一个application.xml用于配置向服务注册中心zookeeper提交的信息。<?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
        xmlns="http://www.springframework.org/schema/beans"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://code.alibabatech.com/schema/dubbo 
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">        <!-- 服务提供方某一个功能的具体实现,这个功能供消费者调用 -->
           <bean id="CommodityManagerModel" class="com.alibaba.model.Impl.CommodityManagerModelImpl"></bean>
           
           <!-- 服务提供者的信息,以便计算依赖关系 -->
           <dubbo:application name="DubboServerConsumerToProvider"></dubbo:application>
           
           <!-- 将服务提供者的地址暴露出去。这个过程通过zookeeper实现服务注册中心,进行注册暴露 -->
           <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>
           
           <!-- 将服务提供者的端口号暴露出去 -->
           <dubbo:protocol name="dubbo" port="20002"></dubbo:protocol>
           
           <!-- 将服务提供者需要对外提供的功能暴露出去 -->
           <dubbo:service interface="com.alibaba.model.CommodityManagerModel" ref="CommodityManagerModel"></dubbo:service>
 </beans>最后一步就是创建一个启动的对象:
package com.alibaba.run;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class RunServerProvider {
    public static void main(String[] args) {
         try {
             //加载主配置文件
             ClassPathXmlApplicationContext ac = new  ClassPathXmlApplicationContext("application.xml");
             //一直让启动的第一种方式
             /*
              * while(true) { ac.start(); System.out.println("注册成功"); }
              */
             //一直让启动的第二种方式,推荐
             ac.start();
             System.in.read();
         } catch (Exception e) {
             System.out.println(e);
         }
     }



好了到此我们服务的消费者就具有了服务提供者的角色。接下来开始在服务提供者里面创建一个服务的消费者。

1:创建一个包然后在这个包里面创建一个接口。注意:此时创建的这个包的命名必须和这个接口的命名一定要和上面服务的提供者向外暴露的接口所在的包名和接口名称一致。下面是在服务的提供者里面创建一个和上面服务的提供者相同包名和接口名的示例:

package com.alibaba.model;
public interface CommodityManagerModel {
    /**
        *    更新用户的商品
      * @param userMassage 用户信息
      * @return
      */
     public String updateCommodityUser(String userMassage);
 }2:再创建一个application.xml用户向Dubbo的注册中心注册并生成调用服务的代理对象。
<?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
        xmlns="http://www.springframework.org/schema/beans"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://code.alibabatech.com/schema/dubbo 
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx.xsd">    <!-- 服务消费者的应用程序的名称,用于计算依赖关系 -->
     <dubbo:application name="DubboServerProviderToConsumer"/>
     
     <!-- 服务消费者同时也向注册中心进行注册 -->
     <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
     
     <!-- 生成服务代理 -->
     <dubbo:reference id="CommodityManagerModel" interface="com.alibaba.model.CommodityManagerModel"/>
 </beans>最后一步就是创建一个消费者的启动的对象:
package com.alibaba.run;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.alibaba.model.CommodityManagerModel;
 import com.alibaba.moudel.UserManagerModel;/**
  *  运行服务的消费者
  *@description:
  *@author chendawei
  */
 public class RunServerConsumer {    public static void main(String[] args) {
         try {
             ClassPathXmlApplicationContext cs =  new ClassPathXmlApplicationContext("application.xml");
             cs.start();
             System.out.println("开始调用服务的消费者");
             CommodityManagerModel um = (CommodityManagerModel)cs.getBean("CommodityManagerModel");
             String userMassage = um.updateCommodityUser("你好");
             System.out.println(userMassage);
             System.in.read();
         } catch (Exception e) {
             // TODO: handle exception
         }
     }
 }


然后分别启动服务提供者中的服务提供测试对象和服务消费测试对象,服务消费者里面也是一样启动服务提供测试对象和服务消费测试对象。然后就可以去Dubbo的可视化界面中进行查看了。

提供者这里面已经有两个提供者,一个是本来的服务提供者另外一个是服务消费者启动一个服务的提供者

nacos dubbo调用其它服务 dubbo服务间的互相调用_dubbo

 

消费者这里面已经有两个消费者,一个是本来的服务消费者另外一个是服务提供者者启动一个服务的消费者

nacos dubbo调用其它服务 dubbo服务间的互相调用_spring_02

好了,这里面我们看到无论是服务的提供者还是服务的消费者都绑定到了169.254.120.125这个IP上,这个IP是我的以太网适配器 VMware Network Adapter VMnet8上IV4的IP地址。为啥会绑定到VMnet8的这个网卡上呢?下次再说