分布式架构浅析

涉及的书籍:

大型网站技术架构:核心原理与案例分析
大型网站系统与Java中间件实践
大型分布式网站架构设计与实践
Spring Cloud微服务实战
从Lucene到Elasticsearch全文检索实战

网站:
GitHub:https://github.com/sharpcsu?tab=repositories
结构

什么是大型网站

访问量,数据量,高并发,业务和系统的复杂度

涉及的技术:
通讯协议、远程调用、服务治理,系统安全、存储、搜索、监控、稳定性保障、性能优化、数据分析、数据挖掘等多个领域

网站架构的演化

大型网站架构的演化和生态系统的演化笔记类似:生态系统演化到什么程度依赖于水分、温度和光照,演化的目的是为了更好的争夺阳关进行光合作用。而网站架构演化到什么程度取决于业务的发展。系统架构的演化则是访问量,数据量,高并发,业务和系统的复杂度的增加,更好的服务用户。原有数据库的职责一部分被搜索引擎、缓存替代了

单机 => 数据库与应用分离 => 应用服务集群化 => 读写分离 => 分布式存储系统 => 垂直拆分 => 水平拆分 => 应用拆分

单机模式
数据库与应用分离
应用服务集群化

应用服务化

演进过程中遇到的问题

  1. 应用服务器集群化后的session问题

Cookie传递session
粘性回话
回话复制
分布式session缓存服务器

  1. 数据库读写分离后问题

主从复制,异步和同步

  1. 引入缓存

缓存失效:主动失效,被动失效

  1. 数据库水平拆分的问题

SQL路由问题

解决方案:中间件

服务框架
数据访问层
消息中间件

服务框架:对应用拆分,完成服务化,解决集群间通讯问题
数据访问层:完成数据库的拆分及数据库的管理、扩容、前移工作,可以方便的访问已分库、分表的数据库节点
消息中间件:异步和解耦,削峰填谷

在这里插入图片描述

服务框架

对应用拆分,完成服务化,解决集群间通讯问题

服务注册查找中心
客户端负载均衡:随机、轮询、权重,多机房处理

Spring Cloud Eureka
Eureka服务端:@EnableEurekaServer discover-server
Eureka客户端:@EnableDiscoveryClient app-manager

高可用Eureka

高可用注册中心:Eureka Server的高可用是将自己作为服务向其它服务注册中心注册自己。

服务注册中心:失效剔除、自我保护
服务提供者:服务注册、服务同步、服务续约
服务消费者:获取服务、服务调用、服务下线

在这里插入图片描述

消息中间件

消息模型:Queue(点对点), Topic(发布/订阅)

在这里插入图片描述

互联网安全

  • 数字摘要
    防止信息篡改,不可逆,MD5、SHA

  • 对称加密
    加密和解密的密钥相同,速度快、效率高,长用于对内容加密

  • 非对称加密
    公钥、私钥,

  • 数字签名:验证通讯双方合法性
    数字摘要与非对称加密结合运用

  • 数字证书
    由权威机构颁发,带有公钥信息

  • Oauth协议
    在不获取用户密码的情况下保障ISV对数据的访问是经过授权的合法行为

备注:

广泛使用对称与非对称加密算法结合使用的办法,达到安全与时间的平衡。非对称加密传输密钥,对称加密传输内容

HTTPS:保证通讯过程中数据不被第三方监听或截取

HTTPS = HTTP + SSL

https协议在HTTP协议与TCP协议间增加了安全层,所有请求和响应数据在经过网络传输之前都会进行加密。
HTTPS协议能够确保整个通讯过程是加密的,密钥随机产生,通过数字证书验证通讯双方的身份。通讯内容使用对称加密。

部署HTTPS Web:
Tomcat单向认证配置,tomcat双向认证配置

在这里插入图片描述

微服务

微服务主要由几个部分组成
在这里插入图片描述

微服务-Spring Boot

  • 通过设计大量的自动化配置等方式来简化Spring原有样板化的配置
  • spring-boot-starter-web:全栈web开发模块,包含嵌入式tomcat、Spring MVC
  • 应用监控与管理actuator

Spring Boot属性加载顺序:

