dubbo入门
什么是dubbo
Apache Dubbo™ 是一款高性能Java RPC框架。
dubbo在微服务架构中担任着注册/发现服务的角色,这里丢一张官网的流程图
其中有五个组件
- container:服务运行的容器
- provider:服务提供者
- registry:注册中心
- consumer:服务消费者
- monitor:监控中心
大致的流程是服务提供者将自己的服务注册到注册中心,消费者通过注册中心订阅提供者的地址,在注册中心拿到提供者的地址后,远程调用提供者的服务.
其中注册中心是必不可少的,所以我们需要先安装注册中心,dubbo支持多种注册中心,官方推荐zookeeper,也可以尝试一波阿里开源的nacos.
系统架构
spring-boot-dubbo-demo
|-- dubbo-service
|-- dubbo-consumer
|-- dubbo-provider
以上是系统的大致架构,其中spring-boot-dubbo-demo为父模块,dubbo-service模块写接口,dubbo-consumer为消费者,dubbo-provider为提供者.需要注意的是消费者和提供者都依赖于接口模块,但他们之间不相互依赖.
新建一个spring-boot工程,引入dubbo的依赖,因为注册中心为zookeeper,所以也需要引入zookeeper的依赖
<properties>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.4</version>
</dependency>
</dependencies>
</dependencyManagement>
service
新建一个dubbo-service的module,这里就写一个简单的hello接口
public interface HelloService {
String helloWorld();
}
服务提供者
- 新建一个dubbo-provider的module,pom文件如下:
<dependencies>
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.demo</groupId>
<artifactId>dubbo-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
</plugins>
</build>
- 新建一个java类,实现刚刚的HelloService接口
@Service
@Component
@Slf4j
public class HelloServiceImpl implements HelloService {
@Override
public String helloWorld() {
log.info("hello world");
return "hello world";
}
}
@Service注解是dubbo包的注解,并不是spring的注解
@Component,实测不加这个注解会注册不成功
- 创建spring-boot入口类
@SpringBootApplication
@EnableDubboConfiguration
public class ProviderApp {
public static void main(String[] args) {
SpringApplication.run(ProviderApp.class, args);
}
}
- 新建一个application.properties
## Dubbo 服务提供者配置
spring.dubbo.application.name=provider
spring.dubbo.server=true ##表示开启dubbo服务
spring.dubbo.registry.address=zookeeper://localhost:2181 ##注册中心地址
spring.dubbo.protocol.name=dubbo ##协议名称,默认dubbo
spring.dubbo.protocol.port=20883 ##有多个提供者时需要指定端口防止冲突,默认20881
spring.dubbo.scan=com.demo.provider.service
- 启动提供者,观察控制台,如果有zookeeper包打印的信息,表示注册成功,实在不放心可以查看zookeeper的节点有没有接口
服务消费者
- 新建dubbo-consumer的module,消费者所需的依赖于提供者相同
- 新建一个DemoService类
@Service
public class DemoService {
@Reference(check = false)
HelloService helloService;
public String hello(){
return helloService.helloWorld();
}
}
@Service为spring包下的注解
@Reference为dubbo包下的注解,其中check表示启动时是否检查提供者的存在,默认为true,此时若提供者不存在,消费者无法启动
- 新建一个HelloController类
@RestController
public class HelloController {
@Autowired
DemoService demoService;
@GetMapping("/hello")
public String hello() {
return demoService.hello();
}
}
4.新建一个入口函数
@SpringBootApplication
@EnableDubboConfiguration
public class ConsumerApp {
public static void main(String[] args) {
SpringApplication.run(ConsumerApp.class, args);
}
}
- application配置如下:
spring.dubbo.application.name=consumer
spring.dubbo.registry.address=zookeeper://localhost:2181
spring.dubbo.scan=com.demo.consumer.service
server.port=8081
- 启动消费者,访问localhost:8080/hello
参考
GitHub - alibaba/dubbo-spring-boot-starter: Dubbo Spring Boot Starter
dubbo官网