一、前言

公司的项目基于阿里的Dubbo微服务框架开发。为了符合相关监管部门的安全要求,公司购买了华东1、华东2两套异地服务器,一套是业务服务器,一套是灾备服务器。准备在这两套服务器上实现Dubbo的分布式服务,如下图:

这里只罗列了部分服务器作为参考说明。其中 api 是消费者服务,driver 和 order 是 提供者服务。华东1 和 华东 2 分别是两个局域网,局域网内可用内网通信。两个局域网只能通过外网通信。

二、消费者分布式服务

消费者的分布式是通过 Nginx 配置负载均衡和反向代理实现的。我们把 Nginx 部署在华东1的 api 服务器上,Nginx的配置如下:

1、负载均衡

    #gzip  on;
upstream tomcatServer {
#华东1服务器走内网
server 192.168.27.101:8680 weight=10;
#华东2服务器走外网
server 139.159.257.207:8680 weight=10;
}

2、反向代理

    # HTTPS server
#
server {
listen 443 ssl;
server_name api.gogo.cn; ssl_certificate /usr/local/certapi/api.pem;
ssl_certificate_key /usr/local/certapi/api.key; ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on; proxy_connect_timeout 500;
proxy_send_timeout 500;
proxy_read_timeout 500;
client_max_body_size 200m;
location / {
# root html;
# index index.html index.htm;
proxy_pass http://tomcatServer/;
}
}

三、提供者分布式服务

Dubbo 将 zookeeper 当作注册表来实现微服务框架。zookeeper 其实已经帮我们做好了负载均衡,如上图:我们把不同服务器上 driver、order 同时注册到同一个zookeeper 中,当我们调用 driver、order 服务时,zookeeper 会在两台服务器之间权衡分配,做负载均衡。在 applicationContext.xml 做如下配置...

服务提供者:

    <!-- dubbo 配置 -->
<dubbo:application name="ts_provider_order"/>
<dubbo:registry address="${zookeeper.host}"/>
<dubbo:protocol name="dubbo" port="-1"/>
<dubbo:provider timeout="60000" retries="0" threadpool="cached" threads="1000" accepts="1000"/>
<dubbo:consumer check="false"/>
<dubbo:annotation package="com.soft.ts"/>

服务消费者:

    <!-- dubbo 配置 -->
<dubbo:application name="ts_admin"/>
<dubbo:registry address="${zookeeper.host}" />
<dubbo:protocol name="dubbo" port="-1" />
<dubbo:consumer check="false" timeout="60000" retries="0"/>
<dubbo:annotation package="com.soft.ts"/>

开始,由于 zookeeper 安装在华东1, 我们把华东1的所有提供者服务都以内网的形式注册到 zookeeper 中,整个华东1的服务是正常运行起来了!但是在部署华东2的服务时,发现华东2在调用华东1相关服务的时候,走的竟然是华东1的内网(自然走不通,报错了)。查了相关资料,说要配置 /etc/hosts。好吧,那就配置吧:

1、服务器的主机名

2、配置 /etc/hosts

vim /etc/hosts

如上,在每台服务器配置上本机外网地址和主机名。

配置完 /etc/hosts 后,试着部署了华东2的服务,发现还是不行,调用华东1相关服务的时候走的竟然还是内网。咋办嘞?

最后,没办法,把华东1的相关服务都以外网的形式注册到 zookeeper 中。成功解决问题!

四、Linux 文件共享

实现分布式服务有个问题就是文件共享。比如我们系统中,将 api 所在的服务器作为图片服务器,那么,华东1 和 华东 2 的图片文件夹就要实现共享,只有这样,访问任意一个api服务才不会出现图片路径不存在的问题。

第一台服务器

1、安装 rpcbind 与 nfs

yum install nfs-utils.x86_64
yum install rpcbind

2、编辑export写入共享方的ip与目录

vim /etc/exports

写入:/home/wwwroot/upload 139.159.257.207(rw,sync,no_root_squash)

tips:rw 表示读写;sync 表示随时写入同步;no_root_squash 表示如果用户是root,则对该目录具有root权限。

3、启动rpcbind与nfs

service rpcbind start
service nfs start

第二台服务器

1、安装nfs

yum install nfs-utils

2、执行挂载命令

mount -t nfs -o rw 139.159.250.7:/home/wwwroot/upload/ /home/wwwroot/upload/

