刚入职新公司,发现新公司的基础设施尚处于空白状态。同事也很想把自己原公司所使用的相关技术引入到现在的工作中。花费了大约1周的左右,把以下成功引入,搭建了一个会员服务框架,示例服务为exmaple-service:

  1. IDEA
  2. Maven
  3. Nexus(Maven私服)
  4. Zookeeper
  5. Dubbo
  6. Cat

依赖环境:

  1. 操作系统:Linux系统
  2. JDK版本:1.7.0_79(强烈推荐使用该版本及以下版本,避免引起其他问题)
  3. Git(部署的机器已安装)
  4. Tomcat
  5. 请务必放开对各端口的访问权限(dubbo:20880,cat:2280,tomcat:8080,nexus:8081,zookeeper:2181/2182/2183,mysql:3306)
  6. 强烈推荐部署为非root的用户

以下详细介绍下搭建的整个过程:

1.Git安装与使用在此不做过多描述,推荐看以下资料:

2.IDEA开发工具的安装与使用在此也不做过多描述,推荐看以下资料:

3.开发者本地Maven安装

  • 官网:http://maven.apache.org
  • 中央仓库Web访问:http://mvnrepository.com
  • 阿里国内仓库Web访问:http://maven.aliyun.com/nexus/
  • 推荐阅读:《Maven实战》
  • 安装过程如下:
    1. 下载maven并解压到安装目录
    2. 配置环境变量
    3. 替换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,都会发布到私服中。方便其他项目引用。
  • 安装步骤如下:
    1. 创建存放的目录
      mkdir -p /xxx/xxx/nexus
    2. 下载nexus安装包
      wget https://sonatype-download.global.ssl.fastly.net/nexus/oss/nexus-2.14.0-01-bundle.tar.gz
    3. 解压:
      tar zxvf nexus-2.14.0-01-bundle.tar.gz -C /xxx/xxx/nexus
    4. 切到nexus目录的bin下:
      cd /xxx/xxx/nexus/nexus-2.14.0-01/bin/
    5. 启动/停止nexus(自带jetty,使用jetty启动):
      启动:./nexus start
      停止:./nexus stop
    6. 登录的初始账号密码:admin/admin123

5.创建所有Maven工程的公共父pom.xml

  • 方便共同属性在所有项目共用以及构件发布的配置,参:git@github.com:czwer/maven_config.git中的pom.xml:
    1. 以下需修改:
      groupId
      artifactId
      name
      涉及到的IP
      JDK版本视公司环境不同自行修改
    2. 修改完成后执行以下命令发布到私服(推荐把pom.xml放在新建的空文件夹中执行)
      mvn deploy -N
    3. 使用时,把以下放在项目根pom.xml:
      1
      2
      3
      4
      5
      <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在这里担任的就是注册中心的角色。
  • 安装步骤如下:

    1. 创建存放的目录
      mkdir -p /xxx/xxx/zookeeper
    2. 下载安装包
      wget http://www.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
    3. 解压:
      tar zxvf zookeeper-3.4.6.tar.gz -C /xxx/xxx/zookeeper
    4. 创建快照文件的目录:
      mkdir -p /xxx/xxx/zookeeper/data/zk1
      mkdir -p /xxx/xxx/zookeeper/data/zk2
      mkdir -p /xxx/xxx/zookeeper/data/zk3
    5. 创建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
    6. 修改配置文件/xxx/xxx/zookeeper/zookeeper-3.4.6/conf

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      cp zoo_sample.cfg zoo1.cfg
      cp zoo_sample.cfg zoo2.cfg
      cp zoo_sample.cfg zoo3.cfg
      修改zoo1.cfg:
      dataDir=/xxx/xxx/zookeeper/data/zk1
      dataLogDir=/xxx/xxx/logs/zookeeper/zk1
      clientPort=2181
      server.1=localhost:2888:3888
      server.2=localhost:2889:3889
      server.3=localhost:2890:3890
      修改zoo2.cfg:
      dataDir=/xxx/xxx/zookeeper/data/zk2
      dataLogDir=/xxx/xxx/logs/zookeeper/zk2
      clientPort=2182
      server.1=localhost:2888:3888
      server.2=localhost:2889:3889
      server.3=localhost:2890:3890
      修改zoo3.cfg:
      dataDir=/xxx/xxx/zookeeper/data/zk3
      dataLogDir=/xxx/xxx/logs/zookeeper/zk3
      clientPort=2183
      server.1=localhost:2888:3888
      server.2=localhost:2889:3889
      server.3=localhost:2890:3890
    7. 启动与停止

      1
      2
      3
      4
      5
      6
      7
      8
      启动:
      ./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
    8. 验证是否部署成功
      telnet xxx.xxx.xxx.xxx 2181
      telnet xxx.xxx.xxx.xxx 2182
      telnet xxx.xxx.xxx.xxx 2183

