zheng 框架解析 (二)


7/7/2017 Zheng

这篇是从 git clone 项目开始, 从搭建环境到部属的过程, 希望对想学习的朋友有帮助.

看到群里有朋友出现了下面的错误, 我也出现了

com.alibaba.dubbo.rpc.RpcException: Forbid consumer 192.168.1.89 access service com.alibaba.dubbo.monitor.MonitorService from registry zkserver:2181 use dubbo version 2.5.3, Please check registry access list (whitelist/blacklist).
1

在出现上面的错误时, 都会打印下面一段信息

INFO  [com.alibaba.dubbo.monitor.dubbo.DubboMonitor] -  [DUBBO] Send statistics to monitor zookeeper://zkserver:2181/com.alibaba.dubbo.monitor.MonitorService?dubbo=2.5.3&interface=com.alibaba.dubbo.monitor.MonitorService&pid=43821&timestamp=1504769453531, dubbo version: 2.5.3, current host: 192.168.1.89
1

消费者向提供者发送统计数据时, 由于注册中心里面找不到那个提供者的信息, 抛出了最上面的错误.

MonitorService, 一看就知道是跟 dubbo monitor 有关.

查看 dubb-admin, 也可以看到, MonitorService 没有提供者

最后查看 readme.md, 看见 zheng 使用了 Dubbo-monitor dubbo-monitordubbo-admin 一样, 需要我们自己部属

dubbo-monitor 部属

这里使用 韩都衣舍Dubbo Monitor for Relational Database

不为别的, 就因为 dubbo-monitor-simple 太丑了 😂

官方的 readme.md 说得已经很清楚了, 照着来就是了

部属成功后 访问 http://127.0.0.1:9527/dubbo-monitor/

最后的效果如下:

屏幕快照 2017-09-07 5.12.12 屏幕快照 2017-09-07 5.12.45 然后就不会报错了

屏幕快照 2017-09-07 5.13.45 红色部分不未部署之前, 后面可以看到, 发送统计数据后没有报错了

另一种解决方案

在 dubbo.xml 中配置了 monitor 才会发送统计数据

所以删除所有 <dubbo:monitor protocol="registry"/> 不使用 monitor 即可

dubbo-admin 部署

和 dubbo-monitor 一样 😄

项目部署

本人工作中使用的 Maven 环境跟 zheng 不一样, 为了方便, 这里写了个脚本, 可以切换不同的 Maven 配置

change(){
  file_name='settings.xml.'$1
  is_exist="$(find ~/.m2 -name $file_name)"
  if [ $is_exist ]
  then 
    mv ~/.m2/settings.xml ~/.m2/settings.xml.$2;
    mv ~/.m2/$file_name ~/.m2/settings.xml
  fi
  echo "change " $1 'to ' $2
}
1
2
3
4
5
6
7
8
9
10

环境搭建

这里使用 Vagrant 来搭建环境, 一是不想把自己本地的环境搞乱, 二是方便, 环境搭建好之后, 打包一个 package, 到哪儿都能用.

Vagrant 里面的依赖都已经安装好了, 配置一下就 ok 了.

Vagrant 的 ip 地址为 2.2.2.2

zheng 是需要修改 hosts 的, 很多朋友没有看完文档就开始搞, 导致项目运行不起来.

Redis

  1. 允许远程访问 这里为了方便查看 redis , 这里设置为允许远程访问

    # 修改以下配置:
    # 1. 注释 bind 127.0.0.1
    # 2. protected-mode 由 yes --> no
    
    1
    2
    3
  2. 修改密码 我这里修改了 Redis 的密码, 默认是为空的

    requirepass 123456
    
    1

Redis 远程连接成功

Nginx

