正式配置前的一些说明:
- 笔者是在本地windows环境下基于springboot框架创建的dubbo项目,作为入门版本比较简单,IDE为IDEA。
- linux环境为阿里云的乌班图,安装的是standalone(单机版)的zookeeper和dubbo-admin(使用jar包,只需有java环境可以不安装tomcat)
- 本文所用代码github链接:https://github.com/15930599706/dubbo-Zookeeper-DubboAdmin
项目目录结构:
- 总目录
- api结构
- consumer结构
- provider结构
springboot项目创建
- 在IDEA中创建一个空项目
- 在该空项目中创建三个model,model类型为springboot
三个springboot model分别命名为api、provider、consumer,其中Develop tools选择Spring Web即可
provider示例》》
Develop tools》》
- 配置 api
该部分是存放所有公共接口的模块,服务提供方与服务消费方均依赖此模块
》》在com.dubbo.api.api下创建service包,在service包中创建CostService.java文件:package com.dubbo.api.api.service; public interface CostService { Integer add(int cost); }
》》在application.properties文件中指定服务器端口为8061
server.port=8061
-
配置consumer
该部分是消费服务的消费方所在的模块
》》在consumer的pom中添加依赖
<!--引入api模块--> <dependency> <groupId>com.dubbo.api</groupId> <artifactId>api</artifactId> <version>0.0.1-SNAPSHOT</version> <scope>compile</scope> </dependency> <!--引入dubbo环境--> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.0</version> </dependency>
》》在com.dubbo.consumer.consumer中创建service包,再在该包下创建ProductService.java
package com.dubbo.consumer.consumer.service; import org.springframework.stereotype.Service; @Service public interface ProductService { Integer getCost(int a); }
》》在service包下创建 impl 包 ,再在该包下创建ProductServiceImpl.java
package com.dubbo.consumer.consumer.service.impl; import com.dubbo.api.api.service.CostService; import com.dubbo.consumer.consumer.service.ProductService; import com.alibaba.dubbo.config.annotation.Reference; import org.springframework.stereotype.Service; @Service("productService") public class ProductServiceImpl implements ProductService { /** * 使用dubbo的注解 com.alibaba.dubbo.config.annotation.Reference。进行远程调用service */ @Reference private CostService costService; @Override public Integer getCost(int a) { return costService.add(a); } }
》》在com.dubbo.consumer.consumer中创建controller包,再在该包下创建ProductController.java
package com.dubbo.consumer.consumer.controlller; import com.dubbo.consumer.consumer.service.ProductService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class ProductController { @Autowired private ProductService productService; //resuful分格 @RequestMapping(value = "/add/{money}") public String getCost(@PathVariable Integer money){ return "该产品总共消费 :"+productService.getCost(money); } }
》》在application.properties文件中指定服务器端口为8062
server.port=8062
》》在resources目录下创建dubbo-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的url地址,这里才可以使用dubbo标签 -->
<!-- 该标签必须保证每个项目的名称不同,用来服务治理用的,就是应用(项目)的名称 -->
<dubbo:application name="demo-consumer" owner="zgy" organization="dubbo_zgy"/>
<!-- 配置zookeeper注册中心 -->
<!-- aliyunLinux中的zookeeper端口为2181 -->
<dubbo:registry address="zookeeper://47.98.40.227:2181" protocol="zookeeper" />
<!-- 关闭所有服务的自动检查 -->
<!-- <dubbo:consumer check="false"/> -->
<!-- 配置服务消费者,引用远程服务,本标记相当于创建了一个bean,所以在类中可以通过注解自动注入 -->
<dubbo:reference id="costService" interface="com.dubbo.api.api.service.CostService"/>
</beans>
》》为了使该配置文件生效,在 ConsumerApplication.java中添加注解:
@ImportResource(value = {"classpath:dubbo-consumer.xml"})
5.配置provider
》》在provider的pom中添加依赖
<!--引入api模块-->
<dependency>
<groupId>com.dubbo.api</groupId>
<artifactId>api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<!--引入dubbo环境-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
》》在com.dubbo.provider.provider下创建service包,再在该包下创建impl包,在impl包中创建CostServiceImpl.java文件
package com.dubbo.provider.provider.service.impl;
import com.dubbo.api.api.service.CostService;
import com.alibaba.dubbo.config.annotation.Service;
@Service
public class CostServiceImpl implements CostService {
private final Integer totalCost = 1000;
@Override
public Integer add(int cost) {
return totalCost + cost;
}
}
》》在application.properties文件中指定服务器端口为8063
server.port=8063
》》在resources目录下创建dubbo-provider.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的url地址,这里才可以使用dubbo标签 -->
<!--定义了提供方应用信息,用于计算依赖关系;在 dubbo-admin 或 dubbo-monitor 会显示这个名字,方便辨识-->
<dubbo:application name="demo-provider" owner="demo_zgy" organization="dubbo_zgy" />
<!-- 配置zookeeper注册中心,用到的vm是Linux_redis -->
<!--aliyunLinux的 docker 中的zookeeper端口为2182-->
<!-- <dubbo:registry address="zookeeper://47.98.40.227:2182" protocol="zookeeper" />-->
<!-- aliyunLinux中的zookeeper端口为2181 -->
<dubbo:registry address="zookeeper://47.98.40.227:2181" protocol="zookeeper" />
<!-- 群集用这个 -->
<!-- <dubbo:registry protocol="zookeeper" address="192.168.149.129:2181,192.168.149.129:2182,192.168.149.129:2183" /> -->
<!-- 使用dubbo协议 -->
<dubbo:protocol name="dubbo" port="20880" />
<!--使用 dubbo 协议实现定义好的 Service Api 接口-->
<!-- 配置dubbo服务:
参数interface:就是指向接口的全路径
参数ref:指向接口实现类的对象,所以我们必须有实现类的bean对象
参数registry:N/A 不将该服务注册到注册中心
就是将服务发布到注册中心去,将服务暴露出去,而提供者的服务已经独立成单独的项目了,
所以这里暴露的地址是独立的接口项目打的jar包的地址。
-->
<dubbo:service interface="com.dubbo.api.api.service.CostService" ref="costService" protocol="dubbo" />
<!--具体实现该接口的 bean-->
<bean id="costService" class="com.dubbo.provider.provider.service.impl.CostServiceImpl"/>
</beans>
》》为了使该配置文件生效,在 ConsumerApplication.java中添加注解:
@ImportResource(value = {"classpath:dubbo-provider.xml"})
至此,本地dubbo项目已经创建完成,下一部分是 阿里云Linux中环境的配置
linux环境下的【zookeeper+dubbo-admin】配置
>zookeeper
- 在/root 目录下创建zookeeper文件夹(创建目录随意,这里以/root为例)
-
mkdir zookeeper #进入zookeeper目录 cd zookeeper #使用wget命令下载(没有wget,使用yum安装即可) zookeeper包 wget http://apache.fayea.com/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz #解压 tar zvxf zookeeper-3.4.14.tar.gz
-
在zookeeper目录下创建 data文件夹
mkdir data
4.进入/zookeeper/apache-zookeeper-3.5.6-bin/conf 目录下,将zoo_sample.cfg改名为 zoo.cfg并增加 data 的路径
cd apache-zookeeper-3.5.6-bin/conf
#文件改名
mv zoo_sample.cfg zoo.cfg
#用vi编辑zoo.cfg文件
vi zoo.cfg
添加data路径后,zoo.cfg文件如下:
退出并保存。
5.启动zookeeper
在zookeeper的 /bin 目录中 启动zookeeper
./zkServer.sh start
使用./zkServer.sh status命令,如果控制台输出为
就表示zookeeper配置成功了
#zookeeper 其他的一些常用命令
查看zookeeper状态:./zkServer.sh status
停止zookeeper:./zkServer.sh stop
重启zookeeper:./zkServer.sh restart
>dubbo-admin
- 在https://github.com/apache/dubbo-admin.git下载dubbo-admin到windows环境,并解压
- 使用maven打包dubbo-admin
mvn clean package - 打包完成后,在 dubbo-admin-distribution/target 目录下 找到打好的jar包
这一步如果有问题,可以下载我上传的jar包,在我上传的资源中可以找到
//download.csdn.net/download/weixin_43681666/12032008 - 将jar包上传到linux服务器的 zookeeper文件夹下,并运行jar包
nohup java -jar dubbo-admin-0.1.jar >dubbo-admin-logs.txt & #nohup命令:nohup 命令运行由 Command参数和任何相关的 Arg参数指定的命令,忽略所有挂断信号。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。 #>logs.txt 表示输出文件。 #&"符号结尾表示,让程序在后台运行。
- 使用ps + 管道符命令查看jar包是否运行成功,使用kill -9 进程号,可以杀死后台进程
ps -ef|grep dubbo-admin-0.1.jar.jar - 最后,如果你使用的是虚拟机,需要关闭防火墙或者打开2181(dubbo) 和 7001(dubbo) 端口,如果和我一样使用的是阿里云linux,需要设置安全组,打开对应端口
可以在windows的cmd中使用 telnet 命令测试端口是否能够正常访问:
telnet ip地址 端口号
最终测试
1.在IDEA中运行api,provider,consumer项目
2.在浏览器中输入http://localhost:8062/add/100 ,其中100为传入的参数
3.在浏览器输入 http://服务器IP:7001/ 查看dubbo-admin控制页面,账号密码都是root
登陆成功后,点击 服务查询,找到我们provider提供的服务:
至此,我们整个的项目就完成配置了,恭喜你!