借鉴架构示意图:

实例介绍:

公司某项目架构

服务器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 $`
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 '\r'`
SERVER_PROTOCOL=`sed '/dubbo.protocol.name/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`
SERVER_PORT=`sed '/dubbo.protocol.port/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`
LOGS_FILE=`sed '/dubbo.log4j.file/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'` 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
if [ -n "$SERVER_PORT" ]; then
SERVER_PORT_COUNT=`netstat -tln | grep $SERVER_PORT | wc -l`
if [ $SERVER_PORT_COUNT -gt ]; 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 "\n" ":"` 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 >& | grep -i -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 >& | /usr/sbin/cronolog $LOGS_DIR/stdout.%Y-%m-%d.log > /dev/null >& & 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 $`
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
fi #启动服务
nohup java $JMX $JAVA_OPTS -classpath $CLASSPATH $SERVER_INFO $MAIN_CLASS >& | /usr/sbin/cronolog $LOG_PATH/stdout.%Y-%m-%d.log > /dev/null >& & #判断服务是否启动成功
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"

关于dubbo+zookeeper微服务的一些认识记录的更多相关文章

  1. springboot+dubbo+zookeeper微服务实践demo

    微服务化越来越火,实际上是应互联网时代而生的,微服务化带来的不仅是性能上的提升,更带来了研发组织的更加便利,协作更加轻松,团队效能更高. 当然不能为了技术而技术,我们需要切合实际的对业务进行划分,降低 ...

  2. 传统保险企业基于 Dubbo 的微服务实践

    本文整理自中国人寿保险(海外)股份有限公司深圳中心技术总监家黄晓彬在 Dubbo 社区开发者日深圳站的现场分享. 中国人寿保险(海外)股份有限公司负责香港.澳门.新加坡和印尼的业务开发,和国内业务不同 ...

  3. ZooKeeper+Dubbo+SpringBoot 微服务Demo搭建

    1. 首先创建springBoot项目,springBoot是一堆组件的集合,在pom文件中对需要的组件进行配置.生成如下目录结构 创建test项目,同步在test创建dubbo-api,dubbo- ...

  4. Dubbo与微服务

    http访问到服务器要经过的内容:Nginx —Tomcat –db,nginx就是一个负载均衡左右.又一次面试问到了我nginx的反向代理.现在想了想面试官要问的应该是 域名的反向代理,就是使用一个 ...

  5. 分布式应用开发 | SpringBoot+dubbo+zookeeper实现服务注册发现 | 远程服务调用

    前言 通过新建两个独立服务--提供者.消费者,模拟两个独立分布的应用,通过使用dubbo+zookeeper来实现远程服务调用. 目录 项目搭建 provider-server consumer-se ...

  6. 玩转 SSH(七):使用 dubbo + zookeeper 实现服务模块化

    一.创建 SSMVCAnnoDemo 项目 点击菜单,选择“File -> New Project” 创建新项目.选择使用 archetype 中的 maven-quickstart 模版创建. ...

  7. springboot多模块开发以及整合dubbo\zookeeper进行服务管理

    之前研究了springboot单工程的使用,参考git地址:https://github.com/qiao-zhi/springboot-ssm 下面研究springboot多模块开发的过程. 1.模 ...

  8. Java学习之Dubbo+ZooKeeper分布式服务Demo

    背景:在之前的一个<Java学习之SpringBoot整合SSM Demo>分享中说到搭建ZooKeeper和Dubbo分布式框架中遇到了一些技术问题没能成功,只分享了其中的一个中间产物, ...

  9. dubbo+zookeeper注册服务报错问题:No service registed on zookeeper

    2019-04-04 11:23:40,372 ERROR [tomcat-threads--1] (com.bill99.dolphin.controller.ExceptionController ...

随机推荐

  1. C# 给现有PDF文档添加页眉、页脚

    概述 页眉页脚是一篇完整.精致的文档的重要组成部分.在页眉页脚处,可以呈现的内容很多,如公司名称.页码.工作表名.日期.图片,如LOGO.标记等.在之前的文章中介绍了如何通过新建一页空白PDF页来添加 ...

  2. ELK 日志采集 实战教程

    概要 带着问题去看教程: 不是用logstash来监听我们的日志,我们可以使用logback配置来使用TCP appender通过TCP协议将日志发送到远程Logstash实例. 我们可以使用Logs ...

  3. 【代码笔记】Web-CSS-CSS盒子模型

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  4. HTML和CSS前端教程03-CSS文本样式

    目录 1.CSS颜色-建议就用十六进制 2.CSS长度的度量单位-建议就用px 3.CSS文本样式 3.1. 字体属性 3.1. 文本样式 1.CSS颜色-建议就用十六进制 p{ color: #ff ...

  5. 2019-02-20 在PyPI测试平台发布Python包

    参考Packaging Python Projects, 源码在nobodxbodon/test-package-for-pypi 包名/__init__.py: 测试变量 = "值&quo ...

  6. C# 使用NPOI出现超过最大字体数和单元格格式变成一样的解决

    在使用NPOI写入Excel文件的时候出现“它已经超出最多允许的字体数”,查询资料发现是字体创建太多的原因,需要将常用字体创建好,传入CellStyle中.参考(http://www.cnblogs. ...

  7. iOS-----------关于组件化

      打一个比较形象的比喻,把APP比作我们的人体,把胳膊.大腿.心.肝.肺这些人体器官比作组件,各个器官分别负责他们各自的功能,但是他们之间也有主次之分,试想我们的胳膊.大腿等是不能独立完成某个任务的 ...

  8. 从零学习Fluter(三):Flutter的路由跳转以及state的生命周期

    今天继续研究Flutter,我是在flutter1.0发布后,才玩flutter的,发现在此之前,许多人已经先发制人,玩起了flutter,不知不觉中,我已经被别人摔在了起跑线上,玩过flutter后 ...

  9. MongoDB:数据库介绍与基础操作

    二.部署在本地服务器 在上次的学习过程中,我们主要进行了MongoDB运行环境的搭建和可视化工具的安装.此次我们将学习MongoDB有关的基本概念和在adminmongo上的基本操作.该文档中的数据库 ...

  10. SQL语句中不同的连接JOIN

    为了从两个表中获取数据,我们有时会用JOIN将两个表连接起来.通常有以下几种连接方式: JOIN  or  INNER JOIN(内连接) : 这两个是相同的,要求两边表同时有对应的数据,返回行,任何 ...