微服务架构与Dubbo

一、微服务架构

微服务架构是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。
分布式系统式若干独立系统的集合,但是用户使用起来好像是在使用一套系统。

和微服务对应的是单体式开发,即所有的功能打包在一个WAR包里,基本没有外部依赖,部署在一个JavaEE容器里,包括DO/DAO,Service,UI等所有逻辑。

微服务架构将庞大的单体应用程序分解成一套服务,使得每个服务可以由一个团队独立专注开发,每个微服务独立部署。开发人员需要基于RPC或者消息实现微服务之间的调用和通信

目前两种微服务架构解决方案:

(1)SpringBoot+SpringCloud

(2)Dubbo+ZooKeeper:Dubbo是一个阿里巴巴开源出来的一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。ZooKeeper用来实现服务的注册与发现和进行负载均衡。

补充:

(1)RPC(远程调用):

RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。

常用的RPC框架包括gRPC、Thrift、Dubbo等。

二、Dubbo

Dubbo 作为一款微服务框架,最重要的是向用户提供跨进程的 RPC 远程调用能力。如上图所示,Dubbo 的服务消费者(Consumer)通过一系列的工作将请求发送给服务提供者(Provider)。

2.1 Dubbo性能高的原因

Dubbo是一个RPC框架,主要干的是远程过程(方法)调用,提升性能就要从最关键、最耗时的两个方面入手:序列化和网络通信。

序列化:Java网络开发中,本地的对象要在网络上传输,必须要实现Serializable接口,也就是必须序列化,序列化的方案很多:xml、json、二进制流...,其中效率最高的就是二进制流,而dubbo采用的就是效率最高的二进制。

网络通信:不同于HTTP需要进行7步走(三次握手和四次挥手),dubbo采用Socket通信机制,一步到位,提升了通信效率,并且可以建立长连接,不用反复连接,直接传输数据。

2.2 dubbo的三大核心功能
面向接口的远程方法调用智能容错和负载均衡服务自动注册和发现

"Container "就是Spring容器,dubbo和Spring是无缝对接的。"Provider "启动时加载到"Container "容器中,启动完服务后spring容器注册到"Registry "注册中心。"Consumer"启动时也需要加载到Spring容器中(未画出),服务启动完成后Spring容器也取"Registry"注册中心订阅(subscribe)服务,订阅完成后注册中心将地址列表(如果有变更,Registry将基于长连接推送变更数据给Provider)发送(notify)给Consumer,Consumer根据这些地址基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。Consumer和Provider在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心Monitor

说明:Consumer、Provider、Container和Register需要进行开发,Monitor是现成的,不需要进行开发。也可以没有Registry,Provider告诉Consumer地址,Consumer直接调用。

2.3 dubbo支持的协议

Consumer向Provider请求服务(invoke)时支持多种协议:Dubbo、hessian、rmi、http、thrift、redis等,dubbo官方推荐使用dubbo协议,默认端口20880。

使用dubbo协议,Spring配置文件加入:

<dubbo:protocol name="dubbo" port="20880">

三、 dubbo调用服务方式--直连方式

3.1 直连方式(只包括Provider工程和Consumer工程)

实例:

1.新建项目作为Provider

(1)在IDEA中新建空项目,在空项目中新建maven项目,新建java和resources目录。

(2)在pom.xml文件中删除多余依赖,加入所需依赖:

(3)新建实体类User:

新建服务接口和实现类:

(4)新建dubbo的核心配置文件(Spring的xml),将建立的服务暴露出去。

补充说明:

<dubbo:application >标签中的name属性值即为服务名称。

dubbo:service标签的registry置为N/A表示使用不通过注册中心的直连方式。

(5)配置监听器

(6)配置项目的tomcat

(7)打包

注释掉下图中的标签:

打包项目到本地仓库:

取消注释:

2.新建项目作为Consumer

(1)与1的(1)相同

(2)与2的(2)的区别

加入下面依赖:

(3)配置dubbo核心配置文件

(4)配置spring的核心配置文件

(5)编写控制层代码

(6)修改web.xml

(7)创建页面

(8)部署tomcat,启功Comsumer和Provider服务

效果如下:

3.2 直连方式(将接口和实体bean单独放到一个接口工程里)

建立3个工程,分别是接口工程、Provider工程和Consumer工程,这也是官方推荐的工程。

接口工程是maven java工程。

(一)建立接口工程


新建实体类:

新建服务类

(二)新建Provider工程


添加依赖:

注意:还需要引入接口工程,并对接口工程里的接口具体实现

实现接口:

新建核心配置文件dubbo-userservice-provider.xml:

