使用springboot+dubbo搭建RPC入门案例


本文背景简述:

最近在学习公司的一套RPC框架,初步接触的时候感觉挺复杂的。但是知道其原理肯定是和dubbo很相似的,毕竟都是RPC框架嘛,只是各自使用的范围和使

用者群体有些不同罢了。于是就去dubbo官网熟悉了其相关文档和案例教程,然后结合网上大佬的一些资料,自己搭了个简单的分布式远程调用案例。这里

强调一个东西--记住官方文档第一!!!下面分享一下我的案例代码吧,也希望本案例能对在读的读者启动一点帮助......


先来一张简单的架构图吧,这个图是自己使用processOn画的(这里推荐一波processOn线上作图神器):


1、创建一个比较原生的Maven项目dubbo-common

这个项目中只定义公共接口和实体,以供后面的provider工程项目和consumer工程项目使用(如下图所示):

TeamService中的代码也很简单,如下:

  1. package com.chandler.dubbo.service;
  2. import com.chandler.dubbo.entity.Team;
  3. public interface TeamService {
  4. Team getTeamInfo(String city);
  5. }

2、下载与配置zookeeper

下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/

至于怎么配置和使用,可以自己移驾度娘,上面很多,其实也比较简单。


3、创建dubbo-provider项目

首先从下图所示这里创建一个springboot项目:

创建后的工程大概如下图所示,这个provider项目很简单,就是一个实现了dubbo-common项目中的那个接口的service方法。

项目创建完了后我们首先要把dubbo-common中的那个划红线的jar包手动添加到lib库中,以备后面使用(正常来说我们肯定是将类似于dubbo-common这样一个公共工程上传到Maven公共镜像仓库或者是公司内部的是有个Maven镜像仓库中去,以备提服务的项目和消费服务的项目通过pom文件直接添加依赖就可以使用。这里我们为了简单演示就直接手动添加算了)。手动添加步骤如下:

File-->Project Structure-->Modules-->Dependencies-->右侧+号找到那个jar包-->点击底部apply-->点击ok

pom文件内容:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.2.6.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.chandler.dubbo</groupId>
  12. <artifactId>dubbo-provider</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>dubbo-provider</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. </properties>
  19. <dependencies>
  20. <!--boot依赖-->
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-web</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-test</artifactId>
  28. <scope>test</scope>
  29. <exclusions>
  30. <exclusion>
  31. <groupId>org.junit.vintage</groupId>
  32. <artifactId>junit-vintage-engine</artifactId>
  33. </exclusion>
  34. </exclusions>
  35. </dependency>
  36. <!-- 引入dubbo的依赖 -->
  37. <dependency>
  38. <groupId>com.alibaba.spring.boot</groupId>
  39. <artifactId>dubbo-spring-boot-starter</artifactId>
  40. <version>2.0.0</version>
  41. </dependency>
  42. <!-- 引入zookeeper的依赖 -->
  43. <dependency>
  44. <groupId>com.101tec</groupId>
  45. <artifactId>zkclient</artifactId>
  46. <version>0.10</version>
  47. </dependency>
  48. <!-- slf4j依赖 -->
  49. <dependency>
  50. <groupId>org.slf4j</groupId>
  51. <artifactId>slf4j-log4j12</artifactId>
  52. <scope>test</scope>
  53. </dependency>
  54. </dependencies>
  55. <build>
  56. <plugins>
  57. <plugin>
  58. <groupId>org.springframework.boot</groupId>
  59. <artifactId>spring-boot-maven-plugin</artifactId>
  60. </plugin>
  61. </plugins>
  62. </build>
  63. </project>

application.yml中的内容:

  1. server.port=8081
  2. spring.application.name=dubbo-provider
  3. #本地zookeeper注册中心地址
  4. spring.dubbo.registry=zookeeper://localhost:2181

MyServiceImpl代码:(由于这里只是为了简单演示,所以就没有使用数据库什么的了,直接在static代码块中使用集合存储几个对象以备后面查询)

  1. package com.chandler.dubbo.dubboprovider.service;
  2. import com.alibaba.dubbo.config.annotation.Service;
  3. import com.chandler.dubbo.entity.Team;
  4. import com.chandler.dubbo.service.TeamService;
  5. import org.springframework.stereotype.Component;
  6. import java.util.HashMap;
  7. @Component
  8. //这个service注解是dubbo中的,目的就是将这个服务暴露出去。
  9. //里面可以指定代理版本,代理名称还有很多的其他可选配置项,dubbo官网的文档中都有说明
  10. @Service(version = "1.0.0",proxy = "TeamServer")
  11. public class MyserviceImpl implements TeamService {
  12. private static HashMap<String,Team> teamHashMap = new HashMap<>(16);
  13. static {
  14. Team team1 = new Team();
  15. team1.setCity("chicago");
  16. team1.setName("bulls");
  17. team1.setTopPlayer("jordan&rose");
  18. Team team2 = new Team();
  19. team2.setTopPlayer("james&kobe");
  20. team2.setName("lakers");
  21. team2.setCity("loss angeles");
  22. teamHashMap.put("chicago",team1);
  23. teamHashMap.put("lal",team2);
  24. }
  25. @Override
  26. public Team getTeamInfo(String s) {
  27. return teamHashMap.get(s);
  28. }
  29. }

