《分布式服务架构》读后感

最近乘着项目的空档期,大略的读了一下《分布式服务架构》一书。这本书首先介绍了分布式微服务与SOA服务的对比。从而衍生出对应的相关微服务相关的知识点。 它主要讲的不是技术,而是一种习惯。代码,架构,风格以及后期运维的习惯。

其实现在自己写的项目虽然用到了微服务的很多特点,但是自我感觉和书中的微服务理念有些矛盾。比如现在项目将所有向外部的RPC接口都集中于另一个项目之中,造成后期更新的时候需要两个项目都做对应调整。

下面总结了一下本书我觉得最有用处的章节,以供自己回忆复习:

1.整个服务搭建的流程集团已经很标准化。Pandora Boot已经是主流的框架。它相当于一个升级版的Spring boot。继承了Spring的所有优点:例如通过MAVEN的定制化标签,快速创建spring boot应用等等。 全程没有XML配置,也不需要代码生成。

2.目前公司大部分使用的是HSF服务取代了Dubbo。 原因是HSF在处理注册中心十万级别应用比dubbo更有优势,更轻。还有服务降级,服务熔断,链路跟踪等优势。

3.大数据的log日志管理:现在使用的是Slf4j框架来做日志管理。它的优势就是应用程序可以只依赖于Slf4j来实现日志打印,具体的日志实现是由配置来决定使用log4j还是logback等。这样就可以在不改变应用代码的前提下切换底层的日志实现。

Tips:项目在打日志的时候也会对应用的性能造成影响(因为在某些并发的时候,日志可能会加锁)。对于这个解决方式:根据不同的环境:生产环境,日常环境,预发环境来精炼自己的log。比如在像生产环境中比较稳定的环境中就可以适当的去掉一些DEBUG级别的log。第二可以在logback-spring.xml配置使用异步的appender。as shown below:

4.本书最大的收获就是给出了很多Java运维时候需要用到的相关命令(inculde linux),还给出了作者相对应的排查过程:下面是我总结的比较有用的一些命令:

Linux 操作:

Linux log 日志查看:

1.根据两个时间点查看日志:sed -n '/2017-06-04 14:06:27/,/2017-06-04 14:06:34/p'  test.log (可以查看时间点之间的日志)

 

2.输出最后一次匹配grep条件的数据行的前后各10行:(借助tail命令取最后几行)

grep  -n  -C10  'R0619'  caps-biz.txt | tail -n 21 | less(借助less命令的/pattern可以高亮搜索词)

grep  -n  -C10  '条件'  文件名 | tail -n 21 | less(借助less命令的/pattern可以高亮搜索词)

 

2018-11-26 10:37 -2018-11-26 11:04

3.Grep 命令 用法大全

 参数: 

-I :忽略大小写 
-c :打印匹配的行数 
-l :从多个文件中查找包含匹配项 
-v :查找不包含匹配项的行 
-n:打印包含匹配项的行和行标 

 

4.查看Java进程,排除eclipse上的进程

ps -ef | grep java | grep -v eclipse

 

5.jmap 对Java内存使用情况进行统计:

a.jmap -histo:live processId  

按照占用空间的大小打印程序中类的列表,从这个列表中可以分析哪些类占用了比较多的内存,再结合代码找到问题的所在

b.jmap processId 

按照占用空间的大小打印程序中加载的动态链接库的列表。

c.jmap -heap processId

查看堆的概要信息

 

都不能解决的时候,最终方案:导出Java堆的快照,然后通JMAAT等工具详细分析。

jmap -dump:format=b,file=./heap.hprof processId

 

 

6.如果想用在阿里生产机器上使用java命令,需要cd /opt/java 然后找到对应的bin 就可以使用java语句了。(./java -version)

 

7.jstat 是JDK自带的监控工具,在JDK的根目录里可以找到。使用示范:(可以看到JVM内部更个区域的使用占比和GC消耗的时间):S0,S1,E,O,M 

jstat -gcutil processId 5000 10

 

8.jstack processId:

