分布式学习1--分布式和技术介绍

1. 分布式的形成

1.传统架构

开始系统由于使用的用户较少, 整个系统创建一个工程即可, 各个功能模块都在这个工程下面

2.传统架构优化

随着用户访问量的增加, 传统架构无法承载这么高的访问, 于是可以考虑把系统拆分为前台系统和后台管理系统, 并且同时开启多个服务器, 使用nginx负载均衡把用户的访问分散到各个系统上, 减小访问压力

3.分布式架构

随着用户访问量的进一步增加, 上面的系统也无法承载这么高的访问量了. 于是可以考虑把各个功能模块都建成独立的工程, 每个功能模块都是一个服务, 并且搭配nosql缓存, nginx负载均衡等技术, 使系统能够承载更大的访问和并发

SOA:Service Oriented Architecture面向服务的架构。也就是把工程都拆分成服务层工程、表现层工程。服务层中包含业务逻辑,只需要对外提供服务即可。表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。工程都可以独立部署。

2. 分布式的问题以及技术方案

0. 基本概念

分布式: 将系统按照功能模块等拆分为多个独立的服务, 可以单独为某一个节点添加服务器,需要系统之间配合才能完成整个业务逻辑

集群:相当于同一个工程代码拷贝多份部署到多台服务器,每台服务器单独独立部署运行

 

1.Dubbo

首先创建Maven父工程, 然后在该工程下面创建子工程, 包括project_web(前端工程), project_manage(后端工程, 里面可以继续划分为dao模块, interface模块, service模块, pojo模块等), project_common(工具类模块), 各模块之间相互调用可以通过添加maven依赖的方式. 如果后面随着项目的扩张, 可能还会增加搜索服务, 会员服务, 订单服务等, 就可以继续在Maven父工程中添加子工程就可以了

但是, 将各个服务独立开之后, 随着服务增多, 服务间的通信会变得越来越复杂. 比如商品服务可能会调用用户服务, 订单服务, 搜索服务等

如何实现系统间通信

1).使用WebService: 基于soap协议(http+xml), 效率不高, 在项目中不推荐使用.

2).使用restful形式的服务: (http+json), 项目中应用较多(HttpURLConnection, HttpClient等), 但随着服务的增多, 服务间调用变得越来越复杂, 也不适合分布式服务使用

3).使用Dubbo: Dubbo使用rpc协议进行远程调用, 直接使用socket通信. 传输效率高, 可以统计服务间的调用关系, 调用次数, 管理服务

 Dubbo的客户端和服务端有三种连接方式,分别是:广播,直连和使用zookeeper注册中心

Dubbo注册中心方式的架构

Registry, 注册中心, 其中官方推荐使用zookeeper作为注册中心

Provider就是服务提供者, 可以将后端服务注册到zookeeper注册中心

Consumer就是服务消费者, 前端要调用后端服务, 就可以直接找注册中心要, 注册中心会把地址发给前端服务, 然后前端服务直接去调用后端服务

Monitor就是监控中心, 可以查看服务间的调用调用关系, 调用次数等

Container就是Dubbo依赖的容器, 就是Spring容器

 

2.Redis

首页有许多资源显示, 比如轮播的图片, 热门商品排行等, 如果每次访问一次首页, 就从数据库查询一次, 非常消耗数据库资源, 增加数据库访问压力, 然后就可以使用nosql技术来做缓存, 比如使用redis数据库

思路就是每次访问页面, 加载页面资源时, 先去redis数据库查询有没有缓存, 如果有缓存, 直接加载缓存数据就可以了, 减少数据库访问压力, 如果没有缓存, 就去数据库查询, 把查询的结果返回给页面, 同时将结果缓存到redis数据库中, 下一个请求再访问页面时, 就可以直接拿redis的缓存了

 

数据同步问题

redis中缓存的数据可能与数据库中数据不一致, 怎么办呢, 可以在某一条数据的增, 删, 改操作时删除redis中的缓存, 这样下一次访问页面时, redis没有这条数据的缓存, 会重新缓存, 这样就和数据库数据一致了.

 

redis的持久化

redis中存的数据是在内存中的, 这样如果服务崩溃, 那么内存中的数据就被释放了, 因此需要持久化技术, 把内存中的缓存持久化到磁盘中, redis持久化方式

1.RDB: 快照形式 (定期将当前时刻的数据保存磁盘中) 会产生一个dump.rdb文件, redis默认开启RDB

