飞道的博客

dubbo官方示例笔记

313人阅读  评论(0)

直连提供者

通常我们称之为点对点链接
作为消费者 我们如果需要直连一个服务,可以在配置文件里面这样写
服务端暴露服务

<!-- 省略部分 -->
    <!--服务发布的配置,需要暴露的服务接口-->
    <!--interface  接口路径-->
    <!--timeout  服务的超时时间-->
    <!--retries 服务的重试次数-->
    <!--loadbalance 服务的负载均衡策略 random 随机,roundrobin 轮询 leastactive 最少活跃调用数,响应的越快的越容易收到请求,相同的随机
      consistenthash   一致性hash ,相同参数的请求总是发到同一提供者,当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动 -->
    <!--actives-->
    <!--ref-->
    <dubbo:service
            interface="com.jenkin.common.module1api.OrderService"
            retries="2"
            cluster="failover"
            loadbalance="leastactive"
            ref="orderService">
        <!--可以指定方法级别的配置-->
        <dubbo:method name="getOrderFailOver" retries="2" />
        <dubbo:method name="getOrder" actives="0" />
    </dubbo:service>
    <!-- 省略部分 -->

消费端:

<dubbo:reference id="xxxService" interface="com.jenkin.common.module1api.OrderService" url="dubbo://localhost:20880" />

这样连接就不会去使用注册中心,一版不会在生产环境这样使用

只订阅

在使用dubbo开发的过程中,如果我们本地的应用需要调用一些其他的稳定服务,比如邮件,短信服务,但是呢,我们又不想发现在还没开发好的服务注册上去,所以我们本地就可以只用,不注册

 <dubbo:registry address="zookeeper://47.102.XXX.XXX:7000" register="false"/>

只注册

同理,有了上面的只订阅,那么肯定就会有只注册,为什么会有只注册,因为我们有时候如果有多个注册中心,但是呢有一个注册中心里面的服务我们是不需要的,不过别人又会从这个注册中心上面拉取我们的服务,所以这时候就需要只注册了

 <dubbo:registry address="zookeeper://47.102.XXX.1:7000"  />
 <dubbo:registry address="zookeeper://47.102.XXX.2:7000" subscribe="false"   />

比如上面,我们需要提供服务到47.102.XXX.2 上面去,但是呢我们不需要从47.102.XXX.2上面拉取服务

静态服务

静态服务可以看做是把服务的自动注册和发现功能给改成手动得了,不过服务还是会自动注册上来,只是注册上了之后不会启用处于一个被禁用的状态。
需要手动去启用
这个一般在写监控平台或者监控脚本的时候会去使用

多协议

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:dubbo="http://dubbo.apache.org/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> 
    <dubbo:application name="world"  />
    <dubbo:registry id="registry" address="10.20.141.150:9090" username="admin" password="hello1234" />
    <!-- 多协议配置 -->
    <dubbo:protocol name="dubbo" port="20880" />
    <dubbo:protocol name="rmi" port="1099" />
    <!-- 使用dubbo协议暴露服务 -->
    <dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" protocol="dubbo" />
    <!-- 使用rmi协议暴露服务 -->
    <dubbo:service interface="com.alibaba.hello.api.DemoService" version="1.0.0" ref="demoService" protocol="rmi" /> 
</beans>

需要与 http 客户端互操作

<?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://dubbo.apache.org/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    <dubbo:application name="world"  />
    <dubbo:registry id="registry" address="10.20.141.150:9090" username="admin" password="hello1234" />
    <!-- 多协议配置 -->
    <dubbo:protocol name="dubbo" port="20880" />
    <dubbo:protocol name="hessian" port="8080" />
    <!-- 使用多个协议暴露服务 -->
    <dubbo:service id="helloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" protocol="dubbo,hessian" />
</beans>

多注册中心

同一个服务注册到不同的注册中心

例如 helloService 同时注册到了两个注册中心

    <!-- 多注册中心配置 -->
    <dubbo:registry id="hangzhouRegistry" address="10.20.141.150:9090" />
    <dubbo:registry id="qingdaoRegistry" address="10.20.141.151:9010" default="false" />
    <!-- 向多个注册中心注册 -->
    <dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" registry="hangzhouRegistry,qingdaoRegistry" />

不同服务不同注册中心