基于Nginx和Zookeeper实现Dubbo的分布式服务的更多相关文章

  1. 基于spring及zookeeper的dubbo工程搭建

    一.生产者搭建 新建一个maven工程,勾选Create a simple project Packaging方式选择jar包的方式. 修改pom.xml文件: <project xmlns=& ...

  2. java使用netty模拟实现一个类dubbo的分布式服务调用框架

    本文较长,如果想直接看代码可以查看项目源码地址: https://github.com/hetutu5238/rpc-demo.git 要想实现分布式服务调用框架,我们需要了解分布式服务一般需要的功能 ...

  3. Spring-boot:5分钟整合Dubbo构建分布式服务

    概述: Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,Dubbo采用的是一种非常 ...

  4. Dubbo(一) 开始认识Dubbo,分布式服务框架

    引言: 以前的车马很慢,一生只够爱一个人以前的网站人很少,一个单应用服务着一个人--------------------现在,动不动就谈什么高并发,千万级访问.单应用?BOOM!分分钟爆炸.于是,技术 ...

  5. Dubbo[一个分布式服务框架

    http://alibaba.github.io/dubbo-doc-static/User+Guide-zh.htm#UserGuide-zh-API%E9%85%8D%E7%BD%AE http: ...

  6. Spring Boot Dubbo 构建分布式服务

    概述: 节点角色说明 节点 角色说明 Provider 暴露服务的服务提供方 Consumer 调用远程服务的服务消费方 Registry 服务注册与发现的注册中心 Monitor 统计服务的调用次数 ...

  7. spring boot-18.使用dubbo发布分布式服务

    我们新建两个项目分别模拟服务的提供者和服务的消费者,spring boot 集成dubbo主要分为以下几个步骤: 1.安装zookeeper 推荐使用docker 安装,使用以下几个命令即可完成 (1 ...

  8. 基于nginx与zookeeper的API Gateway实现笔记 - 环境搭建

    为了简化操作,采用操作系统为CentOS 8. 首先需要编译出libzookeeper,在官网下载最新的zookeeper源码,或者github上clone一个,地址为:https://github. ...

  9. springboot2.0+dubbo整合分布式服务发布和调用

    最近项目上要对以前的老项目做分布式的整改,因此我专门花了点时间研究下当前比较热门的dubbo和springboot结合使用,以前使用过dubbo,但是没有与springboot结合过,在网上查了点资料 ...

随机推荐

  1. DB Query Analyzer 6.01 is released, SQL Execute Schedule function can be used

       DB Query Analyzer is presented by Master Gen feng, Ma from Chinese Mainland. It has English versi ...

  2. 《转》Xcode 6 正式版如何创建一个Empty Application

    Xcode 6 正式版里面没有Empty Application这个模板,这对于习惯了纯代码编写UI界面的程序员来说很不习惯. 有网友给出了一个解决方法是,把Xcode 6 beta版里面的模板复制过 ...

  3. IT轮子系列(一)——DropDownList 的绑定,你秒懂了吗

    前言 最近猛然惊觉(说是猛然,是因为自己工作那么多年,居然不自知.不反省),在开发中,自己碰到一些常用的功能代码块,还是习惯性的baidu,然后copy....这样的操作,不知自己重复了多少遍.现在回 ...

  4. 使用 focus() 和 blur()

    <html> <head> <style type="text/css"> a:active {color:green} </style& ...

  5. Jquery测试题

    一.Jquery测试题 下面哪种不是jquery的选择器?(单选) A.基本选择器 B.后代选择器 C.类选择器 D.进一步选择器 考点:jquery的选择器 (C) 当DOM加载完成后要执行的函数, ...

  6. EJB 介绍

    EJB 编辑   EJB是sun的服务器端组件模型,设计目标与核心应用是部署分布式应用程序.凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台.EJB (Enterprise  ...

  7. Angular集成UEditor

    1.Ueditor的集成主要通过把UEditor做成一个Component来实现,先上Component代码: import { AfterContentInit, Component, Input, ...

  8. 怎样看Mac的日志

    Mac自带的日志查看工具Console,注意Console和Terminal不是一码事,后者是CLI环境,前者是GUI日志查看工具.在应用里面搜索Console即可找到,里面的界面和Windows的日 ...

  9. JSP Debug日志

    2006年末一篇blog,那时候好生涩啊: 先谈两个关于reponse.sendRedirect()函数的问题 :      1.在Servlet的处理流或JSP的页面流中,sendRedirect( ...

  10. Java获取当日的起始时间,结束时间,现在时间,是否在时间段中。

    当日的起始时间 public static Date getTodayStartTime() { Calendar todayStart = Calendar.getInstance(); today ...