来一份简单实用的 nginx.conf 配置

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen  80;
        server_name  localhost;
        location / {
            root   /zheng/zheng-cms-web/;
            index  index.html index.htm;
            add_header Access-Control-Allow-Origin *;
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 修改了 nginx.conf 后, 重新加载配置文件
nginx -s reload
# 停止 nginx
nginx -s stop
# 检查配置文件
nginx -t
1
2
3
4
5
6
IDEA 配置服务器, 直接上传文件

让你体会一下什么是 沉浸式 IDE

配置 Deployment

  1. 配置服务器

  2. 配置本地目录与服务器目录映射关系

  3. 完成配置

  4. 上传本地文件到服务器

  1. 哦了

修改了 html, upload, 刷新, so easy 2017-09-13 22.05.50

Zookeeper

Zookeeper 使用默认配置就可以了, 三种配置方式

  1. 单机
  2. 伪集群
  3. 真集群

这里就不说了, 我使用单机配置, 简单

# 心跳检测毫秒数
tickTime=2000
# follower 初始化连接最长忍受的心跳数时间间隔 2000*10=20秒
initLimit=10
# leader 和 follower 之间发送消息请求和应答时间长度 5*2000=10秒
syncLimit=5
# 数据持久化的目录
dataDir=~/Develop/logs/zookeeper/data
# 日志
dataLogDir=~/Develop/logs/zookeeper/log
# 向 client 暴露的端口
clientPort=2181

# 最大客户端连接数
# maxClientCnxns=60
# 快照个数
# autopurge.snapRetainCount=3
# 快照保存时间间隔小时
#autopurge.purgeInterval=1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

下个插件 zookeeper, 能看到 zookeeper 的节点信息

ActiveMQ

默认配置

略... 😂😂

Tomcat

这里只要一台服务器, 所有就搞个单机多实例的配置, 这里要修改 Tomcat 配置, 让一台服务器上跑 2个 Tomcat, 不为别的, 以为我就一台虚拟机, 意思一下就可以了 😂😂

将解压后的 Tomcat 复制一份 修改 每个 tomcat 实例中 server.xml 中的端口

<?xml version="1.0" encoding="UTF-8"?>
<Server port="9005" shutdown="SHUTDOWN">
  ....
  <Service name="Catalina">
    <Connector port="1111" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="9443" />
    <Connector port="9009" protocol="AJP/1.3" redirectPort="9443" />
    ...
  </Service>
</Server>
1
2
3
4
5
6
7
8
9
10
11

2个 server.xml 只要不一样就行了, 只要确保修改的端口没有被其他程序占用就可以了.

然后一个一个启动吧,如果嫌麻烦, 也可以写脚本一键启动

一个 1111, 另一个 2222

一般都是先把 war 上传到临时目录下, 然后再移动到 webapp 下, 不要在 tomcat 正在运行的时候把 war 直接上传到 webapp 下, 因为一旦上传开始, webapp 下就会有出现 war, 然后 tomcat 就开始解压了,但是这个 war 并不完整, 会出错的

也可以使用上面的方式, 同步本地文件到服务器, 只限于开发, 生产环境你不一定有账号, 二是谁让你没事一直连着生产服务器的?

启动依赖软件

写一个简单的脚本, 一键启动所有依赖

#!/bin/bash
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH
# zookeeper
nohup /usr/local/kafka/bin/zookeeper-server-start.sh /usr/local/kafka/config/zookeeper.properties &
echo "zookeeper 启动完成"
# redis
nohup /usr/local/redis/src/redis-server /usr/local/redis/redis.conf &
echo "redis 启动完成"
# nginx
/usr/local/nginx/sbin/nginx
echo "nginx 启动完成"
# ActiveMQ
/usr/local/activemq/bin/activemq start
echo "activemq 启动完成"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

tomcat 就手动启动吧, 敲敲命名也是好的

😂😂

打包

先修改配置文件

由于 Vagrant 里面没有安装 MySQL, 我就连接本地的了, 一般数据库都是单独的服务器, 正好模拟一下

2017-09-14 11:59 dong4j 更新

这里吐槽一下, 很多配置是写死的, 比如说 dubbo 里面的 zookeeper 注册地址, 没有写到配置文件中去, 所以这里还是改回使用 hosts 的方式.

只修改了 mysql 的地址, 其他的按照原文档修改 hosts

使用 Maven 打包

mvn clean package -Pprod
1

上传

将 4 个包上传到服务器

scp zheng-cms-rpc-service-assembly.tar.gz root@2.2.2.2:/zheng/upload/
...
1
2
# 内容管理系统, 通过 ZhengUpmsRpcServiceApplication.main 方法启动服务提供者
zheng-upms-rpc-service-assembly.tar.gz
# 内容管理系统, 使用 jar 包的方式启动, 通过 ZhengCmsRpcServiceApplication 方法启动服务提供者
zheng-cms-rpc-service-assembly.tar.gz
# 用户权限系统及SSO服务端[端口:1111] 消费端 部属到 tomcat1 1111
zheng-upms-server.war
# 后台管理[端口:2222] 消费端 部属到 tomcat2 2222
zheng-cms-admin.war
1
2
3
4
5
6
7
8

启动

提供者

先解压 2 个包

zheng-cms-rpc-service-assembly.tar.gz
zheng-upms-rpc-service-assembly.tar.gz
1
2
tar -zxvf *.tar.gz
1

分别启动 zheng-upms-rpc-servicezheng-cms-rpc-service

使用对应目录下的 bin/start.sh 脚本

消费者

删除 tomcat1[2]/webapps/ROOT 里的所有文件, 将 war 包分别拷入到 tomcat1 和 tomcat2 下的 webapps/ROOT,

然后使用 unzip 解压

unzip *war
1

如果直接放入 webapps 下, 启动 tomcat 后会自动解压 war 包, 但是请求应用时, 就必须通过 http://ip:port/应用名/资源路径 的方式访问

这里直接解压到 ROOT 目录下, 就不需要知道应用名.

完成

由于是虚拟机, 地址为 2.2.2.2, 所以需要修改我本地的 hosts, 把 域名指向 2.2.2.2

2.2.2.2 ui.zhangshuzheng.cn
2.2.2.2 upms.zhangshuzheng.cn
2.2.2.2 cms.zhangshuzheng.cn
2.2.2.2 pay.zhangshuzheng.cn
2.2.2.2 ucenter.zhangshuzheng.cn
2.2.2.2 wechat.zhangshuzheng.cn
2.2.2.2 api.zhangshuzheng.cn
2.2.2.2 oss.zhangshuzheng.cn
2.2.2.2 config.zhangshuzheng.cn
1
2
3
4
5
6
7
8
9

系统管理

组织管理

权限管理

Redis

Zookeeper

ActiveMQ

遇到的问题

hosts

本来是想不修改 hosts 来部署 zheng 的, 但是大概看了下代码, 发现很多域名和配置都是写死的, 还需要修改数据库, 改动会很大, 就没有心情修改了.

但是 hosts 还是需要修改一下才能在服务器上使用.

  1. 修改 hosts , 将域名指向服务器 ip 这部分是在本地修改

2.2.2.2 ui.zhangshuzheng.cn 2.2.2.2 upms.zhangshuzheng.cn 2.2.2.2 cms.zhangshuzheng.cn 2.2.2.2 pay.zhangshuzheng.cn 2.2.2.2 ucenter.zhangshuzheng.cn 2.2.2.2 wechat.zhangshuzheng.cn 2.2.2.2 api.zhangshuzheng.cn 2.2.2.2 oss.zhangshuzheng.cn 2.2.2.2 config.zhangshuzheng.cn


2. 将服务器依赖软件的 ip 指向服务器
    **这部份是修改服务器的 hosts**
    zookeeper, redis, activemq 都安装在 2.2.2.2 这台服务器上的
    
    ```
127.0.0.1 zkserver
127.0.0.1 rdserver
# 127.0.0.1 dbserver mysql 的 地址修改为了我本地的 mysql 局域网地址是 192.168.31.28
127.0.0.1 mqserver
1
2
3
4
5
6
7
8
9
10

dubbo-monitor

韩都衣舍 的 dubbo-monitor 编译后不能直接用于 dubbo 2.5.3

需要修改 pom.xml

# 由 2.8.4 修改为 2.5.3
<dubbo.version>2.5.3</dubbo.version>

# 排除 dubbo 依赖的 旧版本的 spring
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>${dubbo.version}</version>
    <exclusions>
        ...
        <exclusion>
            <artifactId>spring</artifactId>
            <groupId>org.springframework</groupId>
        </exclusion>
    </exclusions>
</dependency>    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Last Updated: 7/4/2019, 1:15:31 PM