4. 定义服务接口
服务接口 Dubbo 中沟通消费端和服务端的桥梁。
在 dubbo-spring-boot-demo-interface 模块的 org.apache.dubbo.samples.api 下建立 DemoService 接口,定义如下:
package org.apache.dubbo.springboot.demo; public interface DemoService { String sayHello(String name); }
在 DemoService 中,定义了 sayHello 这个方法。后续服务端发布的服务,消费端订阅的服务都是围绕着 DemoService 接口展开的。
5. 定义服务端的实现
定义了服务接口之后,可以在服务端这一侧定义对应的实现,这部分的实现相对于消费端来说是远端的实现,本地没有相关的信息。
在dubbo-spring-boot-demo-provider 模块的 org.apache.dubbo.samples.provider 下建立 DemoServiceImpl 类,定义如下:
package org.apache.dubbo.springboot.demo.provider; import org.apache.dubbo.config.annotation.DubboService; import org.apache.dubbo.springboot.demo.DemoService; @DubboService public class DemoServiceImpl implements DemoService { @Override public String sayHello(String name) { return "Hello " + name; } }
在 DemoServiceImpl 中,实现了 DemoService 接口,对于 sayHello 方法返回 Hello name。
注:在DemoServiceImpl 类中添加了 @DubboService 注解,通过这个配置可以基于 Spring Boot 去发布 Dubbo 服务。
6. 配置服务端 Yaml 配置文件
从本步骤开始至第 7 步,将会通过 Spring Boot 的方式配置 Dubbo 的一些基础信息。
首先,我们先创建服务端的配置文件。
在 dubbo-spring-boot-demo-provider 模块的 resources 资源文件夹下建立 application.yml 文件,定义如下:
dubbo: application: name: dubbo-springboot-demo-provider protocol: name: dubbo port: -1 registry: address: zookeeper://${zookeeper.address:127.0.0.1}:2181
在这个配置文件中,定义了 Dubbo 的应用名、Dubbo 协议信息、Dubbo 使用的注册中心地址。
7. 配置消费端 Yaml 配置文件
同样的,我们需要创建消费端的配置文件。
在 dubbo-spring-boot-demo-consumer 模块的 resources 资源文件夹下建立 application.yml 文件,定义如下:
dubbo: application: name: dubbo-springboot-demo-consumer protocol: name: dubbo port: -1 registry: address: zookeeper://${zookeeper.address:127.0.0.1}:2181
在这个配置文件中,定义了 Dubbo 的应用名、Dubbo 协议信息、Dubbo 使用的注册中心地址。
8. 基于 Spring 配置服务端启动类
除了配置 Yaml 配置文件之外,我们还需要创建基于 Spring Boot 的启动类。
首先,我们先创建服务端的启动类。
在这个启动类中,配置了一个 ProviderApplication 去读取我们前面第 6 步中定义的 application.yml 配置文件并启动应用。
9. 基于 Spring 配置消费端启动类
同样的,我们需要创建消费端的启动类。
在 dubbo-spring-boot-demo-consumer 模块的 org.apache.dubbo.springboot.demo.consumer 下建立 Application 类,定义如下:
package org.apache.dubbo.springboot.demo.consumer; import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @EnableDubbo public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }
在这个启动类中,配置了一个 ConsumerApplication 去读取我们前面第 7 步中定义的 application.yml 配置文件并启动应用。
10. 配置消费端请求任务
除了配置消费端的启动类,我们在 Spring Boot 模式下还可以基于 CommandLineRunner去创建
在 dubbo-spring-boot-demo-consumer 模块的 org.apache.dubbo.springboot.demo.consumer 下建立 Task 类,定义如下:
package org.apache.dubbo.springboot.demo.consumer; import java.util.Date; import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.springboot.demo.DemoService; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; @Component public class Task implements CommandLineRunner { @DubboReference private DemoService demoService; @Override public void run(String... args) throws Exception { String result = demoService.sayHello("world"); System.out.println("Receive result ======> " + result); new Thread(()-> { while (true) { try { Thread.sleep(1000); System.out.println(new Date() + " Receive result ======> " + demoService.sayHello("world")); } catch (InterruptedException e) { e.printStackTrace(); Thread.currentThread().interrupt(); } } }).start(); } }
在 Task 类中,通过@DubboReference 从 Dubbo 获取了一个 RPC 订阅,这个 demoService 可以像本地调用一样直接调用。在 run方法中创建了一个线程进行调用。
11. 启动应用
截止第 10 步,代码就已经开发完成了,本小节将启动整个项目并进行验证。
首先是启动 org.apache.dubbo.samples.provider.Application ,等待一会出现如下图所示的日志(Current Spring Boot Application is await)即代表服务提供者启动完毕,标志着该服务提供者可以对外提供服务了。
[Dubbo] Current Spring Boot Application is await...
然后是启动org.apache.dubbo.samples.client.Application ,等待一会出现如下图所示的日志(Hello world )即代表服务消费端启动完毕并调用到服务端成功获取结果。
Receive result ======> Hello world
结束
到此,Dubbo快速入门 —— 基于 Spring Boot Starter 开发微服务应用
就已经结束了,下面来看看 Dubbo相关的学习内容。