架构探险 从零开始写分布式服务框架pdf

图书网
图书网
图书网
11867
文章
1870
评论
2019年12月12日12:17:47
评论
431
摘要

《架构探险:从零开始写分布式服务框架》能顺利地带领你走出架构险境,让你对分布式服务框架所涉及的技术了然于胸,并能合理地利用这些技术,搭建符合自身需求的分布式服务框架。

架构探险 从零开始写分布式服务框架 作者:李业兵

架构探险 从零开始写分布式服务框架 出版社: 电子工业出版社

架构探险 从零开始写分布式服务框架 内容简介

《架构探险:从零开始写分布式服务框架》的初衷是希望把分布式服务框架的实现细节及分布式服务框架周边的知识点梳理清楚,为那些对分布式服务框架感兴趣的人打开一扇窗户,降低获取相关知识的门槛。所以《架构探险:从零开始写分布式服务框架》围绕实现分布式服务框架所需的知识点,进行了比较详尽细致的介绍。包括常见的RPC框架、常见的序列化/反序列化方案及选型、分布式服务框架服务的发布引入实现细节、软负载实现、底层通信方案实现、服务注册与发现实现、服务治理常见的功能等。通过对这些知识点的逐步讲解,层层深入,最终完成一个可运行的分布式服务框架。

通过《架构探险:从零开始写分布式服务框架》,读者可以完整地了解实现一个分布式服务框架的所有技术细节和实现原理,希望对想了解分布式服务框架实现细节的读者有所启发和帮助。

架构探险 从零开始写分布式服务框架 目录

推荐序:做架构犹如去探险

前言

读者服务

第1章 常用的RPC框架

1.1 RPC框架原理

1.2 RMI介绍

1.2.1 原生RMI代码示例

1.2.2 RMI穿透防火墙

1.3 CXF/Axis2介绍

1.3.1 CXF介绍

1.3.2 Axis2介绍

1.4 Thrift介绍

1.4.1 Thrift工作原理介绍

1.4.2 Thrift IDL语法说明

1.4.3 基于Apache Thrift的Java版完整案例

1.4.4 基于Java注解的简化实现

1.5 gRPC介绍

1.5.1 protobuf3语法介绍

1.5.2 gRPC使用示例

1.6 HTTP Client介绍

1.6.1 构建HttpClient对象

1.6.2 构建URI对象

1.6.3 构建请求对象(HttpGet、HttpPost)

1.6.4 HttpClient发起调用及获取调用返回结果

1.7 实现自己的RPC框架

1.8 RPC框架与分布式服务框架的区别

1.9 本章小结

第2章 分布式服务框架总体架构与功能

2.1 面向服务的体系架构(SOA)

2.1.1 面向服务架构范式

2.1.2 服务拆分原则

2.2 分布式服务框架现实需求

2.3 分布式服务框架总体架构及所需的技术概述

2.4 本章小结

第3章 分布式服务框架序列化与反序列化实现

3.1 序列化原理及常用的序列化介绍

3.2 Java默认的序列化

3.3 XML序列化框架介绍

3.4 JSON序列化框架介绍

3.5 Hessian序列化框架介绍

3.6 protobuf序列化框架介绍

3.7 protostuff序列化框架介绍

3.8 Thrift序列化框架介绍

3.9 Avro序列化框架介绍

3.9.1 Avro介绍

3.9.2 Avro IDL语言介绍

3.9.3 Schema定义介绍

3.9.4 Maven配置及使用IDL与Schema自动生成代码

3.9.5 Avro序列化/反序列化实现

3.10 JBoss Marshalling序列化框架介绍

3.11 序列化框架的选型

3.12 实现自己的序列化工具引擎

3.13 本章小结

第4章 实现分布式服务框架服务的发布与引入

4.1 Spring Framework框架概述

4.1.1 Spring Framework介绍

4.1.2 Spring Framework周边生态项目介绍

4.2 FactoryBean的秘密

4.2.1 FactoryBean的作用及使用场景

4.2.2 FactoryBean实现原理及示例说明

4.3 Spring框架对于已有RPC框架集成的支持

4.3.1 Spring支持集成RPC框架介绍

4.3.2 基于RmiProxyFactoryBean实现RMI与Spring的集成

4.3.3 基于HttpInvokerProxyFactoryBean实现HTTP Invoker与Spring的集成

4.3.4 基于HessianProxyFactoryBean实现Hessian与Spring的集成

4.4 实现自定义服务框架与Spring的集成

4.4.1 实现远程服务的发布

4.4.2 实现远程服务的引入

4.5 在Spring中定制自己的XML标签

4.6 本章小结

第5章 分布式服务框架注册中心

5.1 服务注册中心介绍

5.2 ZooKeeper实现服务的注册中心原理

5.2.1 ZooKeeper介绍

5.2.2 部署ZooKeeper

5.2.3 ZkClient使用介绍

5.2.4 ZooKeeper实现服务注册中心

5.3 集成ZooKeeper实现自己的服务注册与发现

5.3.1 服务注册中心服务提供方

5.3.2 服务注册中心服务消费方

5.3.3 服务注册中心实现

5.4 本章小结

第6章 分布式服务框架底层通信实现

6.1 Java I/O模型及I/O类库的进化

6.1.1 Linux下实现的I/O模型

6.1.2 Java语言实现的I/O模型

6.1.3 Java Classic I/O(Blocking I/O)介绍

6.1.4 Java Non-blocking I/O(NIO)介绍

6.1.5 NIO2及Asynchronous I/O介绍

6.2 Netty使用介绍

6.2.1 Netty开发入门

6.2.2 Netty粘包/半包问题解决