例如:官网示例,HelloService注册到chinaRegistry,DemoService注册到intlRegistry

  <!-- 多注册中心配置 -->
    <dubbo:registry id="chinaRegistry" address="10.20.141.150:9090" />
    <dubbo:registry id="intlRegistry" address="10.20.154.177:9010" default="false" />
    <!-- 向中文站注册中心注册 -->
    <dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" registry="chinaRegistry" />
    <!-- 向国际站注册中心注册 -->
    <dubbo:service interface="com.alibaba.hello.api.DemoService" version="1.0.0" ref="demoService" registry="intlRegistry" />

分开引用不同注册中心的相同服务

比如:CRM 需同时调用中文站和国际站的 PC2 服务,PC2 在中文站和国际站均有部署,接口及版本号都一样,但连的数据库不一样。

    <!-- 多注册中心配置 -->
    <dubbo:registry id="chinaRegistry" address="10.20.141.150:9090" />
    <dubbo:registry id="intlRegistry" address="10.20.154.177:9010" default="false" />
    <!-- 引用中文站服务 -->
    <dubbo:reference id="chinaHelloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" registry="chinaRegistry" />
    <!-- 引用国际站站服务 -->
    <dubbo:reference id="intlHelloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" registry="intlRegistry" />

服务分组

当一个接口有多个实现类的时候,注册的时候就可以对每个接口的实现进行分组
例如:
服务提供端 的配置:
这里有一点需要注意,在使用了分组之后就不能再服务端指定方法级别的配置了,因为dubbo会根据方法名把method标签封装成为beanDefinition对象,如果重名,就会报错。

服务消费端的配置:

xml文件配置好之后在代码里面直接引用就好

多版本

当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。
可以按照以下的步骤进行版本迁移:

  1. 在低压力时间段,先升级一半提供者为新版本
  2. 再将所有消费者升级为新版本
  3. 然后将剩下的一半提供者升级为新版本

服务端定义多个版本的服务

消费端定义需要使用的版本
使用模式和group的使用差不多

代码调用

异步调用

dubbo 的异步调用
Dubbo 的异步调用是非阻塞的 NIO 调用,一个线程可同时并发调用多个远程
服务,每个服务的调用都是非阻塞的,线程立即返回。就是对 java 中 Futrue
模式的扩展支持

  1. XML定义
 <dubbo:method name="addOrderCost2Seconds" async="true" sent="true" return="true"/>
        <dubbo:method name="getOrderCost2Seconds"  async="true"/>
  1. 测试类
 @Autowired
    UserService userService;

    /**
     * 使用方式:
     * 1、async 使用异步
     * 2、sent 是否等待请求发送成功之后再返回,发送失败直接抛异常
     * 3、return 是否关心返回值
     * <dubbo:method name="addOrderCost2Seconds" async="true" sent="true" return="true"/>
     * 使用异步调用科明显缩短接口的总耗费时长
     * @return
     * @throws ExecutionException
     * @throws InterruptedException
     */
    @GetMapping("/testAsyncCall")
    public OrderDTO test() throws ExecutionException, InterruptedException {

        userService.testAsyncCall();
        return new OrderDTO();

    }

上面测试对每个接口休眠了2秒,使用异步之后两个接口的总执行时间为2秒

事件通知

在调用之前、调用之后、出现异常时,
会触发 oninvoke、onreturn、onthrow 三个事件,
可以配置当事件发生时,通知哪个类的哪个方法

  • 配置代码
<dubbo:method name="testEventNotice" oninvoke="eventService.oninvoke"
                           onreturn="eventService.onreturn"
                           onthrow="eventService.onthrow" />
  • 测试用例
 @Autowired
    UserService userService;

    /**
     * 时间通知可以与异步结合使用
     *  1、同步回调
     *  仅仅使用回调
     *  2、异步回调
     *  加上aSync=‘true’
     *  3、同步无回调
     *  4、异步无回调
     *  回调事件
     *  使用方式
     *   <dubbo:method name="testEventNotice" oninvoke="eventService.oninvoke"
     *                       onreturn="eventService.onreturn"
     *                       onthrow="eventService.onthrow" />
     *  1、onreturn
     *  在方法返回的时候回调
     *  2、oninvoke
     *  在方法开始执行的是调用
     *  3、onthrow
     *  在方法出异常的时候调用
     *
     *
     * @return
     * @throws ExecutionException
     * @throws InterruptedException
     */
    @GetMapping("/testEventNotice")
    public OrderDTO test() throws ExecutionException, InterruptedException {
        userService.testEventNotice();
        return new OrderDTO();
    }
  • 执行结果

转载:https://blog.csdn.net/youzi1394046585/article/details/105605500
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场