本文旨在快速搭建一个 纯 dubbo 微服务 应用。

# 创建一个项目

  • consumer 表示一个消费者。
  • provider 标识一个服务提供者。
  • provider-api 表示对外提供服务的 api.

我们现实的开发中,往往是一个服务既充当服务提供者角色,又充当服务消费者的角色。所以,每个服务都会有一个两个模块, 1.provider ,服务的实现逻辑模块, 2.provider-api : 服务对外暴露的 api 模块。

# 引入依赖

在 父级 pom 中加入如下依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<properties>
<dubbo.version>3.0.3</dubbo.version>
</properties>

<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>

<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
</dependency>
</dependencies>

可以看到,我们使用的 dubbo3.x 版本。在这个版本中,开发者将 dubbo 的依赖进行拆分,所以,我们引入了 dubbodubbo-dependencies-zookper 这两个依赖。

# 创建服务提供者

# 设置 api 依赖

在服务提供者的具体实现模块中 ( provider/pom.xml ),加入 api 模块依赖

1
2
3
4
5
 <dependency>
<groupId>com.fxb</groupId>
<artifactId>provider-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>

# 定义 服务间的交互协议 (契约 / 规范)

其实就是定义服务间的 RPC 接口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 定义rpc的交互规范
*
* @author fangjiaxiaobai
* @date 2021-10-13 16:16
*/
public interface IProviderService {
/**
* say hello
*
* @return "hello dubbo"
*/
String sayHello();
}

# 实现服务提供者的业务逻辑

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 实现服务的具体逻辑
*
* @author fangjiaxiaobai
* @date 2021-10-13 16:00
*/
public class ProviderServiceImpl implements IProviderService {
@Override
public String sayHello() {
return "hello, dubbo!";
}
}

# 对外提供服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* 服务启动
*
* @author fangjiaxiaobai
* @date 2021-10-13 16:01
*/
public class ProviderApplication {

private static final String zookeeperHost = "127.0.0.1";

public static void main(String[] args) throws InterruptedException {
ServiceConfig<IProviderService> service = new ServiceConfig<>();
service.setApplication(new ApplicationConfig("first-dubbo-provider"));
service.setRegistry(new RegistryConfig("zookeeper://" + zookeeperHost + ":2181"));
service.setInterface(IProviderService.class);
service.setRef(new ProviderServiceImpl());
service.export();

System.out.println("dubbo service started");
new CountDownLatch(1).await();
}
}

# 创建服务消费者

# 引入 api 依赖

在服务消费者的 pom 文件中 ( comsumer/pom.xml ),添加如下 maven 依赖

1
2
3
4
5
<dependency>
<groupId>com.fxb</groupId>
<artifactId>provider-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>

# 消费逻辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

/**
* 服务消费者
*
* @author fangjiaxiaobai
* @date 2021-10-13 16:20
*/
public class ConsumerApplication {

private static final String zookeeperHost = "127.0.0.1";

public static void main(String[] args) {
ReferenceConfig<IProviderService> reference = new ReferenceConfig<>();
reference.setApplication(new ApplicationConfig("first-dubbo-consumer"));
reference.setRegistry(new RegistryConfig("zookeeper://" + zookeeperHost + ":2181"));
reference.setInterface(IProviderService.class);
IProviderService service = reference.get();
String message = service.sayHello();
System.out.println(message);
}
}

# 附录:搭建 zookeeper 注册中心

由于是单机演示,就简单的使用 单机zookeeper 就好了,

通过 https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz 下载 zookeeperjar 包,解压后,使用 zkServer.sh(Mac OS) 或者 zkServer.cmd(Windows平台) 启动就可以了。默认端口使用的是 2181 .

# 最后

希望和你一起遇见更好的自己