微服务架构与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关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。

相关推荐
王彬泽1 小时前
【微服务】组件、基础工程构建(day2)
微服务
Cikiss1 小时前
微服务实战——SpringCache 整合 Redis
java·redis·后端·微服务
Cikiss1 小时前
微服务实战——平台属性
java·数据库·后端·微服务
_.Switch2 小时前
Python机器学习:自然语言处理、计算机视觉与强化学习
python·机器学习·计算机视觉·自然语言处理·架构·tensorflow·scikit-learn
攸攸太上5 小时前
JMeter学习
java·后端·学习·jmeter·微服务
feng_xiaoshi6 小时前
【云原生】云原生架构的反模式
云原生·架构
妍妍的宝贝6 小时前
k8s 中微服务之 MetailLB 搭配 ingress-nginx 实现七层负载
nginx·微服务·kubernetes
架构师吕师傅8 小时前
性能优化实战(三):缓存为王-面向缓存的设计
后端·微服务·架构
团儿.10 小时前
解锁MySQL高可用新境界:深入探索MHA架构的无限魅力与实战部署
数据库·mysql·架构·mysql之mha架构
王彬泽10 小时前
【微服务】服务注册与发现、分布式配置管理 - Nacos
微服务·服务注册与发现·分布式配置管理