拓冰建站拓冰建站
首页 / 资讯中心 / 正文

高性能RPC框架—----------------------Dubbo一站式快速入门

一、Web应用架构的演变随着互联网的发展网站应用的规模不断扩大Web应用架构也在不断的演变主要经历了四个阶段1. 单一应用架构当网站访问量很小时只需要一个应用程序将所有的功能都部署在一起以减少部署节点和成本。关键问题简化数据库操作数据访问框架ORM是核心。适用场景小型网站、管理系统、简易办公系统。局限扩展性差不便于协同开发不利于升级维护2. 垂直应用架构当访问量逐渐增大单一应用单机负载太大此时可以增加服务器来进行负载均衡提高响应速度即集群。但是当增加的服务器到达一定数量时所带来的加速度会越来越小此时单纯的增加服务器已无法明显提升响应速度。此时需要将系统业务拆分成多个互不相关的系统分别部署在独立的服务器上以提升效率称为垂直应用。关键问题加速前端页面开发MVC框架MVVM。优点通过拆分项目的业务实现业务上的独立降低了开发和维护的难度便于协同开发提高了扩展性。局限每个垂直模块中都有相同的内容entity、dao、service、web公共资源无法复用且业务逻辑与界面无法分离。3. 分布式服务架构当垂直应用越来越多应用之间的交互无法避免有些业务系统无法完全拆分为独立系统。此时可以将核心业务抽取出来作为独立的服务Service逐渐的形成稳定的服务中心使前端应用能够更好的适应市场需要的变化。关键问题提高业务的利用以及整合分布式服务框架RPCRemote Procedure Call 远程过程调用。4. 流动计算架构当服务越来越多服务之间的调用和依赖关系也越来越复杂诞生了面向服务的架构体系SOAService-Oriented Architecture。容量的评估小服务资源的浪费等问题开始出现此时需要增加一个调度中心基于访问压力实时的管理集群容量提高集群利用率。关键问题资源调度和治理中心使用dubbozookeeper。二、RPC简介1. RPC是什么RPCRemote Procedure Call 远程过程调用。是一种进程间的通信方式它允许应用程序调用网络上的另一个应用程序中的方法对于服务的消费者而言无需了解远程调用的底层细节透明的2. 执行流程客户端发起调用请求客户端存根对请求参数接口、方法、参数等进行序列化封装客户端存根向服务器存根发送消息服务端存根对接收到的消息进行反序列化服务端存根发送请求调用本地方法服务器执行业务处理服务器返回处理结果服务端存根对处理结果进行序列化服务端存根将结果返回给客户端存根客户端存根对接收到的结果进行反序列化客户端存根将结果返回给客户端三、Dubbo简介1. Dubbo是什么Apache Dubbo是一款高性能的Java RPC框架由阿里巴巴开发开源贡献给Apache。提供了三个核心功能面向接口的远程方法调用智能容错和负载均衡服务自动注册和发现参考官网 http://dubbo.apache.org2. Dubbo体系结构执行流程Provider服务的提供者负责对外提供服务提供者在启动的时候需要向Registry注册自己能够提供的服务Consumer服务的消费者消费者在启动的时候需要向Registry订阅自己需要的服务Registry注册中心接受注册和订阅会异步的通知订阅者向消费者提供服务列表Monitor监控中心统计服务的调用次数和调用时间服务消费者和提供者会在内存中累计调用次数和调用时间定时每分钟向监控中心发送一次统计数据当消费者需要执行远程过程调用时会从Registry获取到服务地址列表基于负载均衡算法进行调用如果调用失败会重新选择新的提供者再次调用。四、使用Dubbo1. Spring版1.1 创建common工程创建entity和service接口。1.2 创建provider工程步骤添加依赖!--依赖于dubbo-common-- dependency groupIdcom.itany/groupId artifactIddubbo-common/artifactId version1.0-SNAPSHOT/version /dependency !--spring-- dependency groupIdorg.springframework/groupId artifactIdspring-core/artifactId version${springversion}/version /dependency dependency groupIdorg.springframework/groupId artifactIdspring-beans/artifactId version${springversion}/version /dependency dependency groupIdorg.springframework/groupId artifactIdspring-context/artifactId version${springversion}/version /dependency dependency groupIdorg.springframework/groupId artifactIdspring-expression/artifactId version${springversion}/version /dependency !--dubbo核心包-- dependency groupIdcom.alibaba/groupId artifactIddubbo/artifactId version2.6.2/version /dependency !--使用zookeeper作为注册中心在dubbo中会访问zookeeper-- dependency groupIdorg.apache.zookeeper/groupId artifactIdzookeeper/artifactId version3.4.13/version /dependency !--zookeeper的客户端实现-- dependency groupIdorg.apache.curator/groupId artifactIdcurator-framework/artifactId version4.0.1/version /dependency编写实现类public class UserServiceImpl implements UserService { Override public User findById(int id) { System.out.println(UserServiceImpl.findById); User user new User(); user.setId(id); user.setUsername(tom); user.setPassword(123); return user; } }配置dubbo!--配置当前dubbo应用程序的名称可自定义但必须唯一一般使用项目名-- dubbo:application namedubbo-provider/ !--指定注册中心地址-- dubbo:registry addresszookeeper://127.0.0.1:2181/ !--配置dubbo协议和端口通过该端口来提供服务-- dubbo:protocol namedubbo port8888/ !--指定要暴露的服务接口-- dubbo:service interfacecom.itany.service.UserService refuserService/ bean iduserService classcom.itany.service.impl.UserServiceImpl/1.3 创建consumer工程步骤添加依赖同1.2编写使用类Controller public class UserController { private UserService userService; public void setUserService(UserService userService) { this.userService userService; } public void findUser(){ User user userService.findById(1001); System.out.println(user); } }配置Dubbodubbo:application namedubbo-consumer/ dubbo:registry addresszookeeper://127.0.0.1:2181/ !--指定要引用的服务-- dubbo:reference iduserService interfacecom.itany.service.UserService/ bean classcom.itany.controller.UserController property nameuserService refuserService / /bean1.4 测试启动zookeeper编写并运行providerpublic static void main(String[] args) { ApplicationContext ac new ClassPathXmlApplicationContext(classpath:provider.xml); //阻塞线程 new Scanner(System.in).next(); }编写并运行consumerpublic static void main(String[] args) { ApplicationContext ac new ClassPathXmlApplicationContext(classpath:consumer.xml); UserController userController ac.getBean(UserController.class); userController.findUser(); //阻塞线程 new Scanner(System.in).next(); }2. Spring注解版2.1 改写provider!--dubbo组件的扫包-- dubbo:annotation packagecom.itany.service.impl/ !--spring组件的扫包-- context:component-scan base-packagecom.itany.service.impl/// 方式1 // Service // com.alibaba.dubbo.config.annotation.Service // 方式2 Component Service public class UserServiceImpl implements UserService { // 实现代码 }2.2 改写consumerdubbo:annotation packagecom.itany.controller/ context:component-scan base-packagecom.itany.controller/Controller public class UserController { // 使用dubbo的Reference注入远程服务对象 Reference private UserService userService; // 方法实现 }3. SpringBoot版3.1 创建provider工程步骤添加依赖!--依赖于dubbo-common-- dependency groupIdcom.itany/groupId artifactIddubbo-common/artifactId version1.0-SNAPSHOT/version /dependency !--dubbo的starter-- dependency groupIdcom.alibaba.boot/groupId artifactIddubbo-spring-boot-starter/artifactId version0.2.0/version /dependency编写实现类Component Service public class UserServiceImpl implements UserService { Override public User findById(int id) { User user new User(); user.setId(id); user.setUsername(alice); user.setPassword(123); return user; } }配置dubboserver: port: 8881 dubbo: application: name: boot-provider registry: address: zookeeper://127.0.0.1:2181 protocol: name: dubbo port: 8888启用dubboSpringBootApplication EnableDubbo //启用dubbo public class BootProviderApplication { public static void main(String[] args) { SpringApplication.run(BootProviderApplication.class, args); } }3.2 创建consumer步骤添加依赖同3.1编写使用类Controller RequestMapping(/user) public class UserController { Reference private UserService userService; RequestMapping(/findUser) public String findUser(int id, Model model) { User user userService.findById(id); model.addAttribute(user, user); return success; } }配置dubboserver: port: 8882 dubbo: application: name: boot-consumer registry: address: zookeeper://127.0.0.1:2181 spring: thymeleaf: cache: false五、配置dubbo1. 配置的覆盖关系dubbo属性可以配置在如下六个位置消费者引用方法处提供者暴露方法处消费者引用接口处提供者暴露接口处消费者全局配置处提供者全局配置处优先顺序方法级优先接口级次之全局配置再次之。如果级别一样则消费方优先提供方次之注建议由服务提供者设置超时时间。2. 常用配置配置项作用timeout超时时间单位为毫秒默认1000msretries重试次数不包括第一次调用默认为20表示不重试check启动时检查提供者是否存在true表示不存在时报错false表示启动时不检查默认为trueurl点对点直连服务提供者绕过注册中心以服务接口为单位六、监控中心1. dubbo-adminDubbo的管理控制台可以对提供者和消费者进行管理便于调试发现问题解决问题。1.1 下载dubbo-admin方式一从GitHub下载推荐访问Dubbo官方GitHub仓库GitHub - apache/dubbo-admin: The ops and reference implementation for Apache Dubbo. · GitHub点击页面右侧的Code按钮选择Download ZIP下载最新源码或者使用Git命令克隆git clone https://github.com/apache/dubbo-admin.git方式二从Apache官网下载访问Apache Dubbo官网Apache Dubbo在下载页面找到dubbo-admin的发布版本选择适合的版本下载通常为.zip或.tar.gz格式1.2 环境准备在部署dubbo-admin之前需要确保以下环境已就绪Java环境JDK 1.8或更高版本Maven3.5或更高版本用于源码编译ZooKeeper已安装并运行Dubbo的注册中心Node.js14.x或更高版本前端部分需要1.3 部署与启动步骤步骤1解压并进入项目目录# 解压下载的文件 unzip dubbo-admin-master.zip # 或 tar -zxvf dubbo-admin-xxx.tar.gz 进入项目目录 cd dubbo-admin步骤2修改配置文件找到配置文件dubbo-admin-server/src/main/resources/application.properties或application.yml修改以下关键配置# 注册中心地址根据实际情况修改 dubbo.registry.addresszookeeper://127.0.0.1:2181 管理控制台端口 server.port8080 数据库配置如果需要持久化 spring.datasource.urljdbc:mysql://localhost:3306/dubbo_admin?useUnicodetruecharacterEncodingutf-8 spring.datasource.usernameroot spring.datasource.password123456步骤3编译打包# 使用Maven进行编译打包 mvn clean package -Dmaven.test.skiptrue 编译成功后在target目录下会生成dubbo-admin-server-xxx.jar文件步骤4启动dubbo-admin# 方式一直接运行jar包 java -jar dubbo-admin-server/target/dubbo-admin-server-xxx.jar 方式二使用Spring Boot Maven插件启动 mvn spring-boot:run -pl dubbo-admin-server步骤5访问管理控制台启动成功后在浏览器中访问http://localhost:8080默认登录账号root默认登录密码root1.4 Docker方式部署可选如果使用Docker可以更快速地部署dubbo-admin# 拉取官方镜像 docker pull apache/dubbo-admin 运行容器 docker run -d --name dubbo-admin -p 8080:8080 -e admin.registry.addresszookeeper://宿主机IP:2181 -e admin.config-centerzookeeper://宿主机IP:2181 -e admin.metadata-report.addresszookeeper://宿主机IP:2181 apache/dubbo-admin1.5 主要功能说明登录dubbo-admin后可以查看以下主要功能服务治理查看所有注册的服务提供者和消费者服务测试在线测试Dubbo服务接口配置管理动态修改服务配置流量管理进行流量控制和服务降级监控统计查看服务调用统计和性能指标注意事项确保ZooKeeper服务已启动且dubbo-admin能正常连接生产环境建议修改默认账号密码根据实际网络环境调整配置文件中的IP和端口定期查看日志文件监控dubbo-admin运行状态七、总结与参考资料1. 总结本文系统性地介绍了Web应用架构的演变历程从单一应用架构到流动计算架构展示了随着业务规模扩大和技术发展架构模式如何逐步演进以满足更高的性能、可扩展性和可维护性需求。RPC远程过程调用作为分布式系统的核心技术通过客户端存根和服务端存根的协作实现了跨网络的方法调用透明化为分布式服务架构提供了基础通信机制。Apache Dubbo作为一款高性能的Java RPC框架在RPC基础上提供了完整的服务治理能力服务注册与发现通过注册中心实现服务的自动注册和发现负载均衡智能分配请求到多个服务提供者容错机制提供多种容错策略保证系统稳定性监控管理通过dubbo-admin实现服务的可视化管理和监控通过Spring、Spring注解和SpringBoot三种集成方式Dubbo能够灵活适应不同的开发场景为微服务架构提供了可靠的技术支撑。2. 参考资料Dubbo官方文档Apache Dubbo - Apache Dubbo官方网站包含完整的使用文档、API参考和最佳实践ZooKeeper官网Apache ZooKeeper - Apache ZooKeeper官方网站Dubbo常用的注册中心实现Dubbo GitHub仓库GitHub - apache/dubbo: The java implementation of Apache Dubbo. An RPC and microservice framework. · GitHub - Dubbo开源代码仓库包含最新源码和问题反馈Dubbo-admin GitHub仓库GitHub - apache/dubbo-admin: The ops and reference implementation for Apache Dubbo. · GitHub - Dubbo管理控制台源码技术博客Dubbo官方博客 - 包含Dubbo最新特性、版本更新和技术分享建议读者在实际项目中根据业务需求选择合适的架构模式并结合Dubbo的丰富功能构建稳定、高效的分布式系统。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门