赞
踩
目录
本文对接上一篇文章《最简单的Dubbo案例之一:dubbo实现服务提供者+消费者,无zookeeper方式点对点直连》,这是第二篇。
本文在依旧是提供最简单的dubbo项目,抛弃任何多余的技术栈,只单纯的演示基于dubbo实现服务提供者和消费者的项目如何开发。
本文使用的技术栈包括 springboot + dubbo ,没有zookeeper,采用的点对点直连方式进行服务调用。
本项目的结构入下图
可以看到本项目名为 dubbo2,项目中有两个模块 SayProvider和SayConsumer。
dubbo2是parent项目
SayProvider和SayConsumer是两个子项目。
dubbo2只是提供了两个模块的通用maven依赖的管理,并没有其他的功能。
SayProvider是服务提供者。
SayConsumer是服务消费者。
SayProvider提供了一个方法 String sayHi(String uname), SayConsumer调用该方法,传递进去字符串的用户姓名,将返回 Hello,uname 这样的字符串。
功能就是这么简单,咋地!我就是为了排除任何复杂业务逻辑对 dubbo 理解的影响。
该项目啥都没有,就一个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">
- <modelVersion>4.0.0</modelVersion>
-
- <groupId>com.pingbu</groupId>
- <artifactId>dubbo2</artifactId>
- <version>1.0.0</version>
- <packaging>pom</packaging>
-
- <properties>
- <maven.compiler.source>8</maven.compiler.source>
- <maven.compiler.target>8</maven.compiler.target>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
- <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
- </properties>
-
- <modules>
- <module>SayProvider</module>
- <module>SayConsumer</module>
- </modules>
-
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.1.7.RELEASE</version>
- </parent>
-
- <dependencies>
-
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.13</version>
- <scope>test</scope>
- </dependency>
-
- <dependency>
- <groupId>org.apache.dubbo</groupId>
- <artifactId>dubbo-spring-boot-starter</artifactId>
- <version>3.0.3</version>
- </dependency>
-
- <dependency>
- <groupId>com.101tec</groupId>
- <artifactId>zkclient</artifactId>
- <version>0.11</version>
- </dependency>
-
- </dependencies>
-
- </project>
没啥说的,就是引入了 dubbo + springboot 的通用依赖。
这个项目是 服务提供者,它提供了一个 String sayHi(String uname) 的方法,功能就是传入一个用户姓名的字符串,返回字符串为 hello,uname 。
这个项目继承自 dubbo2 项目。
代码结构如下图
可以看到就几个文件:
pom.xml文件: 不解释,maven 配置文件
application.yml 文件: 不解释
AppMain 类文件: springboot的启动文件,不解释
SayProvider 接口文件:是服务接口
SayProviderImpl实现类文件:是服务功能的实现
接下来一个个捋过去。
直接上代码
- <?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>dubbo2</artifactId>
- <groupId>com.pingbu</groupId>
- <version>1.0.0</version>
- </parent>
- <modelVersion>4.0.0</modelVersion>
-
- <artifactId>SayProvider</artifactId>
-
- <properties>
- <maven.compiler.source>8</maven.compiler.source>
- <maven.compiler.target>8</maven.compiler.target>
- </properties>
-
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter</artifactId>
- </dependency>
- </dependencies>
-
- </project>
这个文件确实没啥可解释的
- dubbo:
- application:
- name: sayProvider
- owner: pingbu
- qos:
- port: 55555
- enable: true
- accept:
- foreign:
- ip: false
- monitor:
- protocol: registry
- registry:
- address: N/A
- protocol:
- name: dubbo
- port: 20880
-
配置了dubbo相关的参数,这些参数在一般的文档都是配置在 xml里面,我将其改造到了springboot的application.yml 文件中。
dubbo.application: 这个节点下配置的是服务名称之类的,必须配置,否则会报错,且必须唯一,也就是在注册中心这个名字得唯一。不过这个项目是点对点直连的,就无所谓了。
dubbo.registry.address: 这是配置 dubbo的注册中心地址,N/A 表示不配置注册中心。因为我要实现点对点直连,因此不需要注册中心。
dubbo.protocol: 定义的是dubbo的协议。
- package com.pingbu.dubbo2;
-
- import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
-
- @SpringBootApplication
- @EnableDubbo
- public class AppMain {
-
- public static void main(String[] args) {
- SpringApplication.run(AppMain.class, args);
- }
-
- }
可以看到,增加了 @EnableDubbo ,这个千万别忘了,否则 dubbo 不生效的。
- package com.pingbu.dubbo2.provider;
-
- public interface SayService {
-
- String sayHi(String uname);
- }
简单到爆,无法解释。
- package com.pingbu.dubbo2.provider;
-
- import org.apache.dubbo.config.annotation.DubboService;
- import java.text.SimpleDateFormat;
- import java.util.Date;
-
-
- @DubboService(version = "1.0.0",timeout = 3000)
- public class SayServiceImpl implements SayService {
-
- @Override
- public String sayHi(String uname){
- Date dt = new Date();
- SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss");
- String time1 = sdf.format(dt);
- return time1+" -===- Hello , "+uname;
- }
-
- }
看到这里定义了注 解 @DubboService ,这个是最重要的,在上一篇文章中我采用的是 xml 配置文件方式,也就是基于 Spring的配置文件实现的 dubbo 服务注册。而这个项目我采用的是注解方式。
注解很简单,没啥需要解释的。
当然,这个 DubboService 支持的参数其实是很复杂的,不过我这篇文章力求最简化,因此不过更多解释。有兴趣的朋友完全可以百度到所有的资料。
具体的接口实现代码,更不解释了。
哦,对了,这个 @DubboService 注解是 dubbo 2.6.0 版本开始出现的,以前的版本就叫 @Service,估计朋友们看dubbo的文章很多都是用的这个注解名。新版本的考虑这个命名与Spring的注解容易造成混淆,就改了名字。 这个修改挺好,是的,很好很好!!
直接执行 mvn clean spring-boot:run 即可启动。
这个项目是服务消费者。
项目结构如下:
也是简单到没有人性。
提供了5个文件:
pom.xml: 不解释
application.yml: 不解释
AppMain类文件: 不解释
SayService接口文件: 对应 SayProvider项目中的 SayService接口文件。注意,这个文件的命名必须一致,包括包名、类名、方法名。
SayController类文件: 这个类写出来就是为了用于测试的。
一个个的捋一下:
代码如下:
- <?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>dubbo2</artifactId>
- <groupId>com.pingbu</groupId>
- <version>1.0.0</version>
- </parent>
- <modelVersion>4.0.0</modelVersion>
-
- <artifactId>SayConsumer</artifactId>
-
- <properties>
- <maven.compiler.source>8</maven.compiler.source>
- <maven.compiler.target>8</maven.compiler.target>
- </properties>
-
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- </dependencies>
-
- </project>
由于要启动 web 应用,以方便测试,因此加入了 spring-boot-starter-web 的依赖,其实 dubbo 真的跟web 没关系,加入这个 依赖并不是 dubbo 的要求,而是为了开发调测和演示的方便。
- server:
- port: 8086
-
- dubbo:
- application:
- name: SayConsumer
- owner: pingbu
- qos:
- port: 55555
- enable: true
- accept:
- foreign:
- ip: false
- register:
- address: N/A
这个文件更没有什么需要解释的,比服务提供者的还简单。
- package com.pingbu.dubbo2;
-
- import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
-
- @SpringBootApplication
- @EnableDubbo
- public class AppMain {
-
- public static void main(String[] args) {
- SpringApplication.run(AppMain.class, args);
- }
-
- }
没啥解释的,就是多了一个 @EnableDubbo 注解。
- package com.pingbu.dubbo2.provider;
-
- public interface SayService {
- String sayHi(String uname);
- }
该文件与服务提供者对应的接口一样,包名一样、接口名一样,方法名一下。必须一样,必须一样。
代码如下:
- package com.pingbu.dubbo2.controller;
-
- import com.pingbu.dubbo2.provider.SayService;
- import org.apache.dubbo.config.annotation.DubboReference;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
-
- @RestController
- @RequestMapping(value = "/say")
- public class SayController {
-
- @DubboReference(version = "1.0.0", url="dubbo://127.0.0.1:20880")
- private SayService sayService;
-
- @GetMapping(value = "/hi")
- public String hi(){
-
- String res = sayService.sayHi("老牛!!!");
-
- return res ;
- }
-
-
- }
其他的就不解释了,值说说 @DubboReference注解。
@DubboReference 注解: 这个注解就是说,这里注入的是 dubbo 的服务接口。 url 指向的就是 点对点的服务提供者的 dubbo 地址,看这个地址,就能与 SayProvider项目的application.yml 中的配置对应上了。
项目启动语句: mvn clean spring-boot:run
启动后在浏览器输入地址 http://127.0.0.1:8086/say/hi
看到页面如下即可。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。