修改web.xml文件:

配置tomcat。

(三)新建Consumer工程:



也要导入接口工程:

新建核心配置文件dubbo-consumer.xml:

Consumer用到了.jsp页面,需要新建spring(SpringMVC)的核心配置文件applicationContext.xml:

新建控制层的类:

修改web.xml

创建页面

配置tomcat。

启动Comsumer和Provider服务,浏览器访问:

总结:Consumer直接引入接口工程,接口工程只有接口,而接口的具体实现在Provider项目(Provider引入接口工程实现)中。

问题:

直连方式无注册中心,Consumer直接向指定的Provider请求服务,不能保证服务最优化,没有考虑集群之间存在调度问题。

四、注册中心ZooKeeper

4.1 注册中心

对于服务提供方,需要发布服务,而且由于应用系统的复杂性,服务的数量、类型也不断膨胀;对于服务消费方,最关心如何获取到它所需要的服务,而面对复杂的应用系统,需要管理大量的服务调用。

而且,对于服务提供方和服务消费者来说,还有可能兼具这两种角色,即需要提供服务,又需要消费服务,通过统一管理起来,可以有效地优化内部应用对服务发布/使用的流程的管理,服务注册中心可以通过特定协议来完成服务对外的统一。

Dubbo推荐Zookeeper注册中心。

Zookeeper是Apacahe Hadoop的子项目,是一个树形的目录结构,支持变更推送(服务有变更会被推送),适合作为Dubbo服务的注册中心。

下图为Zookeeper的管理方式:

4.2安装Zookeeper

下载官网:

zookeeper.apache.org

下载的压缩包:

解压文件:

打开conf目录:

复制zoo_sample.cfg文件为zoo.fcg

编辑zoo.cfg:

修改dataDir的值并在本地文件夹建立项目的空目录

双击执行bin目录下的zkServer.cmd:

五、dubbo调用服务方式--使用注册中心

(一)新建接口工程


加依赖:

新建实体类:

接口类:

(二)新建Provider工程


加依赖:


新建接口实现类:

新建dubbo核心配置文件dubbo-zk-userservice-provider.xml:

(三)新建Consumer项目


添加依赖:


修改核心配置文件:

新建SpringMVC核心配置文件applicationContext.xml:

修改web.xml:

新建控制层类:

配置tomcat。

打开Zookeeper,双击bin目录下的zkServer.sh

启动Comsumer和Provider服务,浏览器访问:

六、版本号version

有的时候,想要改进Provider里的实现类的内容,或者增加新的实现类,为了区分,可以使用版本号。

(一)新建provider


添加依赖:

从上图中,可以看出引入的是之前创建的接口工程。

新建多个接口实现类:

新建核心配置文件dubbo-userservice-multi-provider.xml:

注意:不管一个接口是否有多个实现类,只要服务提供者向外暴露接口服务时指定了版本号,作为消费者引用远程接口服务的时候就必须执行版本号。

(二)创建Consumer


添加依赖:

新建核心配置文件dubbo-multi-consumer.xml:

如上图,dubbo引用多个标签,id不能相同,并写明不同的版本号。

新建SpringMVC的核心配置文件:

修改web.xml:

新建.jsp文件:

配置tomcat,并启动Comsumer和Provider服务。

七、关闭检查

dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成,以便上线时,能及早地发现问题,默认check=true。通过check=false关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。

相关推荐
Lee川8 小时前
深度拆解:基于面向对象思维的“就地编辑”组件全模块解析
javascript·架构
勤劳打代码8 小时前
Flutter 架构日记 — 状态管理
flutter·架构·前端框架
子兮曰14 小时前
后端字段又改了?我撸了一个 BFF 数据适配器,从此再也不怕接口“屎山”!
前端·javascript·架构
卓卓不是桌桌16 小时前
如何优雅地处理 iframe 跨域通信?这是我的开源方案
javascript·架构
Qlly16 小时前
DDD 架构为什么适合 MCP Server 开发?
人工智能·后端·架构
用户881586910911 天前
AI Agent 协作系统架构设计与实践
架构
鹏北海2 天前
Qiankun 微前端实战踩坑历程
前端·架构
货拉拉技术2 天前
货拉拉海豚平台-大模型推理加速工程化实践
人工智能·后端·架构
RoyLin2 天前
libkrun 深度解析:架构设计、模块实现与 Windows WHPX 后端
架构
CoovallyAIHub3 天前
实时视觉AI智能体框架来了!Vision Agents 狂揽7K Star,延迟低至30ms,YOLO+Gemini实时联动!
算法·架构·github