由于不方便截图,基本借用其他人的图,非商业用途,直接上代码
准备工作
分析:首先要有一个注册中心,用来注册与发现服务,这里我选择nacos
使用开发工具IDEA
需要联网的电脑,用来下载maven依赖
maven的setting配置文件可以使用下面的阿里源
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
开始建项目
建名称为ProviderDemo和ConsumerDemo两个项目,版本随便选,反正要把pom整个替换掉
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.luckysj</groupId>
<artifactId>ProviderDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>ProviderDemo</name>
<description>ProviderDemo</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.7.6</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>3.0.9</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.1.0</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
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.luckysj</groupId>
<artifactId>ConsumerDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>ConsumerDemo</name>
<description>ConsumerDemo</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.7.6</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>3.0.9</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.1.0</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
将application.properties文件改为application.yml文件
Provider的配置:
server:
port: 6666
dubbo:
application:
#设置应用的名称
name: dubbo-springboot-provider
qos-enable: true
qos-port: 23444
qos-accept-foreign-ip: false
#指定使用Dubbo协议,且端口设置为-1,表示随机分配可用端口
protocol:
name: dubbo
port: -1
registry:
#配置注册中心为Nacos
id: nacos-registry
address: nacos://ip:端口
username: 账户
password: 密码
parameters:
namespace: f74484c1-02d8-4322-a50c-630bc814fe54 #nacos命名空间
group: dubbo-demo #nacos分组
config-center:
timeout: 40000 #设置服务超时时间
Consumer的配置:
server:
port: 7777
dubbo:
application:
#设置应用的名称
name: dubbo-springboot-consumer
#qos监控服务是否启动
qos-enable: true
#qos监控服务端口
qos-port: 23456
qos-accept-foreign-ip: false
#指定使用Dubbo协议,且端口设置为-1,表示随机分配可用端口
protocol:
name: dubbo
port: -1
registry:
#配置注册中心为Nacos
id: nacos-registry
address: nacos://nacos服务的ip:nacos服务的端口
username: nacos账户
password: nacos密码
parameters:
namespace: f74484c1-02d8-4322-a50c-630bc814fe54 #nacos命名空间
group: dubbo-demo #nacos分组
config-center:
timeout: 40000 #设置服务超时时间
添加启动类注解
我们要使用Dubbo服务的话需要在服务启动类上编写@EnableDubbo注解(提供者项目和消费者项目都需要)
编写服务接口与服务实现类
我们在Provider项目中provider包下新建服务接口与实现类
PrintService接口内容如下
public interface PrintService {
public void print(String str);
}
PrintServiceImpl接口内容如下,我们通过@DubboService注解暴露该服务,
@DubboService
public class PrintServiceImpl implements PrintService {
@Override
public void print(String str) {
System.out.println("dubbo调用打印信息为" + str);
}
}
在服务消费方项目中也定义相同的接口
public interface PrintService {
public void print(String str);
}
特别注意这里调用者与提供者的服务接口需要有相同的包路径,否则无法找到对应服务,我们后续通过引入一个common项目来解决这个问题
在服务消费方项目编写一个测试接口,使用@DubboReference注解声明引用的服务
@RestController
@RequestMapping("/demo")
public class DemoController {
@DubboReference(check=false) //声明服务引用
private PrintService printService;
@GetMapping("/test")
public void testDubbo(String str){
System.out.println("consumer开始RPC调用provider服务");
printService.print(str);
}
}
如果接口有多个实现类,可在注解中标注version和group,来区分使用不同的实现类,但应尽量避免该问题产生
测试
访问Consumer接口,测试两项目之间的服务调用,可以看到我们ConsumerDemo项目通过Dubbo成功的调用了ProviderDemo项目
进阶-引入公共包概念
引入common项目
我们上面可以发现提供者和消费者的服务接口必须在相同的包路径下,十分的不优雅,故我们可以新建一个common项目,在这个项目中定义双方服务调用的接口,相当于定义了一种规范,两边都采用common中的服务接口,这样就不会因为包路径不同导致dubbo找不到对应服务
使用mvn命令打包该项目到本地(云)仓库中,在消费者和提供者项目中引入该项目
双方都使用common包内的服务接口,删除Provider和Consumer中的PrintService接口(不要删除实现类)
测试接口,运行正常,结束