热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot+Dubbo搭建简单的分布式服务

SpringBootDubbo搭建简单的分布式服务Dubbo中文官网:http:dubbo.apache.orgzh-cn1、重要的概念分布式、RPC、Dubbo
SpringBoot+Dubbo搭建简单的分布式服务

Dubbo中文官网:http://dubbo.apache.org/zh-cn/

1、重要的概念

分布式、RPC、Dubbo

1.1、分布式

分布式或者说 SOA 分布式重要的就是面向服务,说简单的分布式就是我们把整个系统拆分成不同的服务然后将这些服务放在不同的服务器上减轻单体服务的压力提高并发量和性能。比如电商系统可以简单地拆分成订单系统、商品系统、登录系统等等。

1.2、 RPC

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。比如两个不同的服务A,B部署在两台不同的机器上,那么服务 A 如果想要调用服务 B 中的某个方法该怎么办呢?使用 HTTP请求 当然可以,但是可能会比较慢而且一些优化做的并不好。RPC 的出现就是为了解决这个问题。

1.3、Dubbo

Apache Dubbo 是一款高性能、轻量级的开源Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用、智能容错和负载均衡、以及服务自动注册和发现。简单来说 Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。

1.4、Dubbo 架构

Dubbo 的架构,Dubbo 官方推荐使用 zookeeper 作为注册中心
在这里插入图片描述
上述节点简单说明:

  • Provider 暴露服务的服务提供方
  • Consumer 调用远程服务的服务消费方
  • Registry 服务注册与发现的注册中心
  • Monitor 统计服务的调用次数和调用时间的监控中心
  • Container 服务运行容器

调用关系说明:

  1. 服务容器负责启动,加载,运行服务提供者。
  2. 服务提供者在启动时,向注册中心注册自己提供的服务。
  3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

1.5、使用Dubbo的原因

其实开发分布式程序,也可以直接基于 HTTP 接口进行通信,但是为什么要用 Dubbo呢?

主要可以从 Dubbo 提供的下面四点特性来说为什么要用 Dubbo:

  1. 负载均衡——同一个服务部署在不同的机器时该调用那一台机器上的服务
  2. 服务调用链路生成——服务之间互相是如何调用的
  3. 服务访问压力以及时长统计——当前系统的压力主要在哪里,如何来扩容和优化
  4. 服务降级——某个服务挂掉之后调用备用服务

2、搭建分布式服务(开发工具:Idea)


2.1、zookeeper 环境安装搭建


1. Windows环境下


1. 下载(3.5.5开始下载带bin的版本)

下载链接:http://archive.apache.org/dist/zookeeper/
在这里插入图片描述

2. 解压

在这里插入图片描述
进入apache-zookeeper-3.5.6-bin目录

3. 创建data目录

在apache-zookeeper-3.5.6-bin目录下创建data目录
在这里插入图片描述

4. 配置文件复制改名

在conf目录下将 zoo_sample.cfg 文件复制一份改名为 zoo.cfg
在这里插入图片描述

5. 修改配置文件zoo.cfg

修改dataDir的值改为

dataDir=../data

6. 启动测试

进入bin目录下启动服务端,在地址输入cmd回车,输入zkServer.cmd回车启动服务端
在这里插入图片描述
同样的方式打开一个dos窗口输入,输入zkCli.cmd启动客户端启动,在客户端输入几个命令看是否启动成功

ls / :查看节点
create -e /test 123456:创建节点
get /test:获取节点

2. Linux环境下

Linux环境: CentOS 7.4

注意:如果是阿里云服务器必须配置一个安全组,不然应用程序会无法访问zookeeper 服务器

我使用的是 CentOS 7.4 阿里云服务器,注意:如果你也同样阿里云服务器必须配置一个安全组,不然你的应用程序会无法访问你的 zookeeper 服务器,这一点我在后面也提到了。

1. 下载

下载链接: http://mirror.bit.edu.cn/apache/zookeeper/
下载完成后上传到Linux上
在这里插入图片描述
或者直接在Linux中使用 wget https://archive.apache.org/dist/zookeeper/zookeeper-3.5.6/zookeeper-3.5.6.tar.gz 命令下载

2. 解压

tar -zxvf zookeeper-3.5.6.tar.gz

解压完毕之后修改一下解压之后所得的文件夹名

mv zookeeper-3.5.6 zookeeper

删除 zookeeper 安装包

rm -rf zookeeper-3.5.6.tar.gz

3. 创建data目录

进入zookeeper目录,创建data文件夹

mkdir data

进入 data 文件夹 然后执行pwd命令,复制所得的当前目录位置
在这里插入图片描述

4. 配置文件复制改名

