1.dubbo介绍
Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能 、 轻量级的开源 Java RPC框架 它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现 。
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的 RPC远程服务调用方案、 服务治理方案。
服务提供者 (Provider):暴露服务的服务提供方 服务提供者在启动时,向注册中心注
册自己提供的服务。
服务消费者 (Consumer):调用远程服务的服务消费方 服务消费者在启动时,向注册
中心订阅自己所需的服务 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一
台提供者进行调用,如果调用失败,再选另一台调用。
注册中心(Registry)注册中心返回服务提供者地址列表给消费者,如果有变更,注册
中心将基于长连接推送变更数据给消费者。
监控中心(Monitor)服务消费者和提供者,在内存中累计调用次数和调用时间,定时
每分钟发送一次统计数据到监控中心。
本文是脚手架系列的第一篇,有兴趣的同学可以进入导航页进行学习:
2.项目骨架搭建
父项目:dubboparent
<module>dubbo-api</module>
<module>dubbo-provider</module>
<module>dubbo-consumer</module>
2.1 创建父项目
接下来就一直往下点就可
2.2 dubbo子项目的创建
后面创建子项目的过程和父项目相同
分别创建dubbo-api,dubbo-provider,dubbo-consumer
创建完成后删除.mvn,HELP.md,mvnw,mvnd.cmd等文件,结构如下:
展开如下:
到这里为止,项目的架构也就出来了。
3、模块关联
完成了上面的步骤,各个模块还是相互独立。此时需要修改各个模块的pom.xml文件让他们关联起来。
3.1父项目dubboparent修改pom文件
1.将父项目 packaging改为 pom
如果没有将packing 指定为pom ,那么子模块之间将无法正常的进行依赖传递。
我们执行的maven命令的时候将首先对父项目执行,而后当 父项目 的packing 类型为 pom 时,将对所有的子模块执行同样的命令,否则将无法执行同样的命令,那么依赖的传递将无法由maven 编译或者打包命令 得以执行。
总结:Maven-多模块项目的聚合,父项目必须将packing 指定 为 pom
2.添加总父项目为 springboot
3.添加父项目刚创建的各个模块
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dubboscaffold</groupId>
<artifactId>dubboparent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubboparent</name>
<description>Demo project for Spring Boot</description>
<!--父项目必须将packaging设置为pom-->
<packaging>pom</packaging>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
</properties>
<!--总父项目为spring-boot-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
</parent>
<!--添加子模块-->
<modules>
<module>dubbo-api</module>
<module>dubbo-provider</module>
<module>dubbo-consumer</module>
</modules>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.5.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
3.2子项目dubbo-api修改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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dubboscaffold</groupId>
<artifactId>dubbo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-api</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
</properties>
<!--给子模块添加父项目,需要给出父项目pom文件路径-->
<parent>
<groupId>com.dubboscaffold</groupId>
<artifactId>dubboparent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
3.3子项目dubbo-provider修改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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dubboscaffold</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
</properties>
<!--给子模块添加父项目,需要给出父项目pom文件路径-->
<parent>
<groupId>com.dubboscaffold</groupId>
<artifactId>dubboparent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<dependencies>
<!--添加api依赖-->
<dependency>
<groupId>com.dubboscaffold</groupId>
<artifactId>dubbo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- Dubbo Spring Cloud Starter -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<!-- 实现对 Dubbo 的自动化配置 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.4.1</version>
</dependency>
<!-- 使用 Nacos 作为注册中心 -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>2.7.4.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
3.4子项目dubbo-consumer修改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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dubboscaffold</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
</properties>
<!--给子模块添加父项目,需要给出父项目pom文件路径-->
<parent>
<groupId>com.dubboscaffold</groupId>
<artifactId>dubboparent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<dependencies>
<!--添加api依赖-->
<dependency>
<groupId>com.dubboscaffold</groupId>
<artifactId>dubbo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.5.5</version>
</dependency>
<!-- 引入 Spring Boot 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 实现对 Dubbo 的自动化配置 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.4.1</version>
</dependency>
<!-- 使用 Nacos 作为注册中心 -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>2.7.4.1</version>
</dependency>
</dependencies>
</project>
3.5刷新maven看是否有报错
如果有报错看看是不是直接复制进去的,因为是直接从网上拷贝过来粘贴在pom.xml中的可能格式会有冲突
3.6在父项目下编译整个项目
当控制台出现如上图所示的结果,证明整个项目关联成功。
4、dubbo接入nacos的简单应用
建立服务提供者,消费者,消费者通过nacos调用服务。
需要搭建提前将nacos环境搭好。快速搭建可以参考下文链接:
4.1 dubbo-api创建接口
application.yml
spring:
application:
name: dubbo-api
TestService
package com.dubboscaffold.dubboapi.api;
public interface TestService {
String sayhello();
}
4.2 dubbo-provider创建服务
application.yml
spring:
application:
name: dubbo-provider
server:
port: 8081
# dubbo 配置项,对应 DubboConfigurationProperties 配置类
dubbo:
# Dubbo 应用配置
application:
name: user-service-provider # 应用名
# Dubbo 注册中心配
registry:
address: nacos://192.168.160.128:8848 # 注册中心地址
# Dubbo 服务提供者协议配置
protocol:
port: -1 # 协议端口。使用 -1 表示随机端口。
name: dubbo # 使用 `dubbo://` 协议。更多协议,可见 http://dubbo.apache.org/zh-cn/docs/user/references/protocol/introduction.html 文档
# Dubbo 服务提供者配置
provider:
timeout: 1000 # 【重要】远程服务调用超时时间,单位:毫秒。默认为 1000 毫秒
TestService:
version: 1.0.0
# 配置扫描 Dubbo 自定义的 @Service 注解,暴露成 Dubbo 服务提供者
scan:
base-packages: com.dubboscaffold.dubboprovider.service.impl
TestServiceImpl
package com.dubboscaffold.dubboprovider.service.impl;
import com.dubboscaffold.dubboapi.api.TestService;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
@Component
@Service(version = "${dubbo.provider.TestService.version}")
public class TestServiceImpl implements TestService {
@Override
public String sayhello() {
return "Hello Dubbo!!!";
}
}
4.3dubbo-consumer创建消费者
application.yml
spring:
application:
name: dubbo-consumer
server:
port: 8082
# dubbo 配置项,对应 DubboConfigurationProperties 配置类
dubbo:
# Dubbo 应用配置
application:
name: user-service-consumer # 应用名
# Dubbo 注册中心配置
registry:
address: nacos://192.168.160.128:8848 # 注册中心地址
# Dubbo 消费者配置
consumer:
timeout: 1000 # 【重要】远程服务调用超时时间,单位:毫秒。默认为 1000 毫秒
TestService:
version: 1.0.0
TestController
package com.dubboscaffold.dubboconsumer.controller;
import com.dubboscaffold.dubboapi.api.TestService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping("/test")
public class TestController {
@Reference(version = "${dubbo.consumer.TestService.version}")
private TestService testService;
@RequestMapping("/hello")
@ResponseBody
public String sayHello(){
return testService.sayhello();
}
}
4.4 项目启动
启动顺序:
1、dubbo-provider
2、dubbo-consumer
启动成功后可以在nacos管理页面(http://127.0.0.1:8848/nacos)进行查看,服务和消费者是否已经在上面可以查询到:
浏览器调用http://127.0.0.1:8082/test/hello
这样项目就成功运行了。
这样一个最基础的分布式dubbo+nacos脚手架就搭好了,后续还会继续整合其他组件。