002-集成Dubbo

集成

架构

在这里插入图片描述

架构分析

Dubbo作为一个RPC调用框架作用就是让服务具有RPC调用的能力
RPC就是远程调用就像本地调用一个Bean的方法那样
调用者不用去写提供者的路径等

zk在这里做注册中心用的
提供者要注册到注册中心,注册:host、port、协议等
消费者读取配置中心配置缓存后,发送RPC请求调用提供者

Spring boot 集成

引入依赖

<!-- 定义了 dubbo 和 zookeeper(以及对应的连接器 curator)的依赖 -->
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
    <type>pom</type>
    <exclusions>
        <exclusion>
            <artifactId>slf4j-reload4j</artifactId>
            <groupId>org.slf4j</groupId>
        </exclusion>
    </exclusions>
</dependency>

提供API 调用桥梁

消费者和提供者都要使用的

package org.apache.dubbo.springboot.demo;

public interface DemoService {

    String sayHello(String name);
}

添加Dubbo服务

需要在消费者和提供者的Application服务类上添加org.apache.dubbo.config.spring.context.annotation.EnableDubbo 注解

服务提供者-服务实现

package org.apache.dubbo.springboot.demo.provider;

import org.apache.dubbo.config.annotation.DubboService;
import org.apache.dubbo.springboot.demo.DemoService;

@DubboService
public class DemoServiceImpl implements DemoService {

    @Override
    public String sayHello(String name) {
        return "Hello " + name;
    }
}

服务提供者-添加配置

  • 提供一个名称,方便注册中心区分
  • 提供自身对外提供服务的协议
  • 提供注册中心的地址
dubbo:
  application:
    name: dubbo-springboot-demo-provider
  protocol:
    name: dubbo
    port: -1
  registry:
    address: zookeeper://${zookeeper.address:127.0.0.1}:2181

服务消费者-添加配置

dubbo:
  application:
    name: dubbo-springboot-demo-consumer
  protocol:
    name: dubbo
    port: -1
  registry:
    address: zookeeper://${zookeeper.address:127.0.0.1}:2181

服务消费者-配置消费端请求任务

在Bean中引入依赖

@DubboReference
private DemoService demoService;

//直接调用即可
demoService.sayHello("world")

服务调用

如果需要立即调用的话
启动的时候先启动提供者
后启动消费者

扩展

为什么要新增Dubbo协议

Http 1.0 和1.1 版本会额外带有很多没有用的参数
并且只能一次获取到请求的响应后才能继续下一次的请求
没有参数对应请求和相应

dubbo协议就支撑请求和相应分开(请求中会带有请求id,在相应的时候会根据id关联),且所有传输字段都是自己需要的

但是很显然,dubbo只能本框架使用,所以后续dubbo提供使用了http2为基础的新协议,方便和其他框架集成

Triple协议 -底层

之前Dubbo协议还是存在一些问题,就是没办法很方便的跨架构,跨语言调用
所以又做了一个Triple协议,这个协议是基于 http2.0,兼容了兼容性和性能
并且支持流式调用
所以在dubbo3.0之后就用Triple协议 作为默认协议了

Triple协议 -服务端流

流式调用就是服务端可以一个请求,分多次返回给调用端
引入依赖

<dependencies>
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-common</artifactId>
        <version>3.0.7</version>
    </dependency>
</dependencies>

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-rpc-triple</artifactId>
    <version>3.0.7</version>
</dependency>
public interface UserService {
    // SERVER_STREAM
    default void sayHelloServerStream(String name, StreamObserver<String> response) {
    }
}

//实现类处理
// SERVER_STREAM
@Override
public void sayHelloServerStream(String name, StreamObserver<String> response) {
    response.onNext(name + " hello");
    response.onNext(name + " world");
    response.onCompleted();
}

StreamObserver 就可以多次塞入返回值,最后调用onCompleted标识返回结束

调用者会次接到返回,并处理

userService.sayHelloServerStream("zhouyu", new StreamObserver<String>() {
    @Override
    public void onNext(String data) {
        // 服务端返回的数据
        System.out.println(data);
    }

    @Override
    public void onError(Throwable throwable) {}

    @Override
    public void onCompleted() {
        System.out.println("complete");
    }
});

Triple协议 -双端流

双端流就是方法的入参和出参都是一个Steam
服务端:

// CLIENT_STREAM
@Override
public StreamObserver<String> sayHelloStream(StreamObserver<String> response) {
    return new StreamObserver<String>() {
        @Override
        public void onNext(String data) {
            // 接收客户端发送过来的数据,然后返回数据给客户端
            response.onNext("result:" + data);
        }

        @Override
        public void onError(Throwable throwable) {}

        @Override
        public void onCompleted() {
            System.out.println("completed");
        }
    };
}

消费端

StreamObserver<String> streamObserver = userService.sayHelloStream(new StreamObserver<String>() {
     @Override
     public void onNext(String data) {
         System.out.println("接收到响应数据:"+ data);
     }

     @Override
     public void onError(Throwable throwable) {}

     @Override
     public void onCompleted() {
         System.out.println("接收到响应数据完毕");
     }
});

// 发送数据
streamObserver.onNext("request zhouyu hello");
streamObserver.onNext("request zhouyu world");
streamObserver.onCompleted();

消费端传入2次入参

streamObserver.onNext("request zhouyu hello");
streamObserver.onNext("request zhouyu world");

服务端进入处理

void onNext(String data)

服务端返回流,进入消费端Stream处理

userService.sayHelloStream(new StreamObserver<String>()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值