jstack 命令用于打印给定的Java进程ID的线程堆栈快照信息,从而可以看到java进程内线程的执行状态,正在执行的任务等,可以据此分析线程等待,死锁等问题

 

9.uptime:查看机器的启动时间,登陆用户数,平均负载情况。可以用于线上应急或者技术公关中确定操作系统重启的时间。平均负载数量是CPU内核中运行的平均数。通常情况一个CPU的进程数量不超过3个的话就说明服务比较健康。

 

10.使用curl可以在Restful的测试中起到作用。

 

11.pidstat -urd -p processID

用于监控全部或指定的进程占用系统资源的情况,包括CPU,内存,磁盘I/O,线程切换,线程数等数据。

 

12.pmap -d 2862

此命令用来显示比较底层的进程模块占用内存的信息,并且可以打印内存的起止地址等,用于定位深层次JVM或者操作系统的内存问题

 

13.netstat -nap | grep processID

根据进程ID查找进程开启的端口。

 

14.netstat -nap |grep 端口

根据端口查找进程

 

<think>好的,我需要帮助用户理解分布式网站的定义和相关概念,以及其工作原理。首先,用户提到了他们想了解分布式网站的定义及其工作原理,并且参考了之前提供的引用内容。我需要综合这些引用中的信息,尤其是关于分布式架构、事务处理、存储系统等方面的内容,来构建一个清晰的回答。 首先,确定分布式网站的定义。根据引用[5],分布式系统涉及微服务、文件系统、缓存和消息队列等组件。可以将分布式网站定义为利用这些分布式技术构建的网站系统,通过多节点协作提高性能、可用性和扩展性。 接下来是核心特征。引用[5]提到了高可用性、可扩展性、透明性和容错性。需要将这些特征具体化,例如通过冗余部署、负载均衡、微服务拆分等实现。比如,引用[1]中讨论的分布式数据库架构可以支持数据存储的扩展性,而引用[4]的MapReduce处理大数据则体现了计算能力的扩展。 然后是工作原理部分。需要分模块说明,可能包括架构分层、请求处理流程、数据管理和事务协调。例如,引用[5]中的微服务架构适合分布式系统,每个服务独立部署;负载均衡如LVS(用户之前的问题)用于分发请求;分布式数据库(引用[1])和缓存(引用[5])处理数据存储;消息队列(引用[5])用于解耦组件;分布式事务(引用[2]、[3])确保数据一致性。 技术挑战方面,引用[2]和[3]提到分布式事务的复杂性,如Seata框架如何处理事务协调。数据一致性可以通过引用[1]中的数据库技术和引用[5]的冗余存储来实现。网络延迟和故障恢复则涉及引用[4]中MapReduce的容错机制和引用[5]中的高可用设计。 应用场景部分,可以结合电商、社交平台、金融系统等,引用[5]中的例子,如高并发、海量数据处理需求,说明分布式网站的实际应用。 最后,生成相关问题,需要围绕定义、组件、事务处理、数据一致性、与单体架构对比等方面提问,确保覆盖用户可能感兴趣的深入话题。 需要确保回答结构清晰,使用用户指定的格式,如行内公式用$...$,独立公式用$$...$$,并正确引用提供的参考文献。同时,语言要简洁明了,帮助用户逐步理解分布式网站的各个方面。</think>### 分布式网站的定义与工作原理 #### 一、分布式网站的定义 **分布式网站**是通过网络将计算、存储、服务等资源分布在多个物理或逻辑节点上协同工作的网站系统。其核心目标是利用多节点并行处理能力,解决**高并发、高可用性、可扩展性**等需求,同时通过冗余设计提升系统容错能力[^5]。 与单体架构不同,分布式网站的关键特征包括: 1. **去中心化**:无单一控制节点,各节点通过协议协同 2. **资源共享**:计算、存储、网络资源动态分配 3. **透明性**:用户感知为单一逻辑服务(如访问淘宝时无需关心后端服务器分布) 4. **故障隔离**:局部故障不影响全局服务[^1][^5] #### 二、核心组成与工作原理 ##### 1. 架构分层 典型分布式网站架构包含以下层级(以电商平台为例): - **接入层**:通过负载均衡(如LVS、Nginx)分发请求 $$ \text{请求分配策略:} \quad P_i = \frac{W_i}{\sum_{j=1}^n W_j} \cdot Q $$ 其中$W_i$为服务器权重,$Q$为总请求量 - **服务层**:微服务架构(如商品服务、订单服务)独立部署[^5] - **数据层**:分布式数据库(如MySQL Cluster)、缓存(如Redis Cluster)、文件系统(如HDFS)[^1][^4] - **协调层**:ZooKeeper等工具管理节点状态与配置 ##### 2. 请求处理流程 1. **用户请求** → 负载均衡器(如LVS)→ 路由至某服务节点 2. **服务调用**:通过RPC/Dubbo调用其他微服务(如订单服务调用库存服务) 3. **数据操作**: - 读操作:优先访问分布式缓存(减少数据库压力) - 写操作:通过分布式事务(如Seata的AT模式)保证一致性[^3] 4. **结果返回**:聚合各服务响应后返回用户 ##### 3. 关键技术实现 - **分布式事务协调**: - **两阶段提交(2PC)**:协调者主导事务提交/回滚,存在阻塞风险 - **TCC模式**:通过`Try-Confirm/Cancel`三个阶段实现最终一致性[^2] - **Seata框架**:使用全局事务ID(XID)关联分支事务,通过回滚日志(undolog)实现补偿[^3] - **数据一致性保障**: - **CAP定理**:分布式系统在一致性(C)、可用性(A)、分区容忍性(P)中最多满足两项 - **最终一致性**:通过版本号(Vector Clock)或Paxos算法实现异步同步[^1] #### 三、技术挑战与解决方案 | 挑战类型 | 典型问题 | 解决方案示例 | |------------------|-----------------------------|----------------------------------| | **网络通信** | 延迟波动、丢包 | 超时重试机制、熔断器模式(Hystrix) | | **数据一致性** | 跨节点事务冲突 | 分布式锁(Redisson)、MVCC多版本控制 | | **资源调度** | 热点服务负载不均 | 一致性哈希算法、动态权重调整 | | **故障恢复** | 脑裂问题(Split-Brain) | Quorum机制、Lease租约协议[^5] | #### 四、典型应用场景 1. **高并发电商平台**: - 使用LVS/Nginx实现流量分发 - 通过Redis集群缓存商品详情 - 采用Seata处理订单-库存分布式事务[^3] 2. **社交媒体平台**: - 用户动态存储在HDFS分布式文件系统[^4] - 消息队列(如Kafka)处理实时互动数据 3. **金融交易系统**: - 基于Paxos/Raft实现强一致性 - 使用TCC模式保证资金转账原子性[^2] ```python # 分布式锁简单实现示例(基于Redis) import redis from redis.lock import Lock r = redis.Redis(host='redis-cluster', port=6379) def distributed_task(): lock = Lock(r, "resource_lock", timeout=30) if lock.acquire(blocking=True, block_timeout=5): try: # 执行需要互斥的操作 print("Acquired lock, processing task...") finally: lock.release() ``` #### 五、与传统单体架构对比 | 维度 | 单体架构 | 分布式网站 | |--------------|---------------------------|------------------------------| | **扩展性** | 垂直扩展(提升单机性能) | 水平扩展(增加节点) | | **可用性** | 单点故障导致服务中断 | 故障自动转移(如Keepalived) | | **开发效率** | 代码耦合度高,部署简单 | 需要服务发现、链路追踪等基础设施 | | **适用规模** | QPS<1000的中小型系统 | QPS>10万的大型系统[^1] | --- ### 相关问题 1. 分布式网站如何实现会话(Session)的跨节点共享? 2. CAP定理在实际工程中如何权衡取舍? 3. 分布式锁的实现方式有哪些?各有什么优缺点? 4. 微服务架构与SOA架构的核心区别是什么? 5. 如何设计一个高可用的分布式消息队列系统?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值