1.概述
Dubbo是Alibaba开源的分布式服务框架,现已捐给apache。它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。
官网地址:http://dubbo.apache.org/en-us/
后台管理地址(dubbo-admin):https://github.com/apache/incubator-dubbo-ops
2.项目构建
开发环境主要涉及以下几个方面:
Spring-boot 2.1.1
JDK 8
Dubbo
Zookeeper
2.1首先安装zookeeper
window版本一般只需解压即可,正式使用建议使用zookeeper集群,一般最少三台虚拟机。关于zookeeper集群本篇暂略。
解压之后,修改conf/下的配置文件,zoo.cfg。
修改data目录与日志目录:
dataDir=/data/zookeeper-3.4.9/data
logDir= /data/zookeeper-3.4.9/log
window下执行zkServer.cmd启动:
启动后使用ZooInspector工具连接zkserver可以看到下图有一个默认的根接节点:
image2.2 搭建springboot工程:
可以使用ide或者sts工具自动创建springboot工程,过程不细说,
服务提供者工程目录:
image服务消费者:
image见pom.xml文件:
<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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zhou.test</groupId>
<artifactId>dubbo-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-server</name>
<description>dubbo-server</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- dubbo -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<!-- zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.8</version>
</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>
添加接口:
import com.zhou.test.entity.User;
public interface UserService {
User saveUser(User user);
}
实现类:
public class UserServiceImpl implements UserService {
@Override
public User saveUser(User user) {
user.setId("2");
System.out.println(user.toString());
return user;
}
}
配置文件:
server.port=8188
## Dubbo 服务提供者配置
dubbo.application.name=provider
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.scan.basePackages=com.zhou.test.service
启动类provider:
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DubboServerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboServerApplication.class, args);
}
}
启动类consumer 注意消费者这边多一个@EnableDubboConfiguration:
@SpringBootApplication
@EnableDubboConfiguration
public class DubboClientApplication {
public static void main(String[] args) {
SpringApplication.run(DubboClientApplication.class, args);
}
}
启动成功后,zookeeper上会有注册成功的provider与consumer,如图:
image服务消费者也一样,调用方代码:
@RequestMapping("/user")
public class UserController {
@Reference(check=false)//启动消费者不检查服务者是否存在
private UserService userService;
@GetMapping("/save")
public Object saveUser() {
User u =new User();
u.setName("张三");
u.setSex("男");
return userService.saveUser(u);
}
}
测试结果:
image3.踩过的坑
由于dubbo升级较多,低版本的配置与高版本的配置差别很大,当然配置文件形式(xml格式)已逐渐被注解取代,这样工程简洁,代码也规范。这里列一下,我踩的一些坑。
使用io.dubbo.springboot搭建的工程,配置文件有些不同:
spring.dubbo.application.name=provider
spring.dubbo.registry.address=zookeeper://127.0.01:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
spring.dubbo.scan=com.bordrin.service
使用此版本会使consumer端@Reference 一直为null,从而无法获取注册中心的服务信息。
建议使用最新版:
官方案例地址:
https://github.com/apache/incubator-dubbo-spring-boot-project
网友评论