最后是DubboProviderApplication启动类:

  1. package com.chandler.dubbo.dubboprovider;
  2. import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. @SpringBootApplication
  6. @EnableDubboConfiguration
  7. public class DubboProviderApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(DubboProviderApplication.class, args);
  10. }
  11. }

到这一步就可以启动项目了,启动项目后可以使用dubbo的管理控制台查看和管理服务,具体怎么弄可以参考官网文档:

http://dubbo.apache.org/zh-cn/docs/admin/introduction.html,我们接着在创建消费者项目。


4、创建dubbo-consumer项目

同创建dubbo-provider一样的步骤创建consumer项目,项目结构如下图:

然后呢,也同dubbo-provider项目中一样手动添加dubbo-common项目的jar包到lib库中。

接下来就是pom文件内容,和provider项目中的pom文件几乎一样:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.2.6.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.chandler.dubbo</groupId>
  12. <artifactId>dubbo-consumer</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>dubbo-consumer</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-web</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-test</artifactId>
  27. <scope>test</scope>
  28. <exclusions>
  29. <exclusion>
  30. <groupId>org.junit.vintage</groupId>
  31. <artifactId>junit-vintage-engine</artifactId>
  32. </exclusion>
  33. </exclusions>
  34. </dependency>
  35. <!-- 引入dubbo的依赖 -->
  36. <dependency>
  37. <groupId>com.alibaba.spring.boot</groupId>
  38. <artifactId>dubbo-spring-boot-starter</artifactId>
  39. <version>2.0.0</version>
  40. </dependency>
  41. <!-- 引入zookeeper的依赖 -->
  42. <dependency>
  43. <groupId>com.101tec</groupId>
  44. <artifactId>zkclient</artifactId>
  45. <version>0.10</version>
  46. </dependency>
  47. <!-- slf4j依赖 -->
  48. <dependency>
  49. <groupId>org.slf4j</groupId>
  50. <artifactId>slf4j-log4j12</artifactId>
  51. <scope>test</scope>
  52. </dependency>
  53. <dependency>
  54. <groupId>com.alibaba</groupId>
  55. <artifactId>fastjson</artifactId>
  56. <version>1.2.60</version>
  57. </dependency>
  58. </dependencies>
  59. <build>
  60. <plugins>
  61. <plugin>
  62. <groupId>org.springframework.boot</groupId>
  63. <artifactId>spring-boot-maven-plugin</artifactId>
  64. </plugin>
  65. </plugins>
  66. </build>
  67. </project>

TeamService类代码:

  1. package com.chandler.dubbo.dubboconsumer.service;
  2. import com.alibaba.dubbo.config.annotation.Reference;
  3. import com.chandler.dubbo.entity.Team;
  4. import org.springframework.stereotype.Service;
  5. @Service
  6. public class TeamService {
  7. @Reference(proxy = "TeamServer",version = "1.0.0")
  8. com.chandler.dubbo.service.TeamService teamService;
  9. public Team getTeam(String cityName){
  10. return teamService.getTeamInfo(cityName);
  11. }
  12. }

TeamController类代码:

  1. package com.chandler.dubbo.dubboconsumer.controller;
  2. import com.chandler.dubbo.dubboconsumer.service.TeamService;
  3. import com.chandler.dubbo.entity.Team;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RequestParam;
  7. import org.springframework.web.bind.annotation.RestController;
  8. import javax.annotation.Resource;
  9. @RestController
  10. @RequestMapping("/api")
  11. public class TeamController {
  12. @Resource
  13. private TeamService teamService;
  14. @GetMapping("/getTeam")
  15. public Team getTeam(@RequestParam("cityName") String cityName){
  16. return teamService.getTeam(cityName);
  17. }
  18. }

DubboConsumerApplication启动类代码:

  1. package com.chandler.dubbo.dubboconsumer;
  2. import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. @SpringBootApplication
  6. @EnableDubboConfiguration
  7. public class DubboConsumerApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(DubboConsumerApplication.class, args);
  10. }
  11. }

最后就可以依次启动zookeeper、dubbo-provider和dubbo-consumer项目了,然后可以使用浏览器或者postman测试dubbo-consumer项目中的controller方法了。

代码传送地址:https://github.com/kuangdongwei/dubbo-demo

我是一头实习中的小菜鸡,第一次写博客,有很多不到位的地方,还请各位大佬直接评论!无论是赞赏还是喷,本人都是可以接受的。。。

springboot+dubbo简单分布式RPC调用demo的更多相关文章

  1. Dubbo系列(三)dubbo的核心技术--RPC调用

    dubbo的核心技术--RPC调用:分为俩部分RPC协议Protocol和方法调用Invoke: 一.RPC协议Protocol(Remote Procedure Call)远程过程调用协议 1.我们 ...

  2. java使用netty模拟实现一个类dubbo的分布式服务调用框架

    本文较长,如果想直接看代码可以查看项目源码地址: https://github.com/hetutu5238/rpc-demo.git 要想实现分布式服务调用框架,我们需要了解分布式服务一般需要的功能 ...

  3. 【原】通过Dubbo注解实现RPC调用

    启动Dubbo服务有2个方式,1是通过xml配置,2是通过注解来实现,这点和Spring相似. 采用XML配置如下: <?xml version="1.0" encoding ...

  4. netty 实现简单的rpc调用

    yls 2020/5/23 netty 实现简单rpc准备 使用netty传输java bean对象,可以使用protobuf,也可以通过json转化 客户端要将调用的接口名称,方法名称,参数列表的类 ...

  5. 学习写简单的RPC框架demo

    学习实现一个简单的RPC框架. 工程主要目录分级结构: rpc-common: 公共基础包,能力提供包 rpc-provider: 服务提供者 rpc-consumer:服务消费者 rpc-servi ...

  6. springboot+dubbo+zookeeper微服务实践demo

    微服务化越来越火,实际上是应互联网时代而生的,微服务化带来的不仅是性能上的提升,更带来了研发组织的更加便利,协作更加轻松,团队效能更高. 当然不能为了技术而技术,我们需要切合实际的对业务进行划分,降低 ...

  7. zookeeper+springboot+dubbo简单实现

    第一步:在虚拟机中搭建zookeeper. 第二步:本地创建3个maven工程,分别为wxh-dubbo-api(对外暴露的接口),wxh-dubbo-provider(服务提供者,接口的具体实现), ...

  8. Java使用Netty实现简单的RPC

    造一个轮子,实现RPC调用 在写了一个Netty实现通信的简单例子后,萌发了自己实现RPC调用的想法,于是就开始进行了Netty-Rpc的工作,实现了一个简单的RPC调用工程. 如果也有兴趣动手造轮子 ...

  9. 自己用 Netty 实现一个简单的 RPC

    目录: 需求 设计 实现 创建 maven 项目,导入 Netty 4.1.16. 项目目录结构 设计接口 提供者相关实现 消费者相关实现 测试结果 总结 源码地址:github 地址 前言 众所周知 ...

随机推荐

  1. DNS 域名解析

    DNS域名解析 整个过程大体描述如下,其中前两个步骤是在本机完成的,后8个步骤涉及到真正的域名解析服务器:1.浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,这个解析过程就结束. ...

  2. H - Bone Collector

    H - Bone Collector Many years ago , in Teddy's hometown there was a man who was called "Bone Co ...

  3. 1021 Deepest Root (25 分)

    A graph which is connected and acyclic can be considered a tree. The height of the tree depends on t ...

  4. CAS单点登录系列之极速入门于实战教程(4.2.7)

    @ 目录 一. SSO简介 1.1 单点登录定义 1.2 单点登录角色 1.3 单点登录分类 二. CAS简介 2.1 CAS简单定义 2.2 CAS体系结构 2.3 CAS原理 三.CAS服务端搭建 ...

  5. Centos网络的配置

                                                                                                        ...

  6. MySQL数据库二

    筛选条件 比较运算符: 等于: =  (注意!不是==)            大于等于: >=          IS NULL 不等于: !=  或  <>        小于: ...

  7. synchronized 的真正含义

    @synchronized 锁的永远是对象 ,只针对于对象,只能锁对象,常量等是不能加synchronized,一旦加编译也不会通过 @synchronized 锁对象中的非static 就是锁调用该 ...

  8. python这门语言为什么要起这个名字

    我只是一只可爱的小虫 前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:Liz喵 PS:如有需要Python学习资料的小 ...

  9. L24 word2vec

    词嵌入基础 我们在"循环神经网络的从零开始实现"一节中使用 one-hot 向量表示单词,虽然它们构造起来很容易,但通常并不是一个好选择.一个主要的原因是,one-hot 词向量无 ...

  10. Java匹马行天下之JavaSE核心技术——异常处理

    Java匹马行天下之JavaSE核心技术——异常处理 异常的简介 在Java中,异常就是Java在编译.运行或运行过程中出现的错误. 程序错误分为三种:编译错误.运行时错误和逻辑错误 编译错误是因为程 ...