RPC简介和Dubbo入门案例

一、RPC简介

1、什么是RPC

百度百科解释:

RPC服务器,是指 Remote Procedure Call Protocol,中文释义为(RFC-1831)远程过程调用协议:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过发送请求-接受回应进行信息交互的系统。

对于Java程序员而言,RPC就是远程方法调用。

1.1 远程方法调用和本地方法调用

远程方法调用和本地方法调用是相对的两个概念:

  • 本地方法调用指的是进程内部的方法调用,
  • 远程方法调用指的是两个进程内的方法相互调用。

如果实现远程方法调用,基本的就是通过网络,通过传输数据来进行调用。所以就有了:

  • RPC over Http:基于Http协议来传输数据
  • PRC over Tcp:基于Tcp协议来传输数据

1.2 传输的数据

对于所传输的数据,可以交由RPC的双方来协商定义,但基本都会包括:

  • 调用的是哪个类或接口
  • 调用的是哪个方法,包括方法名和方法参数类型列表,方法参数值别表(考虑方法重载)
  • 调用的协议
  • 调用的版本号(可解决一个接口的多实现等问题)

所以,我们其实可以看到 RPC的自定义性是很高的,而 Dubbo就是阿里所开源出来的一套 RPC框架。

2、RPC 框架原理

参考文章:

RPC 架构主要包括三部分:
在这里插入图片描述

  • 服务注册中心(Registry),负责将本地服务发布成远程服务,管理远程服务,提供给服务消费者使用。
  • 服务提供者(Server),提供服务接口定义与服务实现类。
  • 服务消费者(Client),通过远程代理对象调用远程服务。

服务提供者启动后主动向服务注册中心(Registry)注册机器IP、端口以及提供的服务列表;

服务消费者启动时向服务注册中心(Registry)获取服务提供方地址列表。

服务注册中心(Registry)可实现负载均衡,故障切换,服务降级,Mock和心跳检测等。

二、Dubbo简介

1、什么是Dubbo

官网地址:http://dubbo.apache.org/zh/

官网解释:

Apache Dubbo 是一款微服务框架,为大规模微服务实践提供高性能 RPC 通信、流量治理、可观测性等解决方案,涵盖 Java、Golang 等多种语言 SDK 实现。
它的核心设计原则:微内核 + 插件体系,平等对待第三方。

在之前,官网的介绍是:

Apache Dubbo 是一款高性能、轻量级的开源 Java RPC框架。

1.1 为什么会将 RPC改为微服务?

Dubbo以前的定位就是 RPC,专注于两个服务之间的调用。但随着微服务的盛行,除了服务调用之外,Dubbo也在逐步的涉及服务治理、服务监控、服务网关等等。

所以现在的 Dubbo目标已经不仅仅是 RPC框架了,而是和 Spring Cloud类似想成为了一个微服务框架。

Dubbo 3.0 版本的正式发布,标志着 Apache Dubbo 正式进入云原生时代。3.0 在通信协议、服务发现、部署架构、服务治理上都对云原生基础设施进行了全面适配, 提供了Triple、应用级服务发现、Dubbo Mesh等核心特性。

Apache Dubbo官网中文文档:

更多介绍,查看官方文档,下面我们搭建一个案例进行dubbo的使用。

三、Dubbo入门案例

使用版本:

  • dubbo 2.7.5
  • zookeeper 3.6.3

下面创建一个项目来使用Duboo。

  • consumer模块:消费方服务
  • provider模块:提供方服务
  • facade-api:服务针对 RPC使用(消费方/提供方)时的公共接口

在这里插入图片描述

1、创建facade-api模块

定义RPC使用(消费方/提供方)的公共接口。

这里简单的定义一个 DemoService接口:

public interface DemoService {

    String sayHello(String name);
}

2、创建提供方服务

2.1 引入依赖

主要引入 org.apache.dubbo和 zookeeper依赖如下:

    <dependencies>
        <!-- spring -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.3.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.3.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.3.5.RELEASE</version>
        </dependency>

<!--        <dependency>-->
<!--            <groupId>com.alibaba.spring</groupId>-->
<!--            <artifactId>spring-context-support</artifactId>-->
<!--            <version>1.0.6</version>-->
<!--        </dependency>-->
        <!--dubbo-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.5</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-context</artifactId>
                </exclusion>
            </exclusions>
        </dependency>


        <!-- Zookeeper 原生API客户端 -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.6.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- Curator 客户端   -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>5.1.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>5.1.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--    引入 facade-api模块-->
        <dependency>
            <groupId>com.charge.learn.dubbo27.study</groupId>
            <artifactId>facade-api</artifactId>
            <version>1.0.0</version>
        </dependency>


        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

2.2 配置文件

(1)application.yml

server:
  port: 18082

spring:
  main:
    allow-bean-definition-overriding: true
  application:
    name: dubbo_provider_demo

(2)创建 dubbo.properties配置文件

配置内容:

  • dubbo服务提供者的扫包范围
  • 注册中心 zk的连接地址
dubbo.application.name=dubbo_provider_demo
dubbo.registry.address=zookeeper://192.168.xxx.xxx:2181
dubbo.scan.base-packages=com.charge.learn.dubbo27.study.provider.service
dubbo.registry.timeout=100000

2.3 rpc接口实现类

使用了 dubbo的 @Service注解来暴露服务。后面高版本换成了@DubboService注解。

@org.apache.dubbo.config.annotation.Service
public class DemoServiceImpl implements DemoService {
    
    @Override
    public String sayHello(String name) {
        URL url = RpcContext.getContext().getUrl();
        System.out.println("=======provider===sayHello方法调用=== name ->" + name);
        System.out.println("=======provider===sayHello方法调用=== url -> " + url);
        return "Hello " + name;
    }
}

2.4 启动类

添加注解开启 Dubbo使用:

  • @EnableDubbo注解:开启Dubbo使用,会扫描服务所在的包。即扫描@Service, @Reference注解来暴露和引入服务接口。
  • @PropertySource注解:加载 dubbo.properties配置文件信息
@SpringBootApplication
@EnableDubbo
@PropertySource("dubbo.properties")
public class ProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

3、创建消费方服务

3.1 引入依赖

引入依赖同上。

3.2 配置文件

(1)application.yml

server:
  port: 18081

spring:
  main:
    allow-bean-definition-overriding: true
  application:
    name: dubbo_consumer_demo

(2)创建 dubbo.properties配置文件

dubbo.consumer.check=false
dubbo.application.name=dubbo_consumer_demo
dubbo.registry.address=zookeeper://192.168.xxx.xxx:2181
dubbo.scan.base-packages=com.charge.learn.dubbo27.study.consumer

3.3 controller调用 rpc接口

使用了 dubbo的 @Reference注解来暴露服务。后面高版本换成了@DubboReference注解。

@RestController
public class DemoController {

    @Reference
    private DemoService demoService;

    @GetMapping("/sayHello")
    public String sayHello() {

        return demoService.sayHello("dubbo RPC调用");
    }
}

3.4 启动类

@SpringBootApplication
@EnableDubbo
@PropertySource("dubbo.properties")
public class ConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

4、测试

启动 provider服务和 consumer服务。

使用了 ZooKeeper 3.6.3 版本,启动服务时我们添加 JVM参数-Dzookeeper.sasl.client=false来禁用 SASL 认证。
在这里插入图片描述
providers保存了暴露服务的接口信息。URLEncode解码之后:
在这里插入图片描述

4.2 访问 consumer服务的 controller,调用 RPC服务。

在这里插入图片描述
调用 RPC服务ok。Dubbo框架实现了RPC调用的更多细节,程序员只关注业务即可。

在项目搭建时,遇到不少问题,参考文章如下:解决遇到的报错信息

– 求知若饥,虚心若愚。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值