dubbo的rpc远程过程调用+dubbo的负载均衡+zookeeper注册中心(代码片段)

杀手不太冷! 杀手不太冷!     2022-12-26     123

关键词:

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依赖,如下图:

<!--引入dubbo-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.2</version>
        </dependency>

        <!--因为注册中心使用的是zookeeper,所以要引入操作zookeeper的客户端-->
        <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设置负载均衡的机制,这里设置的是轮询的负载均衡方式,如下图:

还有一种是调整权重的负载均衡的方式。首先需要在提供者服务在注册中心暴露接口的时候加上一个权重,如下图:

修改成功,如下图:

dubbo

...、轻量级的开源RPC框架,致力于提供高性能和透明化的RPC远程服务调用方案,SOA服务治理方案(面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现等功能)。简单的说,dubbo就是个服务框架,只有在分布... 查看详情

一个基于dubbo协议的服务远程调用全过程

服务调用端:当我们调用服务的时候Dubbo会生成一个代理对象,然后调用InvokerInvocationHandler#invoke方法  AbstractClusterInvoker#invoke:设置负载均衡器FailoverClusterInvoker#doInvoke:处理集群容错,负载均衡选择一个后端服务.........省... 查看详情

分布式rpc服务调用框架选型:使用dubbo实现分布式服务调用

...量级的RPC分布式服务框架提供了三核心能力:面向接口的远程方法调用(@Reference)智能容错负载均衡Dubbo特点:按照分层的方式来架构,可以使各个层之间解耦合Dubbo的角色:提供方:Provider消费方:ConsumerDubbo的提供非常简单的服务模型,要... 查看详情

dubbo系列dubbo的核心技术--rpc调用

...col和方法调用Invoke;一、RPC协议Protocol(RemoteProcedureCall)远程过程调用协议1、我们平时使用最多的http协议其实也属于RPC协议,下图分别是普通的传输层TCP和应用层http与dubbo优化后的TCP和dubbo协议进行对比。总结:原生的传输层... 查看详情

dubbo实战快速入门

...是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。其核心部分包含:远程通讯:提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信... 查看详情

dubbo分布式服务框架-study1

... dubbo是一款高性能、轻量级的开源javaRPC服务框架(RPC即远程过程调用,具体解释见:https://www.jianshu.com/p/2accc2840a1b)。它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。搭建... 查看详情

7.dubbo远程调用(要配合下一篇一起看)

参考技术A如果我们手动写一个简单的RPC调用,一般需要把服务调用的信息传递给服务端,包括每次服务调用的一些共用信息包括服务调用接口、方法名、方法参数类型和方法参数值等,在传递方法参数值时需要先序列化对象并... 查看详情

dubbo怎么不依赖spring

...是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案主要核心部件Remoting:网络通信框架,实现了sync-over-async和request-response消息机制.RPC:一个远程过程调用的抽象,支持负载均衡、容灾... 查看详情

什么时候用http不用dubbo

...是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案主要核心部件Remoting:网络通信框架,实现了sync-over-async和request-response消息机制.RPC:一个远程过程调用的抽象,支持负载均衡、容灾... 查看详情

dubbo的配置过程,实现原理及架构详解

...架构。在分布式架构的背景下,在本地调用非本进程内(远程)的资源就变得在所难免。因此,后期涌现出了很多RPC(远程过程调用)的框架,如ApacheThrift、Hessian、gRPC等。然而,随着RPC框架的推广和使用的日益深入,服务越来越... 查看详情

dubbo版本2.8.4消费者远程调用过程(代码片段)

dubbo远程调用过程一、Invoker发送消息到服务器首先是FailoverClusterInvoker的invoke()方法FailoverClusterInvoker的doInvoke()方法选择负载均衡(loadbalance)方式调用后续方法InvokerWrapper的invoke()方法FutureFilter的invoke方法拦截后续invoke方法,并设... 查看详情

dubbo详解-说明

...是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理的方案。Dubbo有啥特点?远程通讯:提供透明化的远程方法的调用,提供多协议支持。集群容错:软负载均衡,失败容错,地址路由,... 查看详情

微服务技术高质量面试总结

...区别?设计RPC协议有哪些注意点?Dubbo中的服务暴露和引用过程?Dubbo中的负载均衡策略?Dubbo中容错机制的实现源码?Dubbo服务调用过程?Dubbo调用端如何在JVM中生成对应的服务?Dubbo服务端和调用端超时时间设置和区别?讲一讲Dubbo长连接? 查看详情

微服务技术高质量面试总结

...区别?设计RPC协议有哪些注意点?Dubbo中的服务暴露和引用过程?Dubbo中的负载均衡策略?Dubbo中容错机制的实现源码?Dubbo服务调用过程?Dubbo调用端如何在JVM中生成对应的服务?Dubbo服务端和调用端超时时间设置和区别?讲一讲Dubbo长连接? 查看详情

微服务技术高质量面试总结

...区别?设计RPC协议有哪些注意点?Dubbo中的服务暴露和引用过程?Dubbo中的负载均衡策略?Dubbo中容错机制的实现源码?Dubbo服务调用过程?Dubbo调用端如何在JVM中生成对应的服务?Dubbo服务端和调用端超时时间设置和区别?讲一讲Dubbo长连接? 查看详情

dubbo相关面试题

...息,RPC层就是真正的RPC调用的核心层,封装整个RPC的调用过程、负载均衡、集群容错、代理,remoting则是对网络传输协议和数据转换的封装。划分到更细的层面,就是图中的10层模式,整个分层依赖由上至下,除开business业务逻辑... 查看详情

dubbo原理和机制详解(非常全面)

Dubbo是一款JavaRPC框架,致力于提供高性能的RPC远程服务调用方案。Dubbo作为主流的微服务框架之一,为开发人员带来了非常多的便利。本文我们重点详解Dubbo的原理机制@mikechen目录Dubbo核心功能Dubbo核心组件Dubbo的架构设... 查看详情

阿里面试必问的dubbo相关问题

...体,我来为大家详解。RPC和RPC框架1.RPC(RemoteProcedureCall)即远程过程调用,主要解决远程通信间的问题,不需要了解底层网络的通信机制 查看详情