7.部署Tomcat

8.Dubbo服务治理中心搭建

  • 官网:http://dubbo.io/
  • 源代码:https://github.com/alibaba/dubbo
  • 安装过程如下:

    1. 下载dubbo源代码到开发者机器上
      git clone https://github.com/alibaba/dubbo.git
    2. 编译源代码并打war包(强烈推荐JDK1.7环境),编译需要花些时间,要有耐心耐心(可以把本地settings.xml临时修改为指向:http://maven.aliyun.com/nexus 以节省时间):
      mvn eclipse:eclipse
      mvn clean install -Dmaven.test.skip
    3. 在部署的服务器上创建dubbo部署目录:
      mkdir -p /xxx/xxx/dubbo-admin
    4. 上传代码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
    5. 解压并删除原war包
      jar -xvf dubbo-admin-2.5.4-SNAPSHOT.war
      mv dubbo-admin-2.5.4-SNAPSHOT.war /xxx/xxx/temp/
    6. 修改配置文件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
    7. 修改日志位置:/xxx/xxx/dubbo-admin/WEB-INF/log4j.xml

      1
      <param name="file" value="/xxx/xxx/logs/dubbo/admin/dubbo-governance.log" />
    8. 部署到tomcat中,添加配置,在/xxx/xxx/tomcat/apache-tomcat-7.0.72/conf/server.xml的中添加

      1
      2
      3
      4
      5
      <Context path="/dubboAdmin"
      docBase="/xxx/xxx/dubbo-admin/"
      crossContext="true"
      reloadable="false"
      debug="0"/>
    9. 启动tomcat

    10. 访问首页:
      访问地址:http://xxx.xxx.xxx.xxx:8080/dubboAdmin/index.html
      账号/密码:root/root

9.Dubbo接入Cat

  • 接入的原理就是在Dubbo中接入Cat的Transaction。
  • 具体步骤如下,代码参:git@github.com:czwer/dubbo.git中dubbo_cat版本:

    1. 从clone的dubbo分支中创建新分支:
      git checkout -b dubbo_cat
    2. 增加Cat依赖jar包,在dubbo根pom.xml和dubbo-rpc-api的pom.xml

      1
      2
      3
      4
      5
      <dependency>
      <groupId>com.dianping.cat</groupId>
      <artifactId>cat-core</artifactId>
      <version>1.3.3</version>
      </dependency>
    3. .代码导入IDEA,修改dubbo源代码,嵌入Cat的Transaction,以便收集统计信息。涉及到的类有,具体参:git@github.com:czwer/dubbo.git的dubbo_cat版本(是参考前公司架构师修改代码的方式):
      AbstractInvoker
      AbstractProxyInvoker

    4. 修改版本号(含子模块的版本号,通过IDEA全局替换.xml文件中的):
      2.5.4_cat-SNAPSHOT
    5. 在dubbo根pom.xml添加:

      1
      2
      3
      4
      5
      <parent>
      <groupId>com.xxx</groupId>
      <artifactId>xxx-parent</artifactId>
      <version>1.0.0-SNAPSHOT</version>
      </parent>
    6. 发布到Nexus仓库中,以后其他项目就可以引用了,在根目录的dubbo子模块中执行:
      mvn deploy -N

10.Cat应用监控平台部署(支持集群,开发环境暂部署了一台)

  • CAT基于Java开发的实时应用监控平台,包括实时应用监控,业务监控。
  • 源码:https://github.com/dianping/cat
  • 文档:源码中包含《Dianping Cat安装说明文档》
  • 安装过程如下:

    1. 下载源码:
      git clone https://github.com/dianping/cat.git
    2. 编译源码(JDK1.7编译;如网络原因导致本地仓库获得不到中央仓库jar,可以选择手动上传):
      git checkout mvn-repo
      cp -R * ~/.m2/repository
      git checkout master
      mv clean install -DskipTests
    3. 在服务器上创建部署目录:
      mkdir -p /xxx/xxx/cat
    4. 把本地编译的上传到服务器上:
      sftp -oPort=22 xxxx@xxx.xxx.xxx.xxx
      cd /xxx/xxx/cat
      put /xxx/cat/cat-/xxx/target/cat-alpha-1.3.6.war
    5. 解压并移除原来的war包:
      jar -xvf cat-alpha-1.3.6.war
    6. 创建表和配置文件,以下为手动方式

      1
      2
      3
      4
      a.拷贝cat源码下script中datasources.xml,client.xml,server.xml到/data/appdatas/cat
      b.数据库连接与密码:datasources.xml
      c.执行SQL(原sql注意检查是否都执行成功,原执行时发现字段类型不能有两个字段同时为timestamp):Cat.sql
      d.修改server.xml(主要是修改IP与端口号,IP请不要携带http)
    7. 部署到tomcat,并访问:
      http://xxx.xxx.xxx.xxx:8080/cat/r
      账号/密码:catadmin/catadmin

    8. 修盖配置:
      选择 配置–>全局警告配置–>客户端路由

11.搭建example-service服务,接入Dubbo,Cat

  • 搭建的服务为maven工程,示例见:git@github.com:czwer/example-service.git.
  • 步骤如下:

    1. IDEA中创建Maven项目
    2. 引入dubbo的jar,版本为我们修改过后放在私服的(2.5.4_cat-SNAPSHOT),注意排除spring的间接依赖。
    3. 引入cat的jar
    4. 收集异常日志,在log4j.properties加入
      log4j.rootCategory=INFO,app,stdout,cat(新增cat)
      log4j.appender.cat=com.dianping.cat.log4j.CatAppender
    5. 如需收集url调用情况,在web.xml中增加如下配置

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      <!-- 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>
    6. dao监控

      1
      2
      3
      4
      5
      6
      7
      8
      9
      <!-- 创建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>
    7. 在publish工程的resources目录中加入META-INF文件,里面增加app.properties, 内容为app.name=应用名称(如exmaple-service)

    8. 在应用所在的服务器中创建/data/appdatas/cat增加client.xml文件,里面配置cat-server的地址。具体配置指向服务器地址与端口。

以上感谢前公司的架构师(法师),给公司引入这么好的框架,以上经验大部分从他那里学习到的。也感谢部署期间泉兄提供的帮助。以上部署时也遇到了一些问题,通过网络最终解决,感谢分享经验的人。

参考:

  1. zookeeper伪集群部署:https://my.oschina.net/vbird/blog/384043
  2. zookeeper具体配置详解:http://www.cnblogs.com/shangxiaofei/p/5210917.html
  3. zookeeper运维经验:http://mp.weixin.qq.com/s?__biz=MzAxMjQ5NDM1Mg==&mid=2651024176&idx=1&sn=7659ea6a7bf5c37b083e30060c3e55ca&chksm=8047384fb730b1591ff1ce7081822577112087fc7ec3976f020a263b503f6a8ef0856b3a3057&scene=0#wechat_redirect
  4. dubbo编译失败问题处理 ,因本机jdk未重装前为jdk8,即时使用jenv切换环境也无效,后干脆重装jdk:http://www.jianshu.com/p/f4996b1ccf2f
  5. git关联远程仓库请使用:git push -u origin master,否则会导致关联失败,问题处理参:http://stackoverflow.com/questions/24114676/git-error-failed-to-push-some-refs-to
  6. git无法上传空目录,确实不支持,先前不知:http://www.cnblogs.com/softidea/p/5579668.html
  7. cat编译参:http://www.cnblogs.com/yjmyzz/archive/2016/03/30/dianping-cat-deploy-tutorial.html
  8. cat部署因多写了server.xml多写了http:https://www.oschina.net/question/584441_2203579