引入
最近和小伙伴做一个比赛,处于开发阶段,因为涉及的服务比较多,且服务需要分开部署在不同的服务器上,讨论之后,打算采用分布式来做,之前学习springboot的时候,部分章节涉及到了springboot集成dubbo,不过demo的学习始终不及实战过程复杂,真正开始去学、去用,才会学到真正有用的东西,当然踩坑过程可想而知。笔者在这里就记录一下自己完全从零开始搭建分布式环境,以及用springboot集成dubbo+zookeeper(配置中心、注册中心、元数据中心)的详细过程。
技术栈
- 开发工具:IntelliJ IDEA
- springboot
- zookeeper
- dubbo-admin
- maven私服搭建
学习过程
了解分布式应用架构
参考:http://dubbo.apache.org/zh-cn/docs/user/preface/background.html
单一应用架构
当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。垂直应用架构
当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。分布式服务架构
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。流动计算架构
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。
dubbo入门
节点 | 角色说明 |
---|---|
Provider | 暴露服务的服务提供方 |
Consumer | 调用远程服务的服务消费方 |
Registry | 服务注册与发现的注册中心 |
Monitor | 统计服务的调用次数和调用时间的监控中心 |
Container | 服务运行容器 |
调用关系说明
0、服务容器负责启动,加载,运行服务提供者。
1、服务提供者在启动时,向注册中心注册自己提供的服务。
2、服务消费者在启动时,向注册中心订阅自己所需的服务。
3、注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4、服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5、服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
了解更多,详见:Apache Dubbo官网
开始搭建
准备
两台内网服务器(一台也可以,虚拟机也行,我反正是用学校的):
host 1:172.16.250.42(centos7,以下简称42服务器)
host 2:172.16.250.46(centos7,以下简称46服务器)
安装Java环境
系统自带openJDK,但是和JDK还是有区别,有很多包缺失,还是卸载,安装专业JDK,过程自行Baidu。
安装zookeeper
1、官网下载安装包:http://zookeeper.apache.org/releases.html
2、使用xftp将压缩包上传到42服务器的自定义路径下(我的是/www/server/download),解压zookeeper到/www/server/目录下:
tar -xzvf zookeeper-3.4.14.tar.gz -C /www/server
3、配置zoo.cfg,进入conf目录下,将zoo_sample.cfg复制一份,命名为zoo.cfg:
cd /www/server/zookeeper-3.4.14/conf
cp zoo_sample.cf zoo.cfg
4、编辑zoo.cfg,自定义以下配置(不用专门创建data目录,zookeeper启动会自动创建):
客户端默认访问端口是2181,记得开启2181端口,我用的宝塔,端口管理比较方便
5、启动zookeeper:
cd /www/server/zookeeper-3.4.14/bin
##启动
./zkServer.sh start
##查看状态
./zkServer.sh status
最新dubbo-admin部署
前后端分离部署
界面预览
开始部署
1、dubbo-admin:dubbo-admin介绍
github地址:https://github.com/apache/dubbo-admin
在这个界面的readme文件中官方已经给出了安装步骤,一开始没看懂开发环境部署和生产部署的区别,看到项目代码结构,可以看到里面有dubbo-admin-server和dubbo-admin-ui两个,其实就是前后端,server提供服务api,ui负责展示数据,因此我们需要两个都进行编译部署:
2、后端server部署过程:
我这里部署到46服务器上,因为dubbo的前后端分别占用8081和8080端口,我42服务器应用有点多了,登录46服务器,进入/www/server目录开始操作:
## 我的工作目录
cd /www/server
## 下载git代码
git clone https://github.com/apache/dubbo-admin.git
## 如果下载很慢,你可以在windows上下载zip压缩包,然后使用xftp上传到服务器解压亦可
## 进入server后端,编译打包:
cd dubbo-admin/dubbo-admin-server
## 1、打包编译之前,先修改dubbo-admin-server/src/main/resources/application.properties配置文件:
## 2、这里我使用zookeeper做动态配置中心,最后在配置中心配置注册中心和元数据中心的地址,所以application.properties配置如下:
----------
# centers in dubbo2.7
#admin.registry.address=zookeeper://172.16.250.42:2181
## zookeeper安装在42服务器上,因此地址填172.16.250.42:2181
admin.config-center=zookeeper://172.16.250.42:2181
#admin.metadata-report.address=zookeeper://172.16.250.42:2181
## dubbo-admin-ui登录的账号密码
admin.root.user.name=root
admin.root.user.password=root
#group
admin.registry.group=dubbo
admin.config-center.group=dubbo
admin.metadata-report.group=dubbo
admin.apollo.token=e16e5cd903fd0c97a116c873b448544b9d086de9
admin.apollo.appId=test
admin.apollo.env=dev
admin.apollo.cluster=default
admin.apollo.namespace=dubbo
----------
## 保存配置文件,在dubbo-admin-server目录下(pom.xml所在目录)编译打包:
## 说明:这里需要在服务器安装maven,具体可百度怎么安装,建议将maven中央仓库地址改为阿里云的,速度快一点,可参考我的博客:
## [Maven配置阿里云仓库](https://gongsir.blog.csdn.net/article/details/103910642)
## 执行编译打包命令,跳过测试:
mvn clean package -Dmaven.test.skip=true
## build success之后,就可以运行了:
cd target/
## 后台运行:
nohup java -jar dubbo-admin-server-0.1.jar &
## 查看日志:
tail -f nohup.out
检查后端运行状态,浏览器输入172.16.250.46:8080/swagger-ui.html,看到swagger文档即可(记得开放8080端口):
3、前端UI部署过程:
部署之前先安装node.js环境,我用的宝塔,一键部署nodejs环境,很方便,环境部署之后,npm -v能看到版本就开始部署dubbo-ui吧:
## 进入ui目录
cd dubbo-admin-ui/
## 安装npm依赖
## 在这之前,改一下npm的配置,配置淘宝镜像
npm set registry "https://registry.npm.taobao.org"
## 开始
npm install
## 接下来运行
npm run dev
## 看到localhost:8081就运行成功了
## 踩坑:这里只能localhost访问,远程无法访问,只需修改config/index.js文件,将host从localhost改成0.0.0.0即可
## 这样:Your application is running here: http://0.0.0.0:8081
打开浏览器,输入172.16.250.46:8081:
但似乎不知道说的啥,不知道那个path: /dubbo/config/dubbo/dubbo.properties
在哪,其实很简单,我们在dubbo-admin界面点击左侧菜单的——配置管理,在里面创建配置:
应用名:global
配置内容:
## 注册中心地址
dubbo.registry.address=zookeeper://172.16.250.42:2181
## 元数据中心地址
dubbo.metadata-report.address=zookeeper://172.16.250.42:2181
最后,我们在开发服务端的时候,只需在配置文件中写上配置中心的地址就可以使用配置中心的注册中心和元数据中心:
项目yml配置部分如下:
dubbo:
application:
id: dubbo-user
name: user-service-provider
## 这里配置配置中心的地址
config-center:
protocol: zookeeper
address: zookeeper://172.16.250.42:2181
scan:
base-packages: cn.edu.swpu.wlzx.service.impl
protocol:
name: dubbo
port: 20881
接下来我们就可以在dubbo-admin界面看到我们的服务了,还可以进行方法测试:
一体式部署
dubbo-admin仍然支持一体式部署(即前后端一起打包),步骤:
## 我的工作目录
cd /www/server
## 下载git代码
git clone https://github.com/apache/dubbo-admin.git
## 进入项目
cd dubbo-admin/
## 就在这里执行编译打包命令
mvn clean package ——Dmaven.test.skip=true
## 等待执行完成
## 运行项目,此时去dubbo-admin-distribution/target目录下
cd dubbo-admin-distribution/target/
## 后台运行项目
nohup java -jar dubbo-admin-0.1.jar > nohup.out 2&1 &
在浏览器输入:172.16.250.46:8080:
springboot开发服务和注册zookeeper
我的服务代码demo:https://github.com/gongsir0630/dubbo-user
使用nexus搭建maven私服
为什么搭建私服呢?
我和团队小伙伴是线上协作开发,项目中需要用到对方封装的实体,需要引入jar,但是只能在本地仓库引入,互传jar太麻烦,索性用nexus搭建了maven私服,这样就可以把我们的jar打包发布到私服,对方就能从私服中下载依赖了。
搭建过程
这个网上比较多,按照流程基本都没问题!
踩坑
启动的时候,建议专门创建一个nexus用户来管理nexus,否则会有提示,rootxxx什么的,虽然也不影响运行,但还是按照提示建议来,还需要在nexus脚本中修改`run_as_user='nexus'.
完结
以上是自己这几天摸索的结果,还是学到了很多东西,记录下来,也希望对正在学习dubbo的小伙伴们有所帮助,以上过程如有问题,欢迎评论区交流!!!