首先安装注册中心,这里我们选用zookeeper,直接去Apache官网下载,下载地址 Apache ZooKeeper™ Releases
安装后进入bin目录,启动zkServer.cmd即可,如果是在linux上,就启动zkServer.sh即可,默认端口为2181
首先,在空白目录下,打开控制台,输入(需要已安装maven):
git clone https://github.com/apache/incubator-dubbo-admin.git 复制代码
接下来进入incubator-dubbo-admin,在目录下执行(需要已安装node.js):
mvn clean package 复制代码
因为采用了前后端分离的项目构建方式,如果这里没有安装node.js,会在npm下载依赖的时候报错
如果刚才打包失败,报错如下异常,或其他类似的与SLF4J有关的异常:
这是由于日志版本太低或日志缺失导致的bug,进入incubator-dubbo-admin/dubbo-admin-server/pom.xml中,在<dependencies></dependencies>标签下添加以下依赖
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>RELEASE</version> </dependency> 复制代码
然后返回上一级目录重新进行打包,打包中如果报其他异常可以无视,只要最后提示BUILD SUCCESS即可,打包完成后进入incubator-dubbo-admin/dubbo-admin-distribution/target目录下,执行以下命令运行jar包:
java -jar dubbo-admin-0.1.jar 复制代码
接着访问 http://localhost:8080 ,出现类似下面界面就说明我们的管理控制台搭建成功:
接下来我们就要搭建一个简易的Dubbo项目,首先我们创建一个空目录(注意,不要新建项目),名字任意,这里我就用创建一个dubbo-annotation-demo文件夹,然后用idea打开(eclipse或sts操作类似)
接下来我们创建公用接口模块,右键项目,创建module:
我们选择创建Maven项目,名字任意,但是最好按照规范,这里:
然后打开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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.akira</groupId> <artifactId>dubbo-service-user-api</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> </project> 复制代码
然后,进入源码目录src/main/java,创建包com.akira.dubbo.service.user.api,在包下创建我们的接口类,这里我们就采用dubbo官方的示例:
public interface UserService { String sayHi(); } 复制代码
按照刚才的步骤创建Module,不过这里我们选择创建spring-boot项目,名字任意,而且不用添加任何依赖,我们一会儿手动添加:
然后我们打开pom.xml,添加以下依赖:
<!-- spring-boot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- 系统健康监控 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- dubbo in spring-boot --> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.0</version> </dependency> <!-- 我们自己的接口 --> <dependency> <groupId>com.akira</groupId> <artifactId>dubbo-service-user-api</artifactId> <version>${project.version}</version> </dependency> 复制代码
如果我们自己的接口依赖报红,就进入dubbo-service-user-api目录下(接口模块目录),打开cmd,执行mvn clean install即可
然后我们进入resources目录下,修改配置文件:
spring: application: name: dubbo-service-user-provider # 因为8080端口已经被管理台占用,所以要换一个端口 server: port: 8180 # 自定义配置,接口的版本号 user: service: version: 1.0.0 dubbo: scan: basePackages: com.akira.dubbo.service.user.provider.api application: id: dubbo-service-user-provider name: dubbo-service-user-provider qos-port: 22222 qos-enable: true protocol: id: dubbo name: dubbo port: 12345 status: server # 与注册中心保持一致 registry: id: zookeeper address: zookeeper://127.0.0.1:2181 复制代码
接着我们进入源码目录下,创建api.impl包,在包下创建UserServiceImpl我们接口的实现类:
@Service(version = "${user.service.version}") public class UserServiceImpl implements UserService { @Override public String sayHi() { return "Hello Dubbo"; } } 复制代码
注意,这个@Service注解是com.alibaba.dubbo.config.annotation.Service包下的,千万别导错了
最后,我们在DubboServiceUserProviderApplication中的main方法最后添加一行代码,用于启动Provider,要注意两点:
@SpringBootApplication public class DubboServiceUserProviderApplication { public static void main(String[] args) { SpringApplication.run(DubboServiceUserProviderApplication.class, args); Main.main(args); } } 复制代码
然后启动该应用模块,我们的服务提供者就完成了
和创建provider的步骤大致相同,这里我就不再赘述了,模块名字我这里使用dubbo-serivce-user-consumer,需要注意的是,在pom.xml文件中的plugin中,需要配置入口类,如下:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.akira.dubbo.service.user.consumer.DubboServiceUserConsumerApplication</mainClass> </configuration> </plugin> </plugins> </build> 复制代码
同时,因为我们服务消费者是一个web应用,所以需要把spring-boot-start的依赖改为spring-boot-starter-web,同时要添加dubbo和api的依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- dubbo --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.0</version> </dependency> <!-- self-api --> <dependency> <groupId>com.akira</groupId> <artifactId>dubbo-service-user-api</artifactId> <version>${project.version}</version> </dependency> 复制代码
接着修改配置文件,这里我采用的yml配置方式,配置内容和provider基本一致,需要注意两点:
具体配置如下:
spring: application: name: dubbo-service-user-consumer server: port: 8077 user: service: version: 1.0.0 dubbo: scan: basePackages: com.akira.dubbo.service.user.consumer.controller application: id: dubbo-service-user-consumer name: dubbo-service-user-consumer protocol: id: dubbo name: dubbo port: 12345 registry: id: zookeeper address: zookeeper://127.0.0.1:2181 复制代码
然后回到源码目录下,创建controller包,添加UserController类:
@RestController public class UserController { @Reference(version = "${user.service.version}") private UserService userService; @GetMapping("hi") public String sayHi() { return userService.sayHi(); } } 复制代码
注意,这里@Reference是dubbo包下的注解,可以把它当成@Autowired注解来使用 最后启动该应用模块,就完成了服务消费者的构建,注意启动顺序是:
这样,我们的样例就完成了