Dubbo+Cat分布式服务搭建
刚入职新公司,发现新公司的基础设施尚处于空白状态。同事也很想把自己原公司所使用的相关技术引入到现在的工作中。花费了大约1周的左右,把以下成功引入,搭建了一个会员服务框架,示例服务为exmaple-service:
- IDEA
- Maven
- Nexus(Maven私服)
- Zookeeper
- Dubbo
- Cat
依赖环境:
- 操作系统:Linux系统
- JDK版本:1.7.0_79(强烈推荐使用该版本及以下版本,避免引起其他问题)
- Git(部署的机器已安装)
- Tomcat
- 请务必放开对各端口的访问权限(dubbo:20880,cat:2280,tomcat:8080,nexus:8081,zookeeper:2181/2182/2183,mysql:3306)
- 强烈推荐部署为非root的用户
以下详细介绍下搭建的整个过程:
1.Git安装与使用在此不做过多描述,推荐看以下资料:
- 官方文档:http://git-scm.com/book/zh/v1
- 廖雪峰的git教程:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
- 快速指南:http://www.bootcss.com/p/git-guide/
2.IDEA开发工具的安装与使用在此也不做过多描述,推荐看以下资料:
- 官网:http://www.jetbrains.com/idea/
- 教程:https://github.com/judasn/IntelliJ-IDEA-Tutorial
- 推荐安装插件:.ignore,Lombok,File Info,CodeGlance
- 正式使用前,请配置JDK,Maven,Git环境
3.开发者本地Maven安装
- 官网:http://maven.apache.org
- 中央仓库Web访问:http://mvnrepository.com
- 阿里国内仓库Web访问:http://maven.aliyun.com/nexus/
- 推荐阅读:《Maven实战》
- 安装过程如下:
- 下载maven并解压到安装目录
- 配置环境变量
- 替换maven/conf/settings.xml,可参考settings.xml见:git@github.com:czwer/maven_config.git中的settings.xml,使用前修改IP地址(IP地址为稍后部署的Nexus私服地址,推荐原setttings.xml备份)
4.首先搭建Nexus私服
- 官网:http://nexus.sonatype.org/downloads/
- Nexus私服作为公司内部仓库,依赖外部和公司内部编译的jar,都会发布到私服中。方便其他项目引用。
- 安装步骤如下:
- 创建存放的目录
mkdir -p /xxx/xxx/nexus - 下载nexus安装包
wget https://sonatype-download.global.ssl.fastly.net/nexus/oss/nexus-2.14.0-01-bundle.tar.gz - 解压:
tar zxvf nexus-2.14.0-01-bundle.tar.gz -C /xxx/xxx/nexus - 切到nexus目录的bin下:
cd /xxx/xxx/nexus/nexus-2.14.0-01/bin/ - 启动/停止nexus(自带jetty,使用jetty启动):
启动:./nexus start
停止:./nexus stop - 登录的初始账号密码:admin/admin123
- 创建存放的目录
5.创建所有Maven工程的公共父pom.xml
- 方便共同属性在所有项目共用以及构件发布的配置,参:git@github.com:czwer/maven_config.git中的pom.xml:
- 以下需修改:
groupId
artifactId
name
涉及到的IP
JDK版本视公司环境不同自行修改 - 修改完成后执行以下命令发布到私服(推荐把pom.xml放在新建的空文件夹中执行)
mvn deploy -N - 使用时,把以下放在项目根pom.xml: 12345<parent><groupId>com.xxx</groupId><artifactId>xxx-parent</artifactId><version>1.0.0-SNAPSHOT</version></parent>
- 以下需修改:
6.Zookeeper伪集群搭建(仅限开发测试环境部署):
- 官网:http://zookeeper.apache.org/
- ZooKeeper为分布式应用提供了高效且可靠的分布式协调服务,提供了诸如统一命名服务,配置管理和分布式锁等分布式的基础服务。在这里我们因使用Dubbo作为分布式服务框架,而Dubbo需要注册中心,Zookeeper在这里担任的就是注册中心的角色。
安装步骤如下:
- 创建存放的目录
mkdir -p /xxx/xxx/zookeeper - 下载安装包
wget http://www.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz - 解压:
tar zxvf zookeeper-3.4.6.tar.gz -C /xxx/xxx/zookeeper - 创建快照文件的目录:
mkdir -p /xxx/xxx/zookeeper/data/zk1
mkdir -p /xxx/xxx/zookeeper/data/zk2
mkdir -p /xxx/xxx/zookeeper/data/zk3 - 创建myid文件
echo “1” > /xxx/xxx/zookeeper/data/zk1/myid
echo “2” > /xxx/xxx/zookeeper/data/zk2/myid
echo “3” > /xxx/xxx/zookeeper/data/zk3/myid 修改配置文件/xxx/xxx/zookeeper/zookeeper-3.4.6/conf
123456789101112131415161718192021222324cp zoo_sample.cfg zoo1.cfgcp zoo_sample.cfg zoo2.cfgcp zoo_sample.cfg zoo3.cfg修改zoo1.cfg:dataDir=/xxx/xxx/zookeeper/data/zk1dataLogDir=/xxx/xxx/logs/zookeeper/zk1clientPort=2181server.1=localhost:2888:3888server.2=localhost:2889:3889server.3=localhost:2890:3890修改zoo2.cfg:dataDir=/xxx/xxx/zookeeper/data/zk2dataLogDir=/xxx/xxx/logs/zookeeper/zk2clientPort=2182server.1=localhost:2888:3888server.2=localhost:2889:3889server.3=localhost:2890:3890修改zoo3.cfg:dataDir=/xxx/xxx/zookeeper/data/zk3dataLogDir=/xxx/xxx/logs/zookeeper/zk3clientPort=2183server.1=localhost:2888:3888server.2=localhost:2889:3889server.3=localhost:2890:3890启动与停止
12345678启动:./zkServer.sh start /xxx/xxx/zookeeper/zookeeper-3.4.6/conf/zoo1.cfg./zkServer.sh start /xxx/xxx/zookeeper/zookeeper-3.4.6/conf/zoo2.cfg./zkServer.sh start /xxx/xxx/zookeeper/zookeeper-3.4.6/conf/zoo3.cfg停止:./zkServer.sh stop /xxx/xxx/zookeeper/zookeeper-3.4.6/conf/zoo1.cfg./zkServer.sh stop /xxx/xxx/zookeeper/zookeeper-3.4.6/conf/zoo2.cfg./zkServer.sh stop /xxx/xxx/zookeeper/zookeeper-3.4.6/conf/zoo3.cfg验证是否部署成功
telnet xxx.xxx.xxx.xxx 2181
telnet xxx.xxx.xxx.xxx 2182
telnet xxx.xxx.xxx.xxx 2183
- 创建存放的目录
7.部署Tomcat
- 官网:http://tomcat.apache.org/
- 安装过程如下:
- 创建安装目录
mkdir -p /xxx/xxx/tomcat - 获取tomcat安装包
wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-7/v7.0.73/bin/apache-tomcat-7.0.73.tar.gz - 解压
tar zxvf apache-tomcat-7.0.73.tar.gz -C /xxx/xxx/tomcat
- 创建安装目录
8.Dubbo服务治理中心搭建
- 官网:http://dubbo.io/
- 源代码:https://github.com/alibaba/dubbo
安装过程如下:
- 下载dubbo源代码到开发者机器上
git clone https://github.com/alibaba/dubbo.git - 编译源代码并打war包(强烈推荐JDK1.7环境),编译需要花些时间,要有耐心耐心(可以把本地settings.xml临时修改为指向:http://maven.aliyun.com/nexus 以节省时间):
mvn eclipse:eclipse
mvn clean install -Dmaven.test.skip - 在部署的服务器上创建dubbo部署目录:
mkdir -p /xxx/xxx/dubbo-admin - 上传代码dubbo-admin到服务器上:
sftp -oPort=22 abc@xxx.xxx.xxx.xxx
输入密码:xxxxxx
put /xxx/dubbo/dubbo-admin/target/dubbo-admin-2.5.4-SNAPSHOT.war /xxx/xxx/dubbo-admin - 解压并删除原war包
jar -xvf dubbo-admin-2.5.4-SNAPSHOT.war
mv dubbo-admin-2.5.4-SNAPSHOT.war /xxx/xxx/temp/ - 修改配置文件dubbo-admin/WEB-INF/dubbo.properties(其中xxx.xxx.xxx.xxx为zookeeper部署地址):
dubbo.registry.address=zookeeper://xxx.xxx.xxx.xxx:2181?backup= xxx.xxx.xxx.xxx:2182,xxx.xxx.xxx.xxx:2183 修改日志位置:/xxx/xxx/dubbo-admin/WEB-INF/log4j.xml
1<param name="file" value="/xxx/xxx/logs/dubbo/admin/dubbo-governance.log" />部署到tomcat中,添加配置,在/xxx/xxx/tomcat/apache-tomcat-7.0.72/conf/server.xml的
中添加 12345<Context path="/dubboAdmin"docBase="/xxx/xxx/dubbo-admin/"crossContext="true"reloadable="false"debug="0"/>启动tomcat
- 访问首页:
访问地址:http://xxx.xxx.xxx.xxx:8080/dubboAdmin/index.html
账号/密码:root/root
- 下载dubbo源代码到开发者机器上
9.Dubbo接入Cat
- 接入的原理就是在Dubbo中接入Cat的Transaction。
具体步骤如下,代码参:git@github.com:czwer/dubbo.git中dubbo_cat版本:
- 从clone的dubbo分支中创建新分支:
git checkout -b dubbo_cat 增加Cat依赖jar包,在dubbo根pom.xml和dubbo-rpc-api的pom.xml
12345<dependency><groupId>com.dianping.cat</groupId><artifactId>cat-core</artifactId><version>1.3.3</version></dependency>.代码导入IDEA,修改dubbo源代码,嵌入Cat的Transaction,以便收集统计信息。涉及到的类有,具体参:git@github.com:czwer/dubbo.git的dubbo_cat版本(是参考前公司架构师修改代码的方式):
AbstractInvoker
AbstractProxyInvoker- 修改版本号(含子模块的版本号,通过IDEA全局替换.xml文件中的):
2.5.4_cat-SNAPSHOT 在dubbo根pom.xml添加:
12345<parent><groupId>com.xxx</groupId><artifactId>xxx-parent</artifactId><version>1.0.0-SNAPSHOT</version></parent>发布到Nexus仓库中,以后其他项目就可以引用了,在根目录的dubbo子模块中执行:
mvn deploy -N
- 从clone的dubbo分支中创建新分支:
10.Cat应用监控平台部署(支持集群,开发环境暂部署了一台)
- CAT基于Java开发的实时应用监控平台,包括实时应用监控,业务监控。
- 源码:https://github.com/dianping/cat
- 文档:源码中包含《Dianping Cat安装说明文档》
安装过程如下:
- 下载源码:
git clone https://github.com/dianping/cat.git - 编译源码(JDK1.7编译;如网络原因导致本地仓库获得不到中央仓库jar,可以选择手动上传):
git checkout mvn-repo
cp -R * ~/.m2/repository
git checkout master
mv clean install -DskipTests - 在服务器上创建部署目录:
mkdir -p /xxx/xxx/cat - 把本地编译的上传到服务器上:
sftp -oPort=22 xxxx@xxx.xxx.xxx.xxx
cd /xxx/xxx/cat
put /xxx/cat/cat-/xxx/target/cat-alpha-1.3.6.war - 解压并移除原来的war包:
jar -xvf cat-alpha-1.3.6.war 创建表和配置文件,以下为手动方式
1234a.拷贝cat源码下script中datasources.xml,client.xml,server.xml到/data/appdatas/catb.数据库连接与密码:datasources.xmlc.执行SQL(原sql注意检查是否都执行成功,原执行时发现字段类型不能有两个字段同时为timestamp):Cat.sqld.修改server.xml(主要是修改IP与端口号,IP请不要携带http)部署到tomcat,并访问:
http://xxx.xxx.xxx.xxx:8080/cat/r
账号/密码:catadmin/catadmin- 修盖配置:
选择 配置–>全局警告配置–>客户端路由
- 下载源码:
11.搭建example-service服务,接入Dubbo,Cat
- 搭建的服务为maven工程,示例见:git@github.com:czwer/example-service.git.
步骤如下:
- IDEA中创建Maven项目
- 引入dubbo的jar,版本为我们修改过后放在私服的(2.5.4_cat-SNAPSHOT),注意排除spring的间接依赖。
- 引入cat的jar
- 收集异常日志,在log4j.properties加入
log4j.rootCategory=INFO,app,stdout,cat(新增cat)
log4j.appender.cat=com.dianping.cat.log4j.CatAppender 如需收集url调用情况,在web.xml中增加如下配置
1234567891011<!-- cat filter--><filter><filter-name>cat-filter</filter-name><filter-class>com.dianping.cat.servlet.CatFilter</filter-class></filter><filter-mapping><filter-name>cat-filter</filter-name><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher></filter-mapping>dao监控
123456789<!-- 创建SqlSessionFactory,同时指定数据源 --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="plugins"><array><bean class="com.example.dal.CatSelectInterceptor"/></array></property></bean>在publish工程的resources目录中加入META-INF文件,里面增加app.properties, 内容为app.name=应用名称(如exmaple-service)
- 在应用所在的服务器中创建/data/appdatas/cat增加client.xml文件,里面配置cat-server的地址。具体配置指向服务器地址与端口。
以上感谢前公司的架构师(法师),给公司引入这么好的框架,以上经验大部分从他那里学习到的。也感谢部署期间泉兄提供的帮助。以上部署时也遇到了一些问题,通过网络最终解决,感谢分享经验的人。
参考:
- zookeeper伪集群部署:https://my.oschina.net/vbird/blog/384043
- zookeeper具体配置详解:http://www.cnblogs.com/shangxiaofei/p/5210917.html
- zookeeper运维经验:http://mp.weixin.qq.com/s?__biz=MzAxMjQ5NDM1Mg==&mid=2651024176&idx=1&sn=7659ea6a7bf5c37b083e30060c3e55ca&chksm=8047384fb730b1591ff1ce7081822577112087fc7ec3976f020a263b503f6a8ef0856b3a3057&scene=0#wechat_redirect
- dubbo编译失败问题处理 ,因本机jdk未重装前为jdk8,即时使用jenv切换环境也无效,后干脆重装jdk:http://www.jianshu.com/p/f4996b1ccf2f
- git关联远程仓库请使用:git push -u origin master,否则会导致关联失败,问题处理参:http://stackoverflow.com/questions/24114676/git-error-failed-to-push-some-refs-to
- git无法上传空目录,确实不支持,先前不知:http://www.cnblogs.com/softidea/p/5579668.html
- cat编译参:http://www.cnblogs.com/yjmyzz/archive/2016/03/30/dianping-cat-deploy-tutorial.html
- cat部署因多写了server.xml多写了http:https://www.oschina.net/question/584441_2203579