命令行中传入的参数
以json格式配置在系统环境变量中的内容SPRING_APPLICATION_JSON属性
java:comp/env中的JNDI属性
Java的系统属性
操作系统的环境变量
通过random.*配置的随机属性
位于当前jar包之外,针对不同{profile}环境的配置文件内容
位于当前jar包之内,针对不同{profile}环境的配置文件内容
位于当前jar包之外的application.properties和YAML配置内容
位于当前jar包之内的application.properties和YAML配置内容
在@Configuration注解修改的类中,通过@PropertySource注解定义的属性
应用默认属性,使用SpringApplication.setDefaultProperties定义的内容

微服务-客户端负载均衡:Spring Cloud Ribbon

一个基于HTTP和TCP的客户端负载均衡工具,将面向服务的REST模板请求自动转换成客户端负载均衡的服务调用。客户端负载均衡和服务端负载均衡最大的区别在于服务清单所存储的位置。服务消费者直接通过调用被@LoadBalanced注解修饰的RestTemplate来实现面向服务的接口调用。

负载均衡策略:
Ribbon默认的策略是简单轮询,修改负载均衡策略
user-service: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

微服务-服务容错保护:Spring Cloud Hystrix

Hystrix是一个延迟和容错库,一种保护机制。具备服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并以及服务监控等功能。
@EnableHystrixDashboard hystrix-dashboard

@HystrixCommand(fallbackMethod = “queryByIdFallBack”)声明一个降级的方法

在这里插入图片描述

微服务-API 网关服务:Spring Cloud Zuul

网关的核心功能是过滤和路由
Proxy-server项目

使用场景:
登录校验,请求鉴权,异常处理,服务调用时长统计,

在这里插入图片描述
备注:

请求生命周期图解,首先是pre类型的过滤器进行处理,主要是对请求做一些前置加工,比如请求校验等。第二个阶段是routing,路由请求转发阶段。Post类型的过滤器对结果进行一些加工和转换。三个阶段产生的异常会触发error,最后还是流向post处理器。

微服务-分布式配置中心:Spring Cloud Config

分布式配置中心是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息、加密/解密信息等访问接口。

@EnableConfigServer config-server,码云配置

{cipher}标识一个加密值

基础机构
在这里插入图片描述

微服务-分布式跟踪服务:Spring Cloud Sleuth

一个前端请求会形成一个复杂的分布式服务调用链路,如何实现全链路的跟踪。

Sleuth app-service
在请求到达分布式系统的入口时,服务跟踪框架为该请求创建唯一跟踪标识TradeID,每个工作单元会有一个跟踪标识SpanID,一个完整的请求会形成一个树状结构。

收集日志的平台ELK,Zipkin

Elasticsearch

Elasticsearch-简介

Lucene专注于底层搜索建设,Elasticsearch专注于企业应用。Elasticsearch的底层api是由Lucene提供的,每个Elasticsearch节点上都有一个Lucene引擎支持。

在这里插入图片描述
Elasticsearch的优点:
分布式、全文检索、近实时搜索和分析、高可用、模式自由、RESTful API

核心概念:
集群:默认集群elasticsearch、
节点:拥有几分相似特征的文档集合、
索引、
类型、
文档:Elasticsearch中基本单位、
分片:默认5、
副本:默认1

索引是把文档写入Elasticsearch的过程,搜索是匹配查询条件找出文档的过程。

Elasticsearch-分片

Elasticsearch分片在索引创建时确认,不能扩大,只能按照原始分片数的因子缩小。

路由机制:当索引一个文档时文档会被存储到master节点上的一个主分片上。Elasticsearch的路由机制是通过哈希算法,将具有相同哈希值的文档放置到同一个主分片中。
Elasticsearch使用文档的id将文档平均分布于所有的分片上,导致Elasticsearch无法确定文档的位置,master将请求广播到所有的分片上执行。主分片的数量在索引创建时是固定的,如果分片的数量改变,原有的路由值就会变成非法,文档相当于丢失。

Elasticsearch中分片和数据库中的只读库类似,都是为了提高读取的速度。

Elasticsearch-索引模板

模板是一种复用机制

{
“order”: 0, // 模板优先级
“template”: “sample_info*”, // 模板匹配的名称方式
“settings”: {…}, // 索引设置
“mappings”: {…}, // 索引中各字段的映射定义
“aliases”: {…} // 索引的别名
}

template大致分成setting和mappings两部分:
settings主要作用于index的一些相关配置信息,如分片数、副本数,tranlog同步条件、refresh等。
mappings主要是一些说明信息,大致又分为_all、_source、prpperties这三部分:
properties:这是最重要的步骤,主要针对索引结构和字段级别上的一些设置

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值