基于Nginx和Zookeeper实现Dubbo的分布式服务
一、前言
公司的项目基于阿里的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的分布式服务的更多相关文章
- 基于spring及zookeeper的dubbo工程搭建
一.生产者搭建 新建一个maven工程,勾选Create a simple project Packaging方式选择jar包的方式. 修改pom.xml文件: <project xmlns=& ...
- java使用netty模拟实现一个类dubbo的分布式服务调用框架
本文较长,如果想直接看代码可以查看项目源码地址: https://github.com/hetutu5238/rpc-demo.git 要想实现分布式服务调用框架,我们需要了解分布式服务一般需要的功能 ...
- Spring-boot:5分钟整合Dubbo构建分布式服务
概述: Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,Dubbo采用的是一种非常 ...
- Dubbo(一) 开始认识Dubbo,分布式服务框架
引言: 以前的车马很慢,一生只够爱一个人以前的网站人很少,一个单应用服务着一个人--------------------现在,动不动就谈什么高并发,千万级访问.单应用?BOOM!分分钟爆炸.于是,技术 ...
- Dubbo[一个分布式服务框架
http://alibaba.github.io/dubbo-doc-static/User+Guide-zh.htm#UserGuide-zh-API%E9%85%8D%E7%BD%AE http: ...
- Spring Boot Dubbo 构建分布式服务
概述: 节点角色说明 节点 角色说明 Provider 暴露服务的服务提供方 Consumer 调用远程服务的服务消费方 Registry 服务注册与发现的注册中心 Monitor 统计服务的调用次数 ...
- spring boot-18.使用dubbo发布分布式服务
我们新建两个项目分别模拟服务的提供者和服务的消费者,spring boot 集成dubbo主要分为以下几个步骤: 1.安装zookeeper 推荐使用docker 安装,使用以下几个命令即可完成 (1 ...
- 基于nginx与zookeeper的API Gateway实现笔记 - 环境搭建
为了简化操作,采用操作系统为CentOS 8. 首先需要编译出libzookeeper,在官网下载最新的zookeeper源码,或者github上clone一个,地址为:https://github. ...
- springboot2.0+dubbo整合分布式服务发布和调用
最近项目上要对以前的老项目做分布式的整改,因此我专门花了点时间研究下当前比较热门的dubbo和springboot结合使用,以前使用过dubbo,但是没有与springboot结合过,在网上查了点资料 ...
随机推荐
- 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 ...
- 《转》Xcode 6 正式版如何创建一个Empty Application
Xcode 6 正式版里面没有Empty Application这个模板,这对于习惯了纯代码编写UI界面的程序员来说很不习惯. 有网友给出了一个解决方法是,把Xcode 6 beta版里面的模板复制过 ...
- IT轮子系列(一)——DropDownList 的绑定,你秒懂了吗
前言 最近猛然惊觉(说是猛然,是因为自己工作那么多年,居然不自知.不反省),在开发中,自己碰到一些常用的功能代码块,还是习惯性的baidu,然后copy....这样的操作,不知自己重复了多少遍.现在回 ...
- 使用 focus() 和 blur()
<html> <head> <style type="text/css"> a:active {color:green} </style& ...
- Jquery测试题
一.Jquery测试题 下面哪种不是jquery的选择器?(单选) A.基本选择器 B.后代选择器 C.类选择器 D.进一步选择器 考点:jquery的选择器 (C) 当DOM加载完成后要执行的函数, ...
- EJB 介绍
EJB 编辑 EJB是sun的服务器端组件模型,设计目标与核心应用是部署分布式应用程序.凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台.EJB (Enterprise ...
- Angular集成UEditor
1.Ueditor的集成主要通过把UEditor做成一个Component来实现,先上Component代码: import { AfterContentInit, Component, Input, ...
- 怎样看Mac的日志
Mac自带的日志查看工具Console,注意Console和Terminal不是一码事,后者是CLI环境,前者是GUI日志查看工具.在应用里面搜索Console即可找到,里面的界面和Windows的日 ...
- JSP Debug日志
2006年末一篇blog,那时候好生涩啊: 先谈两个关于reponse.sendRedirect()函数的问题 : 1.在Servlet的处理流或JSP的页面流中,sendRedirect( ...
- Java获取当日的起始时间,结束时间,现在时间,是否在时间段中。
当日的起始时间 public static Date getTodayStartTime() { Calendar todayStart = Calendar.getInstance(); today ...