进入/zookeeper/conf目录下,复制zoo_sample.cfg,命名为zoo.cfg

cp zoo_sample.cfg zoo.cfg

5. 修改配置文件

使用 vim zoo.cfg 命令修改配置文件

vim 文件------>进入文件----->命令模式------>按i进入编辑模式----->编辑文件 ------->按Esc进入底行模式----->输入:wq/q! (输入wq代表写入内容并退出,即保存;输入q!代表强制退出不保存。)

修改配置文件中的 data 属性:

dataDir=/usr/local/zookeeper/data

6. 启动测试

进入 /zookeeper/bin 目录然后执行下面的命令

./zkServer.sh start

执行 ./zkServer.sh status 查看当前 zookeeper 状态。

或者运行 netstat -lntup 命令查看网络状态,可以看到 zookeeper 的端口号 2181 已经被占用

在这里插入图片描述

注意没有关闭防火墙可能出现的问题!!!

如果使用的是阿里云服务器,注意配置相关安全组:

  1. 进入本实例安全组页面

    在这里插入图片描述

  2. 选择配置规则

    在这里插入图片描述

  3. 选择添加安全组规则,然后按照下图配置

    在这里插入图片描述


2.2、模拟需求

某个电商系统,订单服务需要调用用户服务获取某个用户的信息

模块功能
订单服务Web模块创建订单等
用户服务Service模块查询用户信息等

测试预期结果:订单服务Web模块在A服务器,用户服务模块在B服务器,A可以远程调用B的功能

在这里插入图片描述

1. 工程架构

建议将服务接口、服务模型、服务异常等均放在 API 包中;
在搭建项目时建议将接口项目、服务提供者以及服务消费者都放在同一空包下

根据Dubbo官方文档服务最佳实践

在这里插入图片描述

最终项目样式

在这里插入图片描述

2、主要思路

1、将服务提供者注册到注册中心(暴露服务)

2、让服务消费者从注册中心订阅服务提供者的服务地址(消费服务)

2.3、创建一个空项目springboot-dubbo

作用:用于将接口项目、服务提供者以及服务消费者都放在同一空包下

File–>New–>Project–>Empty Project
在这里插入图片描述

2.4、创建接口项目:dubbo-interface

作用:dubbo-interface 会被打成 jar 包,它的作用只是提供接口。

主要步骤:

1. 创建 Maven 项目;
2. 创建接口类
3. 将项目打成 jar 包供其他项目使用

1. dubbo-interface 项目创建

File->New->Module… ,然后选择Maven类型的项目,其他的按照提示一步一步走就好。

在这里插入图片描述
在这里插入图片描述

2. pom文件内容


<project xmlns&#61;"http://maven.apache.org/POM/4.0.0"xmlns:xsi&#61;"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&#61;"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0modelVersion><groupId>com.shiorygroupId><artifactId>dubbo-interfaceartifactId><version>1.0-SNAPSHOTversion><packaging>jarpackaging><dependencies><dependency><groupId>org.projectlombokgroupId><artifactId>lombokartifactId><version>1.18.10version><scope>providedscope>dependency>dependencies>project>

3. 创建用户实体类与接口

实体类&#xff0c;需要进行序列化&#xff0c;不然无法调用&#xff0c;实现Serializable接口即可

