Dubbo的RPC远程过程调用+Dubbo的负载均衡+Zookeeper注册中心
分布式基础理论
什么是分布式系统?
《分布式系统原理与泛型》定义:分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统,分布式系统是建立在网络之上的软件系统。
为什么需要分布式系统?因为防止服务器崩了。举个例子啊,在双十一的时候,淘宝系统的并发量特别的大,特别容易崩,世界上没有一台服务器可以单独部署整个淘宝系统。那为了解决这个问题,就把整个大的淘宝系统内部按功能不同分为了很多个小的模块,每一个模块代表一个不同的功能,每一个模块都部署到了不同的电脑上,部署到了不同的服务器上,这些小的模块共同的组成了淘宝系统,并且这些小的模块之间也是可能需要相互调用的,者就是分布式系统。如下图:
这些复杂的系统急需要一个东西来维护,而dubbo就是用来做这个工作的。
应用架构演变
单一应用架构
单一应用框架就是把所有的功能模块都放到一个应用里面,然后把这个应用部署到一台服务器上,如下图:
单一应用架构会有一些问题,就是当你想要改动某个模块的时候,必须要更改这个应用中的所有的东西,所以后面又出现了垂直应用架构。
垂直应用架构
垂直应用架构,就是把每一个小的模块功能放到一个应用里面,如下图:
每一个应用重头到尾都是完整的,包含页面,包含数据库,包含业务逻辑,但是呢?这种架构的应用没有前后端分离,每个页面的应用可能会经常更改,一个页面的更改,可能会导致整个应用都要重新部署。所以后来又把每个应用进行了前后端分离,把前端和后端分别部署到不同的服务器上,这种架构叫做是分布式服务架构。
分布式服务架构
把前后端分别部署到不同的服务器上,如下图:
分布式服务架构的难点就是,如何进行RPC远程过程调用。
RPC远程过程调用
什么叫做RPC?
RPC【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式,他是一种技术的思想,而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的函数,本质上编写的调用代码基本相同。
RPC两个核心模块:通讯,序列化。
RPC框架有很多,比如:dubbo,gRPC,Thrift,HSF(High Speed Service Framework)
总之,RPC远程过程调用,就是A服务器上会的方法会调用B服务器上的方法,在这个过程中A,B两个服务器之间会先建立一个网络连接,通过这个网络连接来传输数据。
dubbo核心概念
简介:Apache Dubbo (incubating) 是一款高性能,轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
官网:http://dubbo.apache.org/
dubbo的一些优良特性,如下图:
环境搭建_zookeeper注册中心
zookeeper是一个注册中心,提供者服务可以注册到这个注册中心中去。
1.下载zookeeper,如下图:
2.解压zookeeper
解压运行zkServer.cmd,初次运行会报错,没有zoo.cfg配置文件
保存之后,source一下环境变量文件~/.bash_profile,然后重新打开终端,再次输入zkServer.cmd命令,如下图:
应该是环境变量不对,但是目前我还找不到具体是因为什么原因,所以我只能用第二种方法了,就是在zkServer.cmd命令的前面加上一个./,即这样写./zkServer.cmd,如下图:
复制zookeeper的配置文件,命名为zoo.cfg,如下图:
重新启动zookeeper,如下图;
连接zookeeper客户端,如下图:
环境搭建_管理控制台
安装一个监控中心,监控中心其实也可以不安装,但是监控中心是一个可视化的界面,可以帮助用户可视化的管理。
服务发现的一个核心组件是注册中心,提供者服务把它的地址放到注册中心,消费者服务从注册中心拿到提供者服务的地址,因此,要启动服务发现,需要为dubbo增加注册中心配置,类似于下图:
修改dubbo-admin-server里面的dubbo-admin-server模块中的application.properties文件,要让zookeeper的注册中心的地址为
127.0.0.1:2181,如下图:
注意一定要启动zookeeper,先让zookeeper在本地跑起来,要不然的话提供者服务是不能成功的注册到zookeeper注册中心里面的。
接着去终端给dubbo-admin打一个jar包,如下图:
打包成功之后,会在dubbo-admin-distribution模块里面的target文件夹里面生成一个Dubbo-admin.jar包,如下图:
在终端使用java -jar dubbo-admin-0.3.0.jar命令,运行改jar包,如下图:
查看运行之后的端口号,如下图:
在浏览器中运行改端口号,如下图:
编写提供者,消费者的相关代码
需求:
某个电商系统,订单服务需要调用用户服务获取某个用户的所有地址。
我们现在需要创建两个服务模块进行测试:
模块 功能
订单服务web模块 创建订单等
用户服务service模块 查询用户地址等
测试预期结果:
订单服务web模块在A服务器,用户服务模块在B服务器,A可以远程调用B的功能。
提供者代码如下图:
消费者代码如下图:
写一个专门存放接口和bean实体类的工程,如下图:
引入接口依赖,如下图:
如下图:
但是现在呢?在消费者里面调用提供者的方法肯定是不行的,因为真正的实现在其它的工程里面,我们需要远程调用才可以。
服务提供者配置&测试
1.将服务提供者注册到注册中心(暴露服务)
1).导入dubbo依赖(2.6.2版本)
2).因为注册中心使用的是zookeeper,所以要引入操作zookeeper的客户端,如下图:
3)配置服务提供者
写一个xml文件,如下图:
4)验证提供者服务的配置是否配置成功,提供者是否成功的暴露出了服务,如下图:
提示:在开始运行提供者服务的启动类之前,一定要先要开启本地的zookeeper服务,因为zookeeper就是注册中心,我们提供者的服务就是要注册到zookeeper的注册中心中去,如果你不启动zookeeper服务的话,那么提供者服务就不会在dubbo的管理控制台显示出来,也就是不会在注册中心被注册。
成功启动MainApplication启动类之后,可以在dubbo控制管理的服务注册中心里面看到提供者服务已经成功的发布到了注册中心,如下图:
服务消费者配置&测试
1.导入dubbo和zookeeper依赖,如下图:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
2.写配置文件,如下图:
3.配置启动类,如下图:
启动开始类的时候出现了一个错误,如下图:
上图出现异常的原因,如下图:
重新发布提供者服务到注册中心,然后再次启动消费者服务启动类,如下图:
总结dubbo的RPC远程过程调用
首先需要有一个提供者服务,还需要有一个消费者服务,还需要有一个专门放提供者服务还有消费者服务里面的实体类和接口的工程;
提供者需要把它的服务在注册中心注册一下,然后需要暴露出来它的接口实现类,消费者可以直接在它的代码里面调用提供者服务的接口,这样其实消费者是调用的提供者发布到远程注册中心的方法,这样就实现了消费者调用提供者的方法,这就是RPC远程过程调用。
注册中心中可以查看提供者服务暴露的接口,如下图:
提供者暴露出去的接口,其实就是提供者服务中的一个实现类,这样在消费者当中就可以远程调用提供者服务中的实现类了。
监控中心——Simple Monitor安装配置
现在好像没有了,新版版应该和管理控制台整合到一起了吧。
Dubbo与Spring Boot整合
提供者服务整合Spring Boot
首先创建一个SpringBoot工程
然后把原来的提供者服务里面的实现类复制到这个spring boot工程里面,如下图:
接着引入通用的接口依赖,如下图:
紧接着导入依赖,导入dubbo-starte依赖和导入dubbo的其他依赖
配置
导入完依赖之后,紧接着就是配置,之前是写了一个provider.xml文件,提供者服务所有相关的服务都是配置在这个文件中的,现在整合了SpringBoot之后,所有之前的配置都可以写在SpringBoot的配置文件application.properties中,如下图:
下面这个图片是之前在没有整合SpringBoot的时候,配置文件中配置的内容,如下图:
在启动类上一定要加@EnableDubbo注解
启动类启动之后,提供者服务成功的注册到了zookeeper注册中心,在dubbo的管理控制台里面可以看到,如下图:
消费者服务整合Spring Boot
首先创建一个spring boot工程,如下图:
然后把原来的消费者服务里面的实现类复制到这个spring boot工程里面,如下图:
接着引入接口的依赖,如下图:
创建一个controller控制器类,如下图:
引入dubbo的启动依赖,如下图:
配置:引入dubbo的启动依赖之后,就可以把之前在consumer.xml配置文件中的配置全部都写在Spring Boot的配置文件application.properties中,如下图:
使用@Reference注解,引用远程的注册中心,如下图:
在启动类上开启@EnableDubbo注解,如下图:
成功启动消费者之后,消费者服务的启动类对应的端口号为8081,访问消费者服务中的接口,如下图:
dubbo的负载均衡能力
什么是负载均衡?比如说,现在有一个集群,集群里面有5台服务器A,B,C,D,E,现在客户端向服务器发送请求,我们总不能每次都让同一台服务器处理请求吧,所以我们要把请求要合理的分配给不同的服务器,这就是负载均衡。
复制三份提供者服务,模拟集群环境中的三台服务器,如下图:
首先启动原始的boot-user-service-provider提供者服务,启动工程中的修改信息如下图:
接着把boot-user-service-provider提供者服务复制一份命名为boot-user-service-provider2,然后修改dubbo协议端口号,和暴露的接口输出语句的信息,如下图:
最后把boot-user-service-provider提供者服务复制一份命名为boot-user-service-provider3,然后修改dubbo协议端口号,和暴露的接口输出语句的信息,如下图:
成功启动上面的三个提供者服务之后,可以在dubbo管理控制台查看对应的提供者信息,如下图:
现在提供者服务就已经就位了,就差启动消费者服务了,下面启动消费者服务,如下图:
五种负载均衡的机制,如下图:
通过@Reference设置负载均衡的机制,这里设置的是轮询的负载均衡方式,如下图:
还有一种是调整权重的负载均衡的方式。首先需要在提供者服务在注册中心暴露接口的时候加上一个权重,如下图:
修改成功,如下图:
|