zoukankan      html  css  js  c++  java
  • 关于dubbo+zookeeper微服务的一些认识记录

    借鉴架构示意图:

    实例介绍:

    公司某项目架构

    服务器A:nginx

    服务器BC:tomcat1、tomcat2

    服务器D:Dubbo+zookeeper

    服务器EF:db1+zookeeper、db2+zookeeper

    服务器D中某服务端项目模块信息如下:

    [root@xxx danny-service]# ls
    bin  conf  lib  logs
    [root@xxx danny-service]# ls conf/
    dubbo.properties

    dubbo.properties配置信息如下图:

    zookeeper配置文件如下:(3台zk配置一样,组成集群)

    启动服务后主从选举如下:(选举其中一台为leader)

    简单概括

    这是dubbo+zookeeper构建的微服务架构。(使用zookeeper作为dubbo的注册中心)这是一个分布式项目,web层和service层被拆分开了,部署在不同的tomcat中。
    因为这两个运行在不同 tomcat下的服务无法直接互调接口,就通过微服务架构的方式实现。zookeeper服务(存储service对象url),web端取对象,且server端存对象和web端取对象没关系, 实现c/s 异步通信。 同时,在这个微服务架构里面,为了保持注册中心(zookeeper)的高可用性,分别在三台服务器上部署了zookeeper,通过dubbo.service.loadbalance=roundrobin算法选择一台作为leader ,其他作为follower,注册中心的数据都以leader为准。一台zk机器成为leader的条件是这台机器是可用的,且被超过半数的机器(zookeeper)选举为leader。基于这种实现方式,选择zk集群的数量时最好为奇数个,
    最少为3个,这样只要有超过半数的zk机器存活那注册中心就是可用的。

    附:dubbo框架提供main方法启动容器之脚本启动

    dubbo下载地址

    https://github.com/dangdangdotcom/dubbox

    下载包:dubbox-master.zip

    解压即可看到脚本模板文件

    稍稍修改即可用

    生产实例修改后启动脚本 :

    1.server端启动脚本

    #!/bin/bash
    cd `dirname $0`
    BIN_DIR=`pwd`
    cd ..
    DEPLOY_DIR=`pwd`
    CONF_DIR=$DEPLOY_DIR/conf
    
    SERVER_NAME=`sed '/dubbo.application.name/!d;s/.*=//' conf/dubbo.properties | tr -d '
    '`
    SERVER_PROTOCOL=`sed '/dubbo.protocol.name/!d;s/.*=//' conf/dubbo.properties | tr -d '
    '`
    SERVER_PORT=`sed '/dubbo.protocol.port/!d;s/.*=//' conf/dubbo.properties | tr -d '
    '`
    LOGS_FILE=`sed '/dubbo.log4j.file/!d;s/.*=//' conf/dubbo.properties | tr -d '
    '`
    
    if [ -z "$SERVER_NAME" ]; then
        SERVER_NAME=`hostname`
    fi
    
    PIDS=`ps -f | grep java | grep "$CONF_DIR" |awk '{print $2}'`
    if [ -n "$PIDS" ]; then
        echo "ERROR: The $SERVER_NAME already started!"
        echo "PID: $PIDS"
        exit 1
    if [ -n "$SERVER_PORT" ]; then
        SERVER_PORT_COUNT=`netstat -tln | grep $SERVER_PORT | wc -l`
        if [ $SERVER_PORT_COUNT -gt 0 ]; then
            echo "ERROR: The $SERVER_NAME port $SERVER_PORT already used!"
    
    LOGS_DIR=""
    if [ -n "$LOGS_FILE" ]; then
        LOGS_DIR=`dirname $LOGS_FILE`
    else
    if [ ! -d $LOGS_DIR ]; then
        mkdir $LOGS_DIR
    fi
    STDOUT_FILE=$LOGS_DIR/stdout.$(date +%Y-%m-%d).log
    
    
    LIB_DIR=$DEPLOY_DIR/lib
    LIB_JARS=`ls $LIB_DIR|grep .jar|awk '{print "'$LIB_DIR'/"$0}'|tr "
    " ":"`
    
    JAVA_OPTS=" -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true "
    JAVA_DEBUG_OPTS=""
    if [ "$1" = "debug" ]; then
        JAVA_DEBUG_OPTS=" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n "
    fi
    JAVA_JMX_OPTS=""
    if [ "$1" = "jmx" ]; then
        JAVA_JMX_OPTS=" -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false "
    fi
    JAVA_MEM_OPTS=""
    BITS=`java -version 2>&1 | grep -i 64-bit`
    if [ -n "$BITS" ]; then
        JAVA_MEM_OPTS=" -server -Xmx512m -Xms512m -Xmn256m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -DenableProxy=true -DproxyIp=10.51.162.201 -DproxyPort=8888"
    else
        JAVA_MEM_OPTS=" -server -Xms1g -Xmx1g -XX:PermSize=128m -XX:SurvivorRatio=2 -XX:+UseParallelGC "
    fi
    
    echo -e "Starting the $SERVER_NAME ...c"
    nohup java $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS -Ddubbo.properties.file=dubbo.properties -classpath $CONF_DIR:$LIB_JARS com.alibaba.dubbo.container.Main 2>&1 | /usr/sbin/cronolog $LOGS_DIR/stdout.%Y-%m-%d.log > /dev/null 2>&1 &
    
    
    
    echo "OK!"
    PIDS=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}'`
    echo "PID: $PIDS"
    echo "STDOUT: $STDOUT_FILE"

     PS:Dubbo将自动加载classpath根目录下的dubbo.properties,可以通过JVM启动参数:-Ddubbo.properties.file=xxx/xxx/dubbo.properties 改变缺省配置位置。

    2.web端启动脚本

    #!/bin/sh
    cd `dirname $0`
    BIN_DIR=`pwd`
    cd ..
    
    # 设置项目代码路径
    CODE_HOME=`pwd`
    
    zookeeper_address='10.51.122.111:2181,10.122.112.181:2181,10.51.122.113:2181'
    IPADD=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"`
    
    
    #日志路径
    export LOG_PATH=$CODE_HOME/logs
    mkdir -p $LOG_PATH
    
    # 设置依赖路径
    export CLASSPATH="$CODE_HOME/WEB-INF/classes:$CODE_HOME/WEB-INF/lib/*"
    
    #JMX
    export JMX="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=18090 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=$IPADD"
    
    
    # JVM启动参数
    export JAVA_OPTS="-server -Xms1g -Xmx2g -Xss256k -XX:MaxDirectMemorySize=128m"
    
    # 服务端端口、上下文、项目根配置
    export SERVER_INFO="-Dserver.port=8090  -Dserver.contextPath=/  -Dserver.docBase=$CODE_HOME -DvantopURL=http://192.168.1.1:81/ -Ddubbo.registry.address=$zookeeper_address -Dzookeeper.address=$zookeeper_address -DenableProxy=true -DproxyIp=10.51.162.201 -DproxyPort=8888"
    
    #10.51.162.201:8888是前端服务器跑的一个squid透明缓存代理服务
    
    
    # 启动类
    export MAIN_CLASS=com.vgtech.vancloud.web.startup.TomcatBootstrap
    
    #判断服务是否运行
    PIDS=`ps -ef | grep java | grep "server.port=8090" |awk '{print $2}'`
    if [ -n "$PIDS" ]; then
        echo "ERROR: The Service already started!"
        echo "PID: $PIDS"
        exit 1
    fi
    
    #启动服务
    nohup java $JMX $JAVA_OPTS -classpath $CLASSPATH $SERVER_INFO $MAIN_CLASS 2>&1 | /usr/sbin/cronolog $LOG_PATH/stdout.%Y-%m-%d.log > /dev/null 2>&1 &
    
    #判断服务是否启动成功
    echo "Service startup success"
    PIDS=`ps -ef | grep java | grep "server.port=8090" | awk '{print $2}'`
    echo "PID: $PIDS"
    echo "STDOUT: $LOG_PATH/stdout.$(date +%Y-%m-%d).log"
  • 相关阅读:
    Python之迭代器,生成器
    Python函数--装饰器进阶
    Python之函数的本质、闭包、装饰器
    Python之函数--命名空间、作用域、global、nonlocal、函数的嵌套和作用域链
    Python函数的定义与调用、返回值、参数
    Python之文件操作
    Python之集合
    基本数据类型补充,深浅copy
    Python基础-元组、列表、字典
    Python常用模块(一)
  • 原文地址:https://www.cnblogs.com/dannylinux/p/10509635.html
Copyright © 2011-2022 走看看