特点:会存在数据丢失,性能较好,数据备份。

2.AOF:  append only file  (所有对redis的操作命令记录在aof文件中),恢复数据,重新执行一遍即可。

特点:每秒保存,数据比较完整,耗费性能。

 

redis集群

单个redis对高并发的访问承载有限, 因此可以通过搭建redis集群, 提高系统的承载能力

redis集群架构细节:

(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.

(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.通过投票机制

(3)客户端与redis节点直连,不需要中间proxy.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可

(4)redis-cluster把所有的物理节点映射到[0-16383]slot,cluster 负责维护node<->slot<->value

Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点

 

3.Solr索引库

页面中的搜索框, 直接搜索也会直接访问数据库, 为了减小数据库的压力, 可以使用Solr索引库, 将要搜索的数据添加到索引库, 减少数据库压力, 同理, 为了减小Solr的压力, 也可以使用集群的方式对Solr索引进行集群

 

数据同步问题

商品修改之后, 也要相应的修改Solr索引库中的数据, 保持数据的一致性, 由于Solr采用了集群方式, 修改某一条数据, 可能要同时通知多个Solr, 那么会很麻烦, 因此可以使用MQ消息队列机制

 

4.MQ消息队列

修改了数据, 将数据发送给MQ, 然后solr集群去监听MQ

MQ是一个消息中间件,比如:ActiveMQ、RabbitMQ、kafka都属于MQ,是MQ的产品

 

ActiveMQ的消息形式

对于消息的传递有两种类型:

一种是点对点的,即一个生产者和一个消费者一一对应;

另一种是发布/订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进行接收。

 

5.网页静态化--FreeMarker

为了减小服务的访问压力, 可以使用网页静态化技术

什么是静态化?

       通过一些技术手段(Freemarker/valocity)将动态的页面(jsp,asp.net,php) 转换成静态的页面,通过浏览器直接访问静态页面。

为什么要静态化?

       通过浏览器直接访问静态的页面,不需要经过程序处理,它的访问速度高。

       稳定性好。

       更有效的防止安全漏洞问题,比如不易遭受黑客攻击。

       静态的页面更容易被搜索引擎收录。

怎么样实现?

可以使用freemarker实现网页静态化。

FreeMarker是一个用Java语言编写的模板引擎,它基于模板输出文本。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等。

 

6.Nginx反向代理和负载均衡

为了提高服务的并发量, 可以将服务部署在多个服务器上形成集群, 然后通过nginx反向代理服务器访问服务器集群, 分散压力

Nginx是一款高性能的http 服务器/反向代理服务器电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师Igor Sysoev用c语言所开发,官方测试nginx能够支支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定。开源。

反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。

可以把多个tomcat服务器节点配置到同一个域名下, 这样nginx会采用轮询的方式, 分散请求到各个服务器, 减小访问压力

 

nginx的高可用

如果nginx只有一个, 那么nginx挂掉的话, 整个服务就挂了, 因此可以通过keepalived+nginx实现主备

使用keepalived维护着主nginx服务和一个nginx备份服务, 正常情况下, 访问nginx主服务, 并且nginx备份服务不停的向nginx主服务发送消息, 如果主nginx没有回应, 那么就是主nginx挂掉了, 因此keepalived就会使用备份服务, 等到主服务正常了, 在切换回主服务

 

7.单点登录Single Sign On

由于系统被划分为多个独立的服务了, 对于传统的架构模式, 可以将登录信息存在session中, 但是分布式架构会有多个tomcat服务器, 因此需要在某一个系统中登录之后, 其它系统也就不需要重复登录就能进入, 就是单点登录

分布式的单点登录可以采用Redis服务器存储登录信息, 当用户登录之后, 为这个用户生成一个token(令牌, 保证唯一性, 使用uuid即可), 然后把tonken存到redis服务器, 同时写入到客户端的cookie中, 当用户访问其它子系统时, 子系统服务会获取cookie中的token, 然后去redis服务器中查询有没有对应的键值, 如果有就允许如需进入系统, 同时更新token信息, 如果没有或者过期, 就跳转到登录界面. 单点登出也是同理, 某一点登出, 就删除token和cookie, 这样其它系统也就无法登录了

 

以上就是对分布式系统架构的常用技术进行了梳理, 后面还有许多需要学习的内容

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值