手写一篇简单的Dubbo程序实现远程调用
前言:
本人小白一枚,博客为自己学习时课后笔记,如有不足,请大佬们多多指教。
关于dubbo简介:
Dubbo的介绍
Apache Dubbo是一款高性能的Java RPC框架。其前身是阿里巴巴公司开源的一个高性能、轻量级的开源Java RPC框架,可以和Spring框架无缝集成。
Dubbo提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现
Dubbo架构图简介
架构说明
关于虚线和实线:虚线表示异步,实现表示同步。异步不影响线程阻塞,同步必须等待响应结果才能继续执行,相对性能低。
Provider
提供者。编写持久层和事务代码.
Container
容器(spring)容器,Dubbo是基于spring实现的。
Registry
注册中心。放置所有Provider提供的信息。包含Provider的IP,访问端口,访问遵守的协议,对外提供的接口,接口中有哪些方法等相关信息。
Consumer
消费者(RPC调用者,SOA调用服务的项目)开发中也是一个项目,编写service和controller(还可以报页面等)。调用XXXXServiceImpl中的方法。
Monitor
监控中心。监控Provider的压力情况等。每隔2分钟Consumer和Provider会把调用次数发送给Monitor,由Monitor进行统计。
执行流程
-
statr:启动spring容器时会启动Provider
-
register:将provider中相关信息注册到registry中
-
subscribe:Consumer从Registry中订阅Provider的信息
-
notify:通知给Consumer
-
invoke:Consumer根据Registry通知的信息进行调用Provider中方法。
-
count:Consumer和Provider把调用次数信息异步发送给Monitor进行统计。
搭建一个简单的Dubbo项目
整体结构如下:
api:负责提供对外的接口
provider:提供者
consumer:调用者
父项目DubboParent中Pom导入依赖项
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.cowain</groupId> <artifactId>DubboParent</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>api</module> <module>provider</module> <module>consumer</module> </modules> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.10.RELEASE</version> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.1.10.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.1.10.RELEASE</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>4.2.0</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>4.2.0</version> </dependency> </dependencies> </dependencyManagement> </project>
api中代码结构:
provider结构:
Pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>DubboParent</artifactId> <groupId>com.cowain</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>provider</artifactId> <dependencies> <dependency> <artifactId>api</artifactId> <groupId>com.cowain</groupId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> </dependency> </dependencies> </project>
DubboServiceImpl
package com.cowain.service.impl; import com.cowain.dubbo.service.DobbuService; import org.apache.dubbo.config.annotation.Service; /** * @Author: fxw * @Date: 2022/1/10 21:40 */ @Service public class DubboServiceImpl implements DobbuService { @Override public String testDemo(String param) { System.out.println("执行demo"); return param+":hello"; } }
apploication.xml
只要配置zookeeper的ip与端口
dubbo: application: name: dubbo-provider registry: address: zookeeper://192.168.153.129:2181 protocol: port: 20884
consumer结构:
Pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>DubboParent</artifactId> <groupId>com.cowain</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>consumer</artifactId> <dependencies> <dependency> <artifactId>api</artifactId> <groupId>com.cowain</groupId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> </dependency> </dependencies> </project>
ConsumerController
package com.cowain.controller; import com.cowain.service.ConsumerService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; /** * @Author: fxw * @Date: 2022/1/10 21:50 */ @Controller public class ConsumerController { @Autowired private ConsumerService consumerService; @RequestMapping("/demo") @ResponseBody public String testDubboDemo(){ return consumerService.demo(); } }
ConsumerServiceImpl
package com.cowain.service.impl; import com.cowain.dubbo.service.DobbuService; import com.cowain.service.ConsumerService; import org.apache.dubbo.config.annotation.Reference; import org.springframework.stereotype.Service; /** * @Author: fxw * @Date: 2022/1/10 21:48 */ @Service public class ConsumerServiceImpl implements ConsumerService { @Reference private DobbuService dobbuService; @Override public String demo() { return dobbuService.testDemo("李佳春"); } }
ConsumerService
package com.cowain.service; /** * @Author: fxw * @Date: 2022/1/10 21:46 */ public interface ConsumerService { public String demo(); }
ConsumerApplication
package com.cowain; import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @Author: fxw * @Date: 2022/1/10 21:44 */ @EnableDubbo @SpringBootApplication public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class,args); } }
apploication.xml
dubbo: application: name: dubbo-consumer registry: address: zookeeper://192.168.153.129:2181
测试:
zookeeper:
总结
代码虽然简单,但是得明白dubbo的执行流程,此篇博客仅供学习使用,如有不足,请多多指教。