6.3 使用Netty构建服务框架底层通信

6.3.1 构建分布式服务框架Netty服务端

6.3.2 构建分布式服务框架服务调用端Netty客户端

6.4 本章小结

第7章 分布式服务框架软负载实现

7.1 软负载的实现原理

7.2 负载均衡常用算法

7.2.1 软负载随机算法实现

7.2.2 软负载加权随机算法实现

7.2.3 软负载轮询算法实现

7.2.4 软负载加权轮询算法实现

7.2.5 软负载源地址hash算法实现

7.3 实现自己的软负载机制

7.4 软负载在分布式服务框架中的应用

7.5 本章小结

第8章 分布式服务框架服务治理

8.1 服务治理介绍

8.2 服务治理的简单实现

8.2.1 服务分组路由实现

8.2.2 简单服务依赖关系分析实现

8.2.3 服务调用链路跟踪实现原理

8.3 本章小结

附录A 如何配置运行本书完成的分布式服务框架

架构探险 从零开始写分布式服务框架 精彩文摘

7.2负载均衡常用算法

负载均衡常用算法主要有随机、加权随机、轮询、加权轮询、源地址hash等。

7.2.1软负载随机算法实现

随机算法原理为:获取服务列表大小范围内的随机数,将该随机数作为列表索引,从服务提供列表中获取服务提供者。

为负载均衡策略算法定义接口如下:

publicinterfaceClusterStrategy{

publicProviderServiceselect(ListproviderServices);

}

其中接口方法入参providerServices为服务提供者列表。

软负载随机算法的实现过程如下。

importares.remoting.framework.cluster.ClusterStrategy;

importares.remoting.framework.model.ProviderService;

importorg.apache.commons.lang3.RandomUtils;

importjava.util.List;

publicclassRandomClusterStrategyImplimplementsClusterStrategy{

@Override

publicProviderServiceselect(ListproviderServices){

intMAX_LEN=providerServices.size();

intindex=RandomUtils.nextInt(0,MAX_LEN-1);

returnproviderServices.get(index);

}

}

实现原理:获得服务提供者列表大小区间之间的随机数,作为服务提供者列表的索引来获取服务。

7.2.2软负载加权随机算法实现

加权随机算法在随机算法的基础上针对权重做了处理。软负载加权随机算法实现代码如下。

importares.remoting.framework.cluster.ClusterStrategy;

importares.remoting.framework.model.ProviderService;

importcom.google.common.collect.Lists;

importorg.apache.commons.lang3.RandomUtils;

importjava.util.List;

publicclassWeightRandomClusterStrategyImplimplementsClusterStrategy{

@Override

publicProviderServiceselect(ListproviderServices){

//存放加权后的服务提供者列表

ListproviderList=Lists.newArrayList();

for(ProviderServiceprovider:providerServices){

intweight=provider.getWeight();

for(inti=0;i<weight;i++){< p=""></weight;i++){<>

providerList.add(provider.copy());

}

}

intMAX_LEN=providerList.size();

intindex=RandomUtils.nextInt(0,MAX_LEN-1);

returnproviderList.get(index);

}

}

实现原理:首先根据加权数放大服务提供者列表,比如服务提供者A加权数为3,放大之后变为A,A,A,存放在新的服务提供者列表,然后对新的服务提供者列表应用随机算法。

7.2.3软负载轮询算法实现

轮询算法,将服务调用请求按顺序轮流分配到服务提供者后端服务器上,均衡对待每一台服务提供者机器。软负载轮询算法实现代码如下。

importares.remoting.framework.cluster.ClusterStrategy;

importares.remoting.framework.model.ProviderService;

importjava.util.List;

importjava.util.concurrent.TimeUnit;

importjava.util.concurrent.locks.Lock;

importjava.util.concurrent.locks.ReentrantLock;

publicclassPollingClusterStrategyImplimplementsClusterStrategy{

//计数器

privateintindex=0;

privateLocklock=newReentrantLock();

@Override

publicProviderServiceselect(ListproviderServices){

ProviderServiceservice=null;

try{

lock.tryLock(10,TimeUnit.MILLISECONDS);

//若计数大于服务提供者个数,将计数器归0

if(index>=providerServices.size()){

index=0;

}

service=providerServices.get(index);

index++;

}catch(InterruptedExceptione){

e.printStackTrace();

}finally{

lock.unlock();

}

//兜底,保证程序健壮性,若未取到服务,则直接取第1个

if(service==null){

service=providerServices.get(0);

}

returnservice;

}

}

实现原理:依次按顺序获取服务提供者列表中的数据,并使用计数器记录使用过的数据索引,若数据索引到最后一个数据,则计数器归零,重新开始新的循环。

图书网:架构探险 从零开始写分布式服务框架pdf

继续阅读
资源地址:用心发表评论,回复即可查看(字数限制至少10字以上)。
  • 我的微信
  • 扫一扫加好友
  • weinxin
  • 微信公众号
  • 扫一扫关注
  • weinxin
MATLAB编程指南pdf 程序设计

MATLAB编程指南pdf

MATLAB编程指南 作者:付文利,刘刚 MATLAB编程指南 出版社:清华大学出版社 MATLAB编程指南 内容简介 MATLAB是适合多学科、多工作平台、开放性很强的大型科学应用软件。本书以MAT...
Python从菜鸟到高手pdf 程序设计

Python从菜鸟到高手pdf

Python从菜鸟到高手 作者:李宁 Python从菜鸟到高手 出版社:清华大学出版社 Python从菜鸟到高手 内容简介 《Python从菜鸟到高手》从实战角度系统讲解了Python核心知识点以及P...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: