Dubbo是由阿里巴巴研发出的一款基于Java实现的RPC框架,现由Apache进行维护管理,笔记中使用zookeeper作为注册中心,dubbo+zookeeper环境安装教程:https://www.cnblogs.com/hanzhe/p/14225399.html

Dubbo笔记基于尚硅谷雷丰阳老师教程的简单总结,教程视频地址:https://www.bilibili.com/video/BV1ns411c7jV


RPC指的是远程调用,简单理解就是我们所写的程序,可以将Controller与Service层分别分放到不同的服务器上运行,通过服务器A的Controller来调用服务器B或服务器C的Service:

Java代码实现远程调用

通用模块编写

首先创建一个普通的maven工程,用来封装提供者和消费者都用得到的代码,这里命名为maven-01-api,工程中包含:

// 实体类,这里实体类必须实现序列化接口,否则远程调用失败!
public class UserEntity implements Serializable {
private String name;
private String age;
private String gender;
// get set toString.....
}
// 通用接口
public interface UserService {
List<UserEntity> selectList();
}

编写服务提供者

首先需要引入dubbo相关的maven依赖:

<!-- Dubbo依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.1.0</version>
</dependency>
<!-- Zookeeper依赖 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
</dependency>
<!-- 以及编写的通用模块依赖 -->
<dependency>
<groupId>site.hanzhe</groupId>
<artifactId>maven-01-commen</artifactId>
<version>0.0.1</version>
</dependency>

这样依赖提供者就拥有了Dubbo+zookeeper的环境以及实体类和接口了,接下来我们书写一个实现类:

public class UserServiceImpl implements UserService {
@Override
public List<UserEntity> selectList() {
UserEntity entity1 = new UserEntity("马保国", "69", "男");
UserEntity entity2 = new UserEntity("老八", "31", "男");
return Arrays.asList(entity1, entity2);
}
}

想要将服务注册到注册中心,还需要一个配置文件,在引入dubbo依赖的时候,dubbo就帮我们把spring的依赖也一同引入进来了,所以接下来的配置我们要在spring.xml文件中进行配置:

<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.xsd
http://dubbo.apache.org/schema/dubbo
http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 配置当前服务名称 -->
<dubbo:application name="maven-01-provider" />
<!-- 注册中心地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 配置通信协议以及当前服务端口号 -->
<dubbo:protocol name="dubbo" port="20001"/>
<!-- 配置一个bean -->
<bean id="userService" class="site.hanzhe.service.impl.UserServiceImpl" />
<!-- 暴露一个服务接口,对应的实现为userService -->
<dubbo:service interface="site.hanzhe.service.UserService" ref="userService" />
</beans>

配置文件准备好之后,接下来就需要启动当前程序了,创建一个启动类:

public class Provider01Application {
public static void main(String[] args) throws IOException {
// 获取IOC容器并启动
new ClassPathXmlApplicationContext("spring.xml").start();
// 读取一个字符:起到阻塞作用防止程序结束运行
System.in.read();
}
}

接下来运行main方法,稍等片刻就可以在管理页面中看到注册进来的服务(不要忘记运行Zookeeper)

编写消费者

消费者需要添加的maven依赖同提供者一致,这里就不另写了,配置文件如下所示:

<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="maven-01-consumer" />
<!-- 配置注册中心地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 在注册中心引用UserService的实现 -->
<dubbo:reference id="userService" interface="site.hanzhe.service.UserService" />
</beans>

注册中心配置完成之后,无需其他配置,直接在程序中调用即可:

public class Consumer01Application {
public static void main(String[] args) throws IOException {
// 启动IOC容器
ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("spring.xml");
// 在IOC中获取UserService的Bean
UserService bean = (UserService) ioc.getBean("userService");
// 调用接口中的方法
System.out.println(bean.selectList());
}
}

可以看到消费者中并没有书写接口的实现类,通过配置文件中的reference引用,从而实现了远程调用!

整合Springboot实现远程调用

Springboot整合Dubbo相比于maven工程简单了不少,这里使用的版本为Springboot2.4.0

编写服务提供者

首先先将配置搞定,配置信息与spring.xml差距不大:

# Dubbo相关配置
dubbo:
# 当前应用名称
application:
name: boot-01-provider
# 注册中心配置
registry:
protocol: zookeeper
address: 127.0.0.1
port: 2181
# 通信规则
protocol:
name: dubbo
port: 20002

还是先从服务提供者入手,这里肯定先要导入Dubbo的场景启动器了,除此之外commen模块也要导入进来:

<!--
dubbo starter:
boot1.5.*需要引用0.1.1版本的启动器
boot2.0.*需要引用0.2.0版本的启动器
-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<!-- commen -->
<dependency>
<groupId>site.hanzhe</groupId>
<artifactId>maven-01-commen</artifactId>
<version>0.0.1</version>
</dependency>

依赖引入完毕后,还是一样编写接口的实现类,需要注意的是@Service注解,相对于Java代码编写的Dubbo程序,boot程序将暴露接口的配置直接写在了类中:

// 这个Service注解代表添加到IOC容器
@Service
// 这个Service注解代表向Zookeeper暴露接口
@com.alibaba.dubbo.config.annotation.Service
public class UserServiceImpl implements UserService {
@Override
public List<UserEntity> selectList() {
UserEntity entity1 = new UserEntity("马保国", "69", "男");
UserEntity entity2 = new UserEntity("张全蛋", "31", "男");
return Arrays.asList(entity1, entity2);
}
}

实现类编写完成后,还需要在springboot启动类中使用@EnableDubbo注解来启动Dubbo

@EnableDubbo
@SpringBootApplication
public class Boot01ProviderApplication {
public static void main(String[] args) {
// 这里就不同在添加阻塞了,引入场景启动器后程序不会自动结束
SpringApplication.run(Boot01ProviderApplication.class, args);
}
}

程序运行起来我们就可以在管理页面看到该服务了:

编写消费者

消费者这边通过web工程进行测试,导入的依赖与服务提供者相同,就不再这里写了,配置文件如下所示:

# 因为Zookeeper会占用8080端口,所以这里将端口修改为8081
server:
port: 8081
dubbo:
application:
name: boot-01-consumer
registry:
protocol: zookeeper
address: 127.0.0.1
port: 2181
# 消费者无须提供服务,所以这里可以不配置protocol

然后在Controller中调用Service进行测试,一般来说应该使用@Autowired进行自动注入,这里使用@Reference进行远程调用:

@RestController
public class UserController { @Reference
private UserService userService; @GetMapping("/selectUser")
public List<UserEntity> selectUse() {
return userService.selectList();
} }

经测试消费者可以不适用@EnableDubbo注解,直接启动程序访问接口即可

Dubbo学习笔记(一) 基础知识HelloWorld的更多相关文章

  1. MyBatis:学习笔记(1)——基础知识

    MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...

  2. C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

    一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...

  3. C#学习笔记(基础知识回顾)之值传递和引用传递

    一:要了解值传递和引用传递,先要知道这两种类型含义,可以参考上一篇 C#学习笔记(基础知识回顾)之值类型和引用类型 二:给方法传递参数分为值传递和引用传递. 2.1在变量通过引用传递给方法时,被调用的 ...

  4. C#学习笔记(基础知识回顾)之值类型和引用类型

    一:C#把数据类型分为值类型和引用类型 1.1:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用. 1.2:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上.存 ...

  5. Quartz学习笔记:基础知识

    Quartz学习笔记:基础知识 引入Quartz 关于任务调度 关于任务调度,Java.util.Timer是最简单的一种实现任务调度的方法,简单的使用如下: import java.util.Tim ...

  6. .net学习笔记---xml基础知识

    一.XML简介 XML是一种标记语言,用于描述数据,它提供一种标准化的方式来来表示文本数据.XML文档以.xml为后缀.需要彻底注意的是XML是区分大小写的. 先从一个简单的XML例子来了解下xml基 ...

  7. Docker的学习笔记(一)基础知识

    概述 本人最近在学习docker相关的知识,既是工作本身的需要也是自己对技术的追求的必要,以后我也会推出容器相关的随笔,既可以增长自己的知识,也可以和读者广泛交流,岂不乐乎?话不多说.第一篇先介绍do ...

  8. Scala学习笔记--正则表达式基础知识、如何在scala内使用

    正则表达式语法:https://msdn.microsoft.com/zh-cn/library/ae5bf541(VS.80).aspx 基础知识:正则表达式30分钟入门教程 http://www. ...

  9. (C/C++学习笔记) 一. 基础知识

    一. 基础知识 ● 程序和C/C++ 程序: 根据Wirth (1976), Algorithms + Data Structures = Programs. Whence C: 1972, Denn ...

随机推荐

  1. MySQL 事务的隔离级别

    转载:https://developer.aliyun.com/article/743691?accounttraceid=80d4fddb3dc64b97a71118659e106221tozz 简 ...

  2. SpringBoot注解集合

    使用注解的优势: 1.采用纯java代码,不在需要配置繁杂的xml文件 2.在配置中也可享受面向对象带来的好处 3.减少复杂配置文件的同时亦能享受到springIoC容器提供的功能 @SpringBo ...

  3. Static Proxy

    0.静态代理 静态代理的实现比较简单,代理类通过实现与目标对象相同的接口,并在类中维护代理对象.通过构造器塞入目标对象,赋值给代理对象,进而执行代理对象实现的接口方法,并实现前拦截,后拦截等所需的业务 ...

  4. Docker 一键安装及Docker管理面板Portainer中文汉化

       前言 Docker接触了一段时间了,批量操作过程中感觉太繁琐,所以找到了好评率比较高的Portainer面板,使用后感觉的确不错所以准备拿出来精力来做个汉化版,过程中发现词条非常多,所以暂时先汉 ...

  5. 100道Java高频面试题(阿里面试官整理)

    我分享文章的时候,有个读者回复说他去年就关注了我的微信公众号,打算看完我的所有文章,然后去面试,结果我后来很长时间不更新了...所以为了弥补一直等我的娃儿们,给大家的金三银四准备了100道花时间准备的 ...

  6. selenium之元素定位的方法(二)

    XPath定位是XML Path的缩写,称为XML路径语言,是在XML文档中查找信息的一种语言,可用来再XML文档中对元素和属性进行搜索.XPath使用路径表达式来选取XML文档中的节点或节点集. X ...

  7. 一文读懂Java动态代理

    作者 :潘潘 日期 :2020-11-22 事实上,对于很多Java编程人员来说,可能只需要达到从入门到上手的编程水准,就能很好的完成大部分研发工作.除非自己强主动获取,或者工作倒逼你学习,否则我们好 ...

  8. JDBC概要

    JDBC基础应用 JDBC是Java连接数据库的一套接口,可以让我们方便的在Java中使用数据库.掌握JDBC的使用是Java开发的基本功. 预备工作 导入jar包.根据使用的数据库软件导入相应的ja ...

  9. Hi3559AV100 NNIE RFCN开发:V4L2->VDEC->VPSS->NNIE->VGS->VO系统整体动态调试实现

    下面随笔将给出Hi3559AV100 NNIE RFCN开发:V4L2->VDEC->VPSS->NNIE->VGS->VO系统整体动态调试实现,最终的效果是:USB摄像 ...

  10. windows10 缺失 msvcp140.dll 解决办法

    1.问题描述 我更新完windows10 驱动后,出现计算机缺失msvcp140.dll文件,虚机和QQ都无法启动 2.解决办法 查找大量文章,最终发现通过重新安装 Visual Studio 201 ...