实现目标
基于centos 7,通过docker打包部署dubbox(2.8.4),并实现简单的服务提供者与消费者。
前置条件
- 服务器安装JDK1.8并正确配置环境变量
- 开发环境安装JDK1.8并正确配置环境变量
- 开发环境安装maven并正确配置环境变量(建议使用阿里云仓库)
安装zookeeper
ZooKeeper 是 Apache 软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。
下载压缩包
- 下载压缩包
curl -O https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz
- 解压压缩包
tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz
修改zookeeper配置文件
- 进入zookeeper配置文件所在目录
cd /home/apache-zookeeper-3.7.0-bin/conf
- 修改配置文件
cp zoo_sample.cfg zoo.cfg
运行zookeeper
cd /home/apache-zookeeper-3.7.0-bin/bin
./zkServer.sh start
检查zookeeper运行状态
cd /home/apache-zookeeper-3.7.0-bin/bin
./zkServer.sh status
dubbox打包
Dubbox 是一个分布式服务框架,其前身是阿里巴巴开源项目Dubbo ,被国内电商及互联网项目中使用,后期阿里巴巴停止了该项目的维护,当当网便在Dubbo基础上进行优化,并继续维护,为了与原有的Dubbo区分,故将其命名为Dubbox。
Dubbox 致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbox就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbox这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架。
dubbox没有提供打包好的jar包或者war包,我们需要自己在github下载源码并编译。
下载dubbox源码
dubbox代码下载地址:https://github.com/dangdangdotcom/dubbox
编译代码
进入dubbox代码文件见,执行打包命令
mvn install -D maven.test.skip=true
打包完成后,在dubbo-admin\target
中能看到一个dubbo-admin-2.8.4.war
修改dubbox配置文件
我们用压缩软件打开dubbo-admin-2.8.4.war
,打开WEB-INF\dubbo.properties
,修改zookeeper地址及对应用户密码,如下:
dubbo.registry.address=zookeeper://IP地址:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
[tag type="default"]注意修改成自己zookeeper对应的ip地址[/tag]war
包修改完成后备用。
安装docker
我们通过docker部署dubbox。
更新yum
yum -y update
安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
安装docker
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce-18.06.0.ce-3.el7
启动docker并配置开机启动
systemctl start docker
systemctl enable docker
配置docker为国内源
vi /etc/docker/daemon.json
输入以下内容
{
"registry-mirrors": ["http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"]
}
通过docker部署dubbox
我们这里自己打包一个docker,并部署dubbox
创建文件夹
创建一个文件夹/home/makedocker
,用于存储Dockerfile
以及war
包。
mkdir /home/makedocker
cd /home/makedocker
将war包上传到/home/makedocker
制作Dockerfile
vi Dockerfile
并输入以下内容
FROM registry.cn-hangzhou.aliyuncs.com/shuodao/tomcat-8.5.27
MAINTAINER Laughing
COPY dubbo.war /usr/tomcat/webapps/
EXPOSE 8080/tcp
打包docker
docker build -t tomcat-dubbo .
启动docker
docker run -d -p 8888:8080 --name tomcat-dubbo tomcat-dubbo
查看docker运行状态
docker ps
显示以下内容,代表docker运行成功
查看dubbox运行状态
打开http://139.198.172.114:8888/dubbo
,系统要求输入密码,密码为dubbo.properties
中配置的密码,输入完成后,正常打开界面如下
实现dubbox服务
我们创建一个用户服务,作为服务提供者,判断用户是否登录。一个商品服务,作为服务消费者,调用用户是否登录的接口。
实现通用服务接口
创建一个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>net.xiangcaowuyu</groupId>
<artifactId>dubbo-common</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
创建接口
package net.xiangcaowuyu.dubbo.common.service;
/**
* 博客:https://www.xiangcaowuyu.net
* Description:
*
* @Author: 香草物语
* DateTime: 2021-07-19 20:20
*/
public interface RpcUserService {
boolean checkUserLogin(String userName);
}
将代码部署到本地maven仓库
由于我们没有远程maven仓库,所以我们将jar包install到本地仓库。
在代码根目录,执行以下命令,打包到本地仓库。
mvn install -D maven.test.skip=true
实现服务提供者
创建服务提供者。
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.5.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>net.xiangcaowuyu</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>net.xiangcaowuyu</groupId>
<artifactId>dubbo-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
实现接口
package net.xiangcaowuyu.dubboprovider.service;
import net.xiangcaowuyu.dubbo.common.service.RpcUserService;
import org.springframework.stereotype.Service;
/**
* 博客:https://www.xiangcaowuyu.net
* Description:
*
* @Author: 香草物语
* DateTime: 2021-07-19 19:56
*/
@Service
@com.alibaba.dubbo.config.annotation.Service(interfaceClass = RpcUserService.class)
public class RpcUserServiceImpl implements RpcUserService{
@Override
public boolean checkUserLogin(String userName){
return "admin".equals(userName);
}
}
修改配置文件
配置dubbo
server.port=8081
#dubbo提供者的别名,只是个标识
spring.dubbo.application.name=dubbo-provider
#zookeeper地址
spring.dubbo.registry.address=zookeeper://139.198.172.114:2181
#dubbo协议
spring.dubbo.protocol.name=dubbo
#dubbo端口号
spring.dubbo.protocol.port=20880
#这是你要发布到dubbo的接口所在包位置
spring.dubbo.scan=net.xiangcaowuyu.dubboprovider.service
测试
运行项目,然后我们打开dubbo服务端,查看是否注册成功。
实现服务消费者
创建服务消费者。
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.5.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>net.xiangcaowuyu</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>net.xiangcaowuyu</groupId>
<artifactId>dubbo-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
创建商品服务
package net.xiangcaowuyu.dubboprovider.service;
/**
* 博客:https://www.xiangcaowuyu.net
* Description:
*
* @Author: 香草物语
* DateTime: 2021-07-19 20:36
*/
public interface GoodService {
boolean checkUserLogin(String userName);
}
创建商品服务类,调用用户登录判断接口
package net.xiangcaowuyu.dubboprovider.service.impl;
import com.alibaba.dubbo.config.annotation.Reference;
import net.xiangcaowuyu.dubbo.common.service.RpcUserService;
import net.xiangcaowuyu.dubboprovider.service.GoodService;
import org.springframework.stereotype.Service;
/**
* 博客:https://www.xiangcaowuyu.net
* Description:
*
* @Author: 香草物语
* DateTime: 2021-07-19 19:56
*/
@Service
public class GoodServiceImpl implements GoodService {
@Reference
private RpcUserService rpcUserService;
@Override
public boolean checkUserLogin(String userName) {
return rpcUserService.checkUserLogin(userName);
}
}
测试消费者服务是否正常注册
测试
创建商品销售接口
package net.xiangcaowuyu.dubboprovider.controller;
import net.xiangcaowuyu.dubboprovider.service.GoodService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* 博客:https://www.xiangcaowuyu.net
* Description:
*
* @Author: 香草物语
* DateTime: 2021-07-19 20:40
*/
@RestController
public class GoodController {
@Resource
private GoodService goodService;
@GetMapping("sell/good")
public boolean sellGood(){
return goodService.checkUserLogin("admin");
}
}
评论 (0)