import lombok.Data;
import java.io.Serializable;/*** 用户信息实体类* &#64;author 汐小旅Shiory* &#64;Date 2019年10月31日10:06:09*/
&#64;Data
public class User implements Serializable {/*** 用户id*/private Long id;/*** 用户名*/private String username;/*** 用户密码*/private String password;/*** 用户收货地址*/private String address;public User(){}public User(Long id, String username, String password, String address){this.id &#61; id;this.username &#61; username;this.password &#61; password;this.address &#61; address;}
}

接口

/*** 用户服务接口* &#64;author 汐小旅Shiory* &#64;Date 2019年10月31日10:07:25*/
public interface UserService {/*** 根据用户id查询用户信息* &#64;param uid* &#64;return*/public User queryUserById(long uid);
}

4.创建订单接口

/*** 订单服务接口* &#64;author 汐小旅Shiory* &#64;Date 2019年10月31日10:13:25*/
public interface OrderService {/*** 创建订单* &#64;param userId*/public User createOrder(long userId);
}

5.dubbo-interface项目最终项目结构

在这里插入图片描述

6. 将项目打成 jar 包

将项目打成 jar 包&#xff0c;安装到maven仓库供其他项目使用

点击右边的 Maven 然后选择Lifecycle --> install &#xff0c;这样 jar包安装到maven仓库了。

在这里插入图片描述

2.5、创建服务提供者&#xff1a;dubbo-provider

作用&#xff1a;用于提供服务供服务消费者使用

主要步骤&#xff1a;

1. 创建springboot项目;
2. 加入dubbo、zookeeper以及接口的相关依赖 jar 包&#xff1b;
3. 在application.properties 配置文件中配置 dubbo 相关信息&#xff1b;
4. 实现接口类;
5. 服务提供者启动类编写

1. dubbo-provider 项目创建

注意在项目创建之前不要选中dubbo-interface&#xff0c;不然就会是在dubbo-interface上创建项目&#xff0c;所以选中非dubbo-interface的位置

在这里插入图片描述

File->New->Module… ,然后选择 Spring Initializr类型的项目

在这里插入图片描述
在这里插入图片描述

此步注意勾选上 web 模块
在这里插入图片描述

2. pom 文件引入相关依赖

需要引入 dubbo 、zookeeper以及接口的相关依赖 jar 包。

注意将本项目和 dubbo-interface 项目的 dependency 依赖的 groupId 和 artifactId 改成自己的。dubbo 整合spring boot 的 jar 包可在下面链接中找到dubbo-spring-boot-starter。注意是阿里巴巴的dubbo

https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-starter

其中dubbo-spring-boot-starter的0.2.0版本已经包含了zookeeper的客户端操作依赖&#xff0c;所以无需再添加。

也可以从dubbo的github上找到&#xff0c;根据对应的SpringBoot版本导入对应的dubbo依赖&#xff0c;此处使用的SpringBoot版本是2.x版本&#xff0c;由于高版本会有很多问题&#xff0c;此处不使用0.2.1.RELEASE版本&#xff0c;而使用0.2.0&#xff0c;

链接&#xff1a;https://github.com/apache/dubbo-spring-boot-project
在这里插入图片描述

pom文件中的依赖

<dependencies><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-webartifactId>dependency><dependency><groupId>com.shiorygroupId><artifactId>dubbo-interfaceartifactId><version>1.0-SNAPSHOTversion>dependency><dependency><groupId>com.alibaba.bootgroupId><artifactId>dubbo-spring-boot-starterartifactId><version>0.2.0version>dependency>dependencies>

3. 配置服务提供者

在 application.properties 配置文件中配置 dubbo 相关信息

配置很简单&#xff0c;这主要得益于 springboot 整合 dubbo 专属的&#64;EnableDubbo注解提供的 Dubbo 自动配置。

# 应用服务端口
server.port&#61;8081# 1.指定当前服务的名称/应用名称(同样的服务名称相同&#xff0c;不要和别的服务同名)
dubbo.application.name&#61;dubbo-provider
# 2.指定注册中心的位置(协议、地址&#xff1a;IP:端口)
dubbo.registry.protocol&#61;zookeeper
dubbo.registry.address&#61;127.0.0.1:2181
# 3.指定通信规则(通信协议、通信端口)
dubbo.protocol.name&#61;dubbo
dubbo.protocol.port&#61;20880
# 4.连接监控中心(使用协议的方式&#xff1a;让它自己从注册中心发现)
#dubbo.monitor.protocol&#61;registry
# 5.暴露服务&#xff1a;在Service接口实现类中使用dubbo中的&#64;Service注解&#xff0c;再加上一个Spring的&#64;Component注解用于将实现类加到容器中
# 6.开启基于注解的Dubbo功能&#xff1a;在主程序类中加入&#64;EnableDubbo注解

4. 实现接口

注意&#xff1a; &#64;Service 注解使用的时 Dubbo 提供的而不是 Spring 提供的。另外&#xff0c;加了Dubbo 提供的 &#64;Service 注解之后还需要加入Spring的&#61;&#61;&#64;Component&#61;&#61;注解

import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;/*** 用户服务提供者实现用户接口* &#64;author 汐小旅Shiory* &#64;Date 2019年10月31日10:39:54*/&#64;Service //暴露服务&#xff1a;用Dubbo中的&#64;Service注解&#xff0c;而不是Spring中的&#64;Service注解
&#64;Component("userService")
public class UserServiceImpl implements UserService {&#64;Overridepublic User queryUserById(long uid) {//模拟从数据库查询到的用户信息if (uid &#61;&#61; 2L) {User user &#61; new User(2L,"admin","123456","杭州");return user;}return new User();}
}

5. 服务提供者启动类编写

注意&#xff1a;不要忘记加上 &#64;EnableDubbo 注解开启基于注解Dubbo功能。

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;&#64;EnableDubbo //开启基于注解的Dubbo功能
&#64;SpringBootApplication
public class DubboProviderApplication {public static void main(String[] args) {SpringApplication.run(DubboProviderApplication.class, args);}}

2.6、创建服务消费者 dubbo-consumer

作用&#xff1a;用于消费服务(远程调用服务)

主要步骤&#xff1a;

1. 创建springboot项目;
2. 加入dubbo、zookeeper以及接口的相关依赖 jar 包&#xff1b;
3. 在application.properties 配置文件中配置 dubbo 相关信息&#xff1b;
4. 实现接口类;
5. 服务提供者启动类编写

1. dubbo-consumer 项目创建

和提供者创建一致

2. pom 文件引入相关依赖

和提供者的pom文件中的依赖一致

3. 配置服务消费者

# 应用服务端口
server.port&#61;8082# 1.指定当前服务的名称/应用名称(同样的服务名称相同&#xff0c;不要和别的服务同名)
dubbo.application.name&#61;dubbo-consumer
# 2.指定注册中心的位置(协议、地址)
dubbo.registry.protocol&#61;zookeeper
dubbo.registry.address&#61;127.0.0.1:2181
# 3.指定通信规则(通信协议、通信端口)
dubbo.protocol.name&#61;dubbo
dubbo.protocol.port&#61;20880
# 4.连接监控中心(使用协议的方式&#xff1a;让它自己从注册中心发现)
#dubbo.monitor.protocol&#61;registry
# 5.调用远程服务&#xff1a;使用&#64;Reference注解注入远程服务
# 6.开启基于注解的Dubbo功能&#xff1a;在主程序类中加入&#64;EnableDubbo注解

4. 实现接口

在Order接口的实现类中调用远程服务&#xff08;也可以在Controller层调用&#xff09;&#xff0c;使用&#61;&#61;&#64;Reference&#61;&#61;注解注入远程服务

import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;/*** 订单服务层* &#64;author 汐小旅Shiory* &#64;Date 2019年10月31日13:28:17*/
&#64;Service("orderService")
public class OrderServiceImpl implements OrderService {/*** 使用&#64;Reference注解注入远程服务*/&#64;Reference(interfaceName &#61; "userService")private UserService userService;&#64;Overridepublic User createOrder(long userId) {// 远程调用UserService(服务提供者)User user &#61; userService.queryUserById(userId);return user;}
}

5. 编写一个简单 Controller

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;/*** 订单服务web层* &#64;author 汐小旅Shiory* &#64;Date 2019年10月31日13:24:58*/
&#64;RequestMapping("/order")
&#64;RestController
public class OrderController {&#64;Resource(name &#61; "orderService")private OrderService orderService;&#64;GetMapping(value &#61; "{uid}")public ResponseEntity<User> createOrder(&#64;PathVariable("uid") long userId){User user &#61; orderService.createOrder(userId);if (user &#61;&#61; null) {return ResponseEntity.notFound().build();}return ResponseEntity.ok(user);}
}

6. 服务消费者启动类编写

注意&#xff1a;不要忘记加上 &#64;EnableDubbo 注解开启基于注解Dubbo功能。

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;&#64;EnableDubbo //开启基于注解的Dubbo功能
&#64;SpringBootApplication
public class DubboConsumerApplication {public static void main(String[] args) {SpringApplication.run(DubboConsumerApplication.class, args);}
}

3. 测试效果

保证zookeeper已经启动&#xff0c;启动dubbo-provider、dubbo-consumer
浏览器访问 http://localhost:8082/order/2&#xff0c;页面输出 User的信息&#xff0c;测试成功
在这里插入图片描述


推荐阅读
  • ZooKeeper 学习
    前言相信大家对ZooKeeper应该不算陌生。但是你真的了解ZooKeeper是个什么东西吗?如果别人面试官让你给他讲讲ZooKeeper是个什么东西, ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了StartingzookeeperFAILEDTOSTART相关的知识,希望对你有一定的参考价值。下载路径:https://ar ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • springboot启动不了_Spring Boot + MyBatis 多模块搭建教程
    作者:枫本非凡来源:www.cnblogs.comorzlinp9717399.html一、前言1、创建父工程最近公司项目准备开始重构,框 ... [详细]
  • Nginx Buffer 机制引发的下载故障
    Nginx ... [详细]
  • Hadoop源码解析1Hadoop工程包架构解析
    1 Hadoop中各工程包依赖简述   Google的核心竞争技术是它的计算平台。Google的大牛们用了下面5篇文章,介绍了它们的计算设施。   GoogleCluster:ht ... [详细]
  • Kylin 单节点安装
    软件环境Hadoop:2.7,3.1(sincev2.5)Hive:0.13-1.2.1HBase:1.1,2.0(sincev2.5)Spark(optional)2.3.0K ... [详细]
author-avatar
liangpengtao
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有