irpas技术客

SpringBoot整合Dubbo + zookeeper_一起去稻城_springboot整合dubbo和zk

未知 7447

Dubbo是什么

Dubbo 是阿里巴巴开源的一个基于 Java 的 RPC 框架.(RPC 即 Remote Procedure Call,远程过程调用) 2018 年和 当当的 Dubbox 进行了合并,进入 Apache 孵化器,在 2019 贡献给 Apache 成为顶级项目

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

为什么要用Dubbo

Dubbo的诞生和SOA分布式架构的流行有着莫大的关系。SOA 面向服务的架构(Service Oriented Architecture),也就是把工程按照业务逻辑拆分成服务层和表现层。服务层中包含业务逻辑,只需要对外提供服务即可。表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。 SOA架构中有两个主要角色:服务提供者(Provider)和服务使用者(Consumer)

随着微服务的进一步发展,服务越来越多,服务之间的调用和依赖关系也越来越复杂,诞生了面向服务的架构体系(SOA), 也因此衍生出了一系列相应的技术,如对服务提供、服务调用、连接处理、通信协议、序列化方式、服务发现、服务路由、日志输出等行为进行封装的服务框架。 就这样为分布式系统的服务治理框架就出现了,Dubbo也就这样产生了.

官方描述

在大规模服务化之前,应用可能只是通过 RMI 或 Hessian 等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过 F5 等硬件进行负载均衡。

当服务越来越多时,服务 URL 配置管理变得非常困难,F5 硬件负载均衡器的单点压力也越来越大。 此时需要一个服务注册中心,动态地注册和发现服务,使服务的位置透明。并通过在消费方获取服务提供方地址列表,实现软负载均衡和 Failover,降低对 F5 硬件负载均衡器的依赖,也能减少部分成本。

当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。 这时,需要自动画出应用间的依赖关系图,以帮助架构师理清关系。

接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器? 为了解决这些问题,第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标。其次,要可以动态调整权重,在线上,将某台机器的权重一直加大,并在加大的过程中记录响应时间的变化,直到响应时间到达阈值,记录此时的访问量,再以此访问量乘以机器数反推总容量。

以上是 Dubbo 最基本的几个需求。

Dubbo架构

Container 服务运行容器 Provider 暴露服务的服务提供方 Registry 服务注册中心 Consumer 调用远程服务的服务消费方 Monitor 服务监控中心 关系说明 服务容器负责启动,加载、运行服务提供者。 服务提供者在启动时,向注册中心注册自己提供的服务。 服务消费者在启动时,向注册中心订阅自己所需的服务。 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

通俗的讲: 服务器A 调用服务器B 的方法 此时服务器A是消费者 服务器B是提供者 服务器B(提供者)把自己注册到dubbo,服务器A(消费者)向dubbo索要服务器B(提供者)提供的服务 其实服务器B(提供者)就是把自己的url注册到dubbo,服务器A(消费者)在dubbo拿到了url,根据url请求服务器B(提供者)数据

springboot + dubbo + zookeeper

下面将使用springboot + dubbo + zookeeper的方式,创建一个项目,模拟微服务之间的调用.

创建一个空项目,添加三个子工程

api-x 负责接口和模型,创建普通maven工程就可以 Provider-x 作为服务提供者,创建springboot工程,可独立运行 Consumer-x 作为服务消费者,创建springboot工程,可独立运行

接口 api-x 工程 服务提供者 provider-x 工程 pom.xml配置

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- 引入 api-x 依赖 --> <dependency> <groupId>com.ldl</groupId> <artifactId>api-x</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!-- dubbo-starter 依赖 --> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.0</version> </dependency>

application.yml 添加dubbo配置

dubbo: # 设置服务应用名称 保证唯一 application: name: demo-provider registry: # 指定注册中心 address: zookeeper://127.0.0.1:2181 # 指定通讯协议和端口 dubbo协议 默认端口20880 protocol: port: 20880 name: dubbo # 添加 monitor 监控 monitor: address: registry

需要在启动类加上注解 @EnableDubbo 创建实现类,实现 api-x 工程的接口,注意 @Service 要使用 dubbo 内的注解,可以理解为该注解暴露服务提供者实现相关接口,当消费端调用相关的类时,最终会调用提供者的实现方法 同时也可以添加@Component 注入到spring 容器里

import com.alibaba.dubbo.config.annotation.Service; import com.ldl.entity.User; import com.ldl.service.UserService; import org.springframework.stereotype.Component; @Service @Component public class UserServiceImpl implements UserService { @Override public User getUser(Integer id) { User user = new User(); user.setId(id); user.setName("zhangsan!"); return user; } }

服务消费者 consumer-x 工程 pom.xml 配置

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- 引入 api-x 依赖 --> <dependency> <groupId>com.ldl</groupId> <artifactId>api-x</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!-- dubbo-starter 依赖 --> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.0</version> </dependency>

application.yml 添加dubbo配置

dubbo: # 设置服务应用名称 保证唯一 application: name: demo-consumer # 指定注册中心 registry: address: zookeeper://127.0.0.1:2181

启动类需要添加注解 @EnableDubbo 创建controller , 注意:以往接口变量上我们使用注解 @Autowired 进行自动装配,现在需要使用 dubbo 包下的注解 @Reference ,@Reference 的行为和 @Autowired 类似,均实现了自动注入的过程,只不过它注入的是服务提供者暴露的远程服务

import com.alibaba.dubbo.config.annotation.Reference; import com.ldl.entity.User; import com.ldl.service.UserService; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class UserController { @Reference private UserService userService; @RequestMapping(value = "/") public String index(Model model){ model.addAttribute("key","hello"); User user = userService.getUser(1001); model.addAttribute("user",user); return "index"; } }

配置一个简单页面,展示响应数据

<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>[[${key}]]</h1> <h3>[[${user.id}]]</h3> <h3>[[${user.name}]]</h3> </body> </html>

三个子工程配置完成,启动项目之前,要先运行zookeeper

配置zookeeper

Dubbo 官方推荐使用 zookeeper 作为注册中心

在 Apache 官网下载 zookeeper https://zookeeper.apache.org/releases.html

下载完成并解压,在 bin 的同级目录 新建一个 data 文件夹,存放数据日志文件

进入conf 目录 找到 zoo_sample.cfg 复制一份,重命名为 zoo.cfg,zoo.cfg 是 zookeeper 的配置文件 打开 zoo.cfg 修改配置

dataDir=../data clientPort=2181 # 不设置默认端口为 8080,防止占用设置为8888端口 admin.serverPort=8888

Windows下启动 zookeeper ,进入bin目录,双击 zkServer.cmd启动 启动项目 启动项目前,要先运行zookeeper 注意:要先启动服务提供者 provider-x 工程,后启动服务消费者 consumer-x 工程 访问首页面,显示数据,一个简单的demo完成

下载dubbo官方的ops,登录查看服务监控信息

服务提供者 服务消费者


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #Dubbo是什么Dubbo #是阿里巴巴开源的一个基于 #JAVA # #RPC #框架RPC #