这里直接引用Apache Dubbo官网的介绍,链接: apache dubbo
Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。
简单来说,dubbo是一个rpc框架,主要用于微服务架构下,帮助管理不同模块之前的方法调用。
在官方文档中,有如下的dubbo结构图:
dubbo由注册中心(Registry)、服务提供者(Provider)、服务消费者(Consumer)、监控(Monitor)组成。
本次使用的框架版本如下:
Springboot :2.4.1
Zookeeper : 3.8.0
Dubbo : 3.0.2.1
首先在idea中创建maven项目,创建完成后,删除src目录,创建dubbo-springboot-api、dubbo-springboot-provider、dubbo-springboot-consumer三个子模块。完成后项目整体目录如下:
其中服务接口主要起到解耦的作用,降低服务提供者和服务消费者的依赖关系。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>2.4.1version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-bomartifactId>
<version>3.0.2.1version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
<version>3.0.2.1version>
dependency>
dependencies>
dependencyManagement>
首先在dubbo-springboot-api模块中定义服务接口:
public interface IUserService {
User getUserInfo(int id);
}
User实体类:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private static final long serialVersionUID = -1L;
String name;
Integer age;
}
@Data 、@AllArgsConstructor、@NoArgsConstructor注解需要添加lombok依赖,需要在dubbo-springboot-api模块下的pom.xml中添加依赖:
<dependencies>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.24version>
dependency>
dependencies>
在dubbo-springboot-provider模块下的pom.xml文件中引入依赖:
<dependencies>
<dependency>
<groupId>com.juffygroupId>
<artifactId>dubbo-springboot-apiartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-registry-zookeeperartifactId>
dependency>
dependencies>
在dubbo-springboot-provider模块下,创建UserServiceImpl.java:
@DubboService(version = "1.0.0")
@Service
@Slf4j
public class UserServiceImpl implements IUserService {
@Override
public User getUserInfo(int id) {
return new User("Tom", 23);
}
}
在dubbo-springboot-provider模块下,创建DubboProvider.java,作为项目启动类:
@SpringBootApplication
@EnableDubbo
public class DubboProvider {
public static void main(String[] args) {
SpringApplication.run(DubboProvider.class);
}
}
在dubbo-springboot-provider模块下,添加springboot项目配置文件:
server:
port: 8080
spring:
application:
name: dubbo-springboot-provider
dubbo:
application:
name: dubbo-springboot-provider
registry:
address: zookeeper://ip:port
timeout: 2000
protocol:
name: dubbo
port: 20890
# 扫描 @DubboService 注解
scan:
base-packages: com.juffy.dubboprovider.service.impl
在dubbo-springboot-consumer模块下的pom.xml文件中引入依赖:
<dependencies>
<dependency>
<groupId>com.juffygroupId>
<artifactId>dubbo-springboot-apiartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-registry-zookeeperartifactId>
dependency>
dependencies>
在dubbo-springboot-consumer模块下,创建controller类、springboot启动类:
@RestController
@Slf4j
@RequestMapping("/consumer")
public class UserController {
@DubboReference(version = "1.0.0",protocol = "dubbo", loadbalance = "random")
private IUserService userService;
@RequestMapping("/user/{id}")
public User getUser(@PathVariable("id") int id) {
User user = userService.getUserInfo(id);
log.info("response from provider: {}", user);
return user;
}
}
@DubboReference 表示需要发起远程调用。
@SpringBootApplication
@EnableDubbo
public class DubboConsumer {
public static void main(String[] args) {
SpringApplication.run(DubboConsumer.class);
}
}
启动dubbo-springboot-provider、dubbo-springboot-consumer。
启动成功后,在浏览器中输入http://localhost:8091/consumer/user/5
可以看到,不同项目的方法之前通过dubbo实现调用。
我来看看服务是如何在注册中心保存的。
启动服务提供者和消费者后,会来zookeeper上生成一个/dubbo目录,该目录保存已注册的服务名称:
可以看到com.juffy.dubboapi.IUserService就是我刚刚注册的接口。
进入com.juffy.dubboapi.IUserService目录下:
每个服务的目录下有configurators、consumers、providers和routers。
providers记录服务的提供者信息。
consumers记录服务的消费者信息。
routers记录消费者路由策略URL元数据信息。
configurators记录服务者动态配置URL元数据信息。