一、环境搭建
dubbo(读音[ˈdʌbəʊ])是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现;
1、搭建zooKeeper注册中心
dubbo 的服务注册是基于zooKeeper来实现的,所以需要搭建起来zooKeeper中心。
下载并解压zooKeeper(https://archive.apache.org/dist/zookeeper/zookeeper-3.4.13/)
下载完成后进入到conf目录下找到zoo_sample.cfg文件
打开 后如下:
注意dataDir是临时数据存放目录,而clientPort指的是默认端口,一般不改就行。
保存后,将zoo_sample.cfg文件复制一份,并改名为zoo.cfg
然后,进入到bin目录下找到zkEnv.cmd文件,这是一个命令执行文件,windows下的。打开后,可以看到,这里其实就定义了几个变量,ZOOCFG和JAVA_HOME等,对照下系统的JAVA_HOME是否设置正确。
保存后,双击bin目录下的zkServer.cmd就能成功启动zookeeper了。
(这是windows下的,如果是linux的话,需要执行 .sh文件)
2、搭建dubbo管理控制台
下载dubbo控制台:
https://github.com/apache/incubator-dubbo-ops 注意,请下载master版本,不要下载过往版本或者 开发版本。
下载后解压,进入到dubbo-admin目录,先打开配置文件看下相关配置是否正确。
dubbo-admin/src/main/resources/application.properties文件主要检查下
dubbo.registry.address
server.port等配置项是否正确
如果正确,回到dubbo-admin目录,进入cmd,输入命令行:
mvn clean package -Dmaven.test.skip=true打包,完成后进入target文件夹,
会看到dubbo-admin-0.0.1-SNAPSHOT.jar包,在cmd命令行中输入:
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
成功后 页面如下:
用户名密码都是root
3、监控中心搭建
进入到dubbo-monitor-simple目录,同样在 cmd命令行中输入:
mvn clean package -Dmaven.test.skip=true打包,完成后进入target文件夹,
把 dubbo-monitor-simple-2.0.0-assembly.tar.gz 解压缩进入到assembly.bin目录,
运行start.bat,启动成功后访问http://localhost:8080页面如下:
至此,环境搭建工作,基本完成
二、demo示例(普通maven项目)
1、新建工程
通过IDEA新建一个项目,选择Maven项目就可以,但觉得设置内容有点多,所以直接选择了springboot的项目,
由于这次不使用springboot,所以把springboot的依赖项都删除,但是添加dubbo和zookeeper的依赖项,把src目录也删掉。
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.1.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.xyzh</groupId>
<artifactId>myduboo-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>myduboo-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.28</version>
</dependency>
<!-- 添加 dubbo 依赖包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.5</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.1</version>
<type>bundle</type>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.1</version>
<type>bundle</type>
</dependency>
<!-- 添加 zookeeper 依赖包 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
</dependency>
<!--添加zkclient依赖包 -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2、新建API模块
这个模块用来存放 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>com.xyzh</groupId>
<artifactId>myduboo-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.xyzh</groupId>
<artifactId>myduboo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>myduboo-api</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
这里把myduboo-demo作为parent来设置的,后面的几个模块也要如此设置。
服务接口如下
public interface IMyService {
String helloService(String name);
}
注意需要在 myduboo-demo的pom中添加一行模块声明:
<modules>
<module>myduboo-api</module>
</modules>
3、添加服务提供模块
这个模块是作为一个服务提供者来实现的,负责将服务实现并注册到注册中心,所以需要引入duboo的相关依赖
pom如下:
<?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>com.xyzh</groupId>
<artifactId>myduboo-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.xyzh</groupId>
<artifactId>myduboo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>myduboo-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<type>bundle</type>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<type>bundle</type>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
</dependency>
<dependency>
<groupId>com.xyzh</groupId>
<artifactId>myduboo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
需要在resources 目录下添加配置文件:mydubbo-provider.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 添加 DUBBO SCHEMA -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 应用名 -->
<dubbo:application name="dubbo-provider"/>
<!-- 连接到哪个本地注册中心 -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/>
<!-- 协议配置,用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受 -->
<dubbo:protocol name="dubbo" server="netty" port="20882" serialization="hessian2" />
<!-- 监控中心配置,protocol="registry",表示从注册中心发现监控中心地址
<dubbo:monitor protocol="registry"/>
-->
<!-- 当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值 -->
<dubbo:provider timeout="30000" threadpool="fixed" threads="100" accepts="1000" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service timeout="60000" interface="com.xyzh.mydubooapi.service.IMyService" ref="userService" protocol="dubbo"/>
<!--具体实现该接口的 bean-->
<bean id="userService" class="com.xyzh.mydubooprovider.service.MyServiceImpl"/>
</beans>
注意这里配置了注册端口,监控地址,协议,暴露的服务接口和 实现接口的bean
添加实现类:
public class MyServiceImpl implements IMyService {
@Override
public String helloService(String name) {
return "hello,"+name;
}
}
添加 main 类
public class ProviderApplication {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("mydubbo-provider.xml");
System.out.println(context.getDisplayName() + ": here");
context.start();
System.out.println("服务已经启动...");
System.in.read();
}
}
4、添加服务调用者
这个模块是负责从注册中心调用服务。
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>com.xyzh</groupId>
<artifactId>myduboo-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.xyzh</groupId>
<artifactId>myduboo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>myduboo-consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<type>bundle</type>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<type>bundle</type>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
</dependency>
<dependency>
<groupId>com.xyzh</groupId>
<artifactId>myduboo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
添加配置文件,在resources目录下添加配置文件 consumer.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="dubbo-consumer"/>
<!--向 zookeeper 订阅 provider 的地址,由 zookeeper 定时推送-->
<!-- <dubbo:registry address="192.168.0.188:2183" protocol="zookeeper"></dubbo:registry> -->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!-- 配置全局超时时间-->
<!-- <dubbo:consumer timeout="600000" check="false"></dubbo:consumer> -->
<!--使用 dubbo 协议调用定义好的接口-->
<dubbo:reference id="userService" interface="com.xyzh.mydubooapi.service.IMyService"/>
</beans>
添加main函数,调用服务
public class MydubooConsumerApplication {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new
ClassPathXmlApplicationContext("consumer.xml");
System.out.println(context.getDisplayName() + ": here");
context.start();
System.out.println("服务已经启动...");
IMyService orderService=context.getBean(IMyService.class);
System.out.println(orderService.helloService("test"));
System.in.read();
}
}
5、启动测试
先启动 provider
截图如下:
接着启动consumer:
调用成功!