概述
开发环境
- JDK8
- Apache Maven 3.8.1
- spring-boot 2.5.3
- dubbo-spring-boot 2.7.13
- apache-zookeeper-3.7.0
什么是dubbo
Apache Dubbo 是一款高性能、轻量级的开源微服务开发框架,它提供了 RPC通信 与微服务治理 两大关键能力。
dubbo的六大核心能力
提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。
置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。
支持多种注册中心服务,服务实例上下线实时感知。
遵循微内核+插件的设计原则,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现。
内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能。
提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。
概念和架构
实现服务发现的方式有很多种,Dubbo 提供的是一种 Client-Based 的服务发现机制,通常还需要部署额外的第三方注册中心组件来协调服务发现过程,如常用的 Nacos、Consul、Zookeeper 等,Dubbo 自身也提供了对多种注册中心组件的对接,用户可以灵活选择。
搭建zookeeper和dubbo-admin环境
1、下载
去官网下载zookeeper 和dubbo-admin,然后解压。dubbo-admin只是一个监控dubbo服务的平台,不是必须的。
2、修改zookeeper的配置文件。
拷贝zookeeper目录下的conf文件夹下的zoo_sample.cfg,取名zoo.cfg,打开zoo.cfg文件并修改。 zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
#dataDir=/tmp/zookeeper
dataDir=C:/app/apache-zookeeper-3.7.0-bin/mylog
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
## Metrics Providers
#
# https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true
#解决zookeeper启动占用了8080端口
admin.serverPort=8888
3、执行命令
命令行窗口以管理员身份执行zookeeper安装目录下的bin文件夹中的命令先后执行zkServer.cmd和zkCli.cmd,zkServer.cmd打开的窗口不要关闭,其是整个zk服务。

4、打包dubbo-admin并运行
解压dubbo-admin,在dubbo-admin解压目录下打开命令行窗口执行,然后默默等待执行完毕。
mvn clean -U -Dmaven.test.skip=true package 
打包完毕以后,我们找到target目录下的jar包,命令行窗口下执行java -jar jar包全名 ,即可运行dubbo-admin服务了,访问
http://localhost:8080 用户名和密码:root root


在dubbo-admin-server目录下可以查看到关于zookeeper的配置以及默认登录账号密码的配置。 
5、SpringBoot+Zookeeper+Dubbo整合
通过构建一个买票服务来演示,示例工程中对于RPC接口没有单独打成jar包引用,而是在consumer模块和provider模块各写了一份。
新建工程
在idea中新建一个Empty Project 
建立生产者和消费者模块
在空工程下分别建立spring boot工程consumer模块和provider模块,同时删除模块下多余的文件。 
consumer模块文件新建和修改
按照如图所示结构建立 
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
<relativePath/>
</parent>
<groupId>com.tgy</groupId>
<artifactId>consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.13</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.7.0</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.properties
#当前应用的名字
dubbo.application.name=my-consumer
#当前应用的端口
server.port=9092
#注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
TicketService.java
package com.tgy.service;
public interface TicketService {
String getTicket();
}
UserService .java
package com.tgy.service;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@DubboReference
TicketService ticketService;
public String buyTicket(){
return ticketService.getTicket();
}
}
TicketController.java
package com.tgy.controller;
import com.tgy.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("ticket")
public class TicketController {
@Autowired
UserService userService;
@RequestMapping("buy")
@ResponseBody
public String buy(){
String ticket = userService.buyTicket();
return ticket;
}
}
provider模块文件和修改
如下图所示 
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
<relativePath/>
</parent>
<groupId>com.tgy</groupId>
<artifactId>provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.13</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.7.0</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.properties
#当前应用的名字
dubbo.application.name=my-provider
#当前应用的端口
server.port=8092
#注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#扫描指定包下的服务
dubbo.scan.base-packages=com.tgy.service
TicketService.java
package com.tgy.service;
public interface TicketService {
String getTicket();
}
TicketServiceImpl.java
package com.tgy.service;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
@Service
@Component
public class TicketServiceImpl implements TicketService {
@Override
public String getTicket() {
return "在12306网站购买了10张票";
}
}
访问
在zookeeper、dubbo-admin都已启动的情况下,先后启动provider模块和consumer模块,访问
http://localhost:9092/ticket/buy
即可查看结果。  同时在dubbo-admin我们可以看到注册的provider服务。

参考
|