通过之前的学习了解了dubbo的常规的使用,下面我们看看特殊情况或者说真实环境下使用dubbo的一些配置实例。

一、一个接口有多个实现时可以使用group来区分

1、服务提供者配置

<?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
        ">     
     <!-- 提供方应用信息,用于计算依赖关系,这个和client没必要一致 -->
    <dubbo:application name="hello-world-app-my" />
     <!-- 使用zookeeper广播注册中心暴露服务地址 -->
   <dubbo:registry  protocol="zookeeper"  address="192.168.0.107:2181"/>
     <!-- 用dubbo协议在20880端口暴露服务 -->
       <dubbo:protocol name="dubbo" port="20880" />     
        <!-- 声明需要暴露的服务接口 -->
    <dubbo:service  group="1" interface="com.test.dubboser.ServiceDemo"
        ref="demoService" /> 
    <dubbo:service group="2" interface="com.test.dubboser.ServiceDemo"
        ref="demoService2" />
    <!--和本地bean一样实现服务 -->
    <bean id="demoService"  class="com.test.dubboser.ServiceImp"/>
    <bean id="demoService2" class="com.test.dubboser.ServiceImp2"/>
</beans>

其他的配置都是一样,而暴露的服务接口通过group来区分两个实现类

2、服务消费者配置

<?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
        ">     
    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
    <dubbo:application name="consumer-of-helloworld-app-my" />     
       <!-- 使用zookeeper广播注册中心暴露发现服务地址 -->
    <dubbo:registry  protocol="zookeeper"  address="192.168.0.107:2181" />    
    <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->  
    <dubbo:reference id="demoServicemy" group="1" interface="com.test.dubboser.ServiceDemo" />
    <dubbo:reference id="demoServicemy2" group="2" interface="com.test.dubboser.ServiceDemo" />
</beans>

这里同样使用group来区分


二、当一个接口实现出现不兼容升级时可以用版本号过渡,版本号不同的服务互相间不引用

1、服务提供者配置

<?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
        ">     
     <!-- 提供方应用信息,用于计算依赖关系,这个和client没必要一致 -->
    <dubbo:application name="hello-world-app-my" />
     <!-- 使用zookeeper广播注册中心暴露服务地址 -->
   <dubbo:registry  protocol="zookeeper"  address="192.168.0.107:2181"/>
     <!-- 用dubbo协议在20880端口暴露服务 -->
       <dubbo:protocol name="dubbo" port="20880" />     
        <!-- 声明需要暴露的服务接口 -->
    <dubbo:service  version="1" interface="com.test.dubboser.ServiceDemo"
        ref="demoService" /> 
    <dubbo:service version="2" interface="com.test.dubboser.ServiceDemo"
        ref="demoService2" />
    <!--和本地bean一样实现服务 -->
    <bean id="demoService"  class="com.test.dubboser.ServiceImp"/>
    <bean id="demoService2" class="com.test.dubboser.ServiceImp2"/>
</beans>

添加version 来区分

2、服务消费者配置

<?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
        ">     
    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
    <dubbo:application name="consumer-of-helloworld-app-my" />     
       <!-- 使用zookeeper广播注册中心暴露发现服务地址 -->
    <dubbo:registry  protocol="zookeeper"  address="192.168.0.107:2181" />    
    <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->  
    <dubbo:reference id="demoServicemy" version="1" interface="com.test.dubboser.ServiceDemo" />
    <dubbo:reference id="demoServicemy2" version="2" interface="com.test.dubboser.ServiceDemo" />
</beans>

服务消费者这边也要使用version 来区分


三、点对点直连/指定调用需求(一般在开发测试环境中使用)

点对点直连的话我们就没必要使用zookeeper来做注册中心了,直接启动服务提供者而服务消费者直接调用指定的服务消费者接口实现类方法,所以注意这里的配置方式

1、服务提供者配置

<?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
        ">     
     <!-- 提供方应用信息,用于计算依赖关系,这个和client没必要一致 -->
    <dubbo:application name="hello-world-app-my" />
    <!--没有将服务注册到注册中心  -->
    <dubbo:registry address="N/A" />
     <!-- 用dubbo协议在20880端口暴露服务 -->
       <dubbo:protocol name="dubbo" port="20880" />     
        <!-- 声明需要暴露的服务接口 -->
    <dubbo:service   interface="com.test.dubboser.ServiceDemo"
        ref="demoService" /> 
    <!--和本地bean一样实现服务 -->
    <bean id="demoService"  class="com.test.dubboser.ServiceImp"/>
    
</beans>


2、服务消费者配置

<?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
        ">     
    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
    <dubbo:application name="consumer-of-helloworld-app-my" />   
    <!--没有注册到注册中心  -->  
     <dubbo:registry address="N/A" ></dubbo:registry>  
    <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->  
    <dubbo:reference id="demoServicemy"  interface="com.test.dubboser.ServiceDemo"
     url="dubbo://192.168.0.107:20880/com.test.dubboser.ServiceDemo"/>
</beans>

点对点的访问url 就是服务端的ip:port/接口全路径,也就是上面配置文件所示!


四、只订阅,共用注册中心,开发人员机器上的服务提供者被吴调用,影响其他开发人员

在开发中存在的问题:为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如果一个正在开发中的服务提供者注册,可能会影响消费者不能正常运行。

解决方案:以让服务提供者开发方,只订阅服务(开发的服务可能依赖其它服务),而不注册正在开发的服务,通过直连测试正在开发的服务。

1、服务提供者配置

<?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
        ">     
     <!-- 提供方应用信息,用于计算依赖关系,这个和client没必要一致 -->
    <dubbo:application name="hello-world-app-my" />
     <!-- 不注册-->
   <dubbo:registry  protocol="zookeeper"  address="192.168.0.107:2181" register="false"/>
     <!-- 用dubbo协议在20880端口暴露服务 -->
       <dubbo:protocol name="dubbo" port="20880" />     
        <!-- 声明需要暴露的服务接口 -->
    <dubbo:service  interface="com.test.dubboser.ServiceDemo"
        ref="demoService" /> 
    <!--和本地bean一样实现服务 -->
    <bean id="demoService" class="com.test.dubboser.ServiceImp"/>
</beans>

注意这里在想注册中心注册的时候有register="false" 所以服务提供者没有向服务注册中心注册服务,也就是没有暴露服务接口等信息

2、服务消费者配置

<?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
        ">     
    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
    <dubbo:application name="consumer-of-helloworld-app-my" />     
       <!-- 使用zookeeper广播注册中心暴露发现服务地址 -->
    <dubbo:registry  protocol="zookeeper"  address="192.168.0.107:2181" />    
    <!-- 还是使用点对点的方式访问,因为服务提供者没有向注册中心注册 -->
    <dubbo:reference id="demoServicemy3"  interface="com.test.dubboser.ServiceDemo"
     url="dubbo://192.168.0.107:20880/com.test.dubboser.ServiceDemo" />
</beans>

服务消费者还是使用了点对点的方法方式来访问

只订阅模式的图形:

dubbo 使用学习五(dubbo开发中使用到的一些服务配置方式)_dubbo