读了一下,个人认为最好的部分,就是第四章了。

CH04 服务框架

4.2 服务设计与实现

// 获取可用服务地址列表

// 确定调用服务目标机器

// 建立连接(Socket)

// 请求序列化

// 发送请求

// 接收结果

// 解析结果

调用接口声明(ConsumerBean)

  1. 接口名称
  2. 版本

运行时服务框架与应用和容器的关系

  1. 服务框架自身的部署问题

  2. 实现自己的服务框架所依赖的一些外部jar与应用自身依赖的jar包之间的冲突。

  3. 服务框架依赖到应用本身

  4. 服务框架作为容器的一部分。(或者服务框架自身变为一个容器)

    ==> ClassLoader隔离。

将服务框架自身用的类与应用用到的类都控制在User-Defined Class Loader级别,实现隔离。(web容器之间隔离,以及OSGI对不同Bundle的隔离。)

有时候,遇到需要运行时统一版本的情况,需要服务框架比应用优先启动

服务注册中心(随机、轮询、权重)

实际过程中,计算需要的线程总数是很困难的。(控制慢方法)

  1. 增加资源保证系统的能力超出需求
  2. 隔离这些资源,快慢分离、重要级别分离。

需要把路由的规则做的更细致一些,基于具体方法来进行路由。

通过接口定位到服务地址列表,根据接口加方法名从规则中得到一个服务地址列表,再和刚才的地址列表取交集。

机房问题:

服务注册中心与机房甄别。机房是否对等呢?

调用端的流控处理:

  1. 根据服务端自身的接口、方法做控制,也就是针对不同的接口、方法设置不同的阈值,这是为了使服务端的不同接口、方法之间的负载不相互影响。
  2. 根据来源做控制,也就是对于同样的接口、方法,根据不同来源设置不同的限制,这一般用在比较基础的服务上,也就是多个集群使用同样的服务时,根据请求来源的不同级别等进行不同的流控处理。

==> 服务调用的协议扩展性、向后兼容性是需要重点考虑的。

NIO:

  1. Oneway,只管发送不关心结果。
  2. Callback (建议处理,新线程调用)
  3. Futrue (方便的并行处理)
  4. 可靠消息

异步

graph TB
数据入队-->生成通信对象;
生成通信对象-->等待;
等待-->处理结果;
数据入队-->数据队列;
数据队列-->IO线程;
SOCKET连接-->IO线程;
IO线程-->SOCKET连接;
通信对象队列-->等待;
通信对象队列-->定时任务;
生成通信对象-->通信对象队列;
通信对象队列-->IO线程;
graph TB
数据入队-->继续处理;
数据入队-->数据队列;
数据队列-->IO线程;
IO线程-->SOCKET连接;

服务暴露:(ProviderBean)

  1. 服务接口
  2. 实现
  3. 版本
  4. 分组

服务端的通信部分,也要采用NIO。

执行不同服务的线程隔离,不会出现争抢线程资源。

graph TB;
  网络通信层-->协议解析/反序列化;
  协议解析/反序列化--> 定位服务;
  定位服务--> 线程池1;
  定位服务--> 线程池2;
  定位服务--> 线程池3;

4.2.5 服务升级

  1. 增加方法
  2. 修改调用参数列表(直接修改难,版本号解决,设计考虑参数的扩展性)

4.3 实战中的优化

  1. 服务拆分
  2. 服务粒度
  3. 优雅和实用的平衡
  4. 分布式中的请求合并

    ==> 问题,怎么确定只有一个服务在做这个事情。

4.4 服务治理

服务信息:

  • 服务编码
  • 支持编码注册
  • 根据编码定位服务信息

服务质量:

  • 最好、最差的服务排名
  • 各个服务的质量
  • 各种查询条件的支持

服务容量:

  • 服务容量和当前水位
  • 根据水位高低排序
  • 各种查询条件的支持

服务依赖:

  • 依赖服务展示
  • 被依赖展示
  • 依赖变化

服务分布:

  • 服务在不同机房分布
  • 服务在不同机柜分布
  • 分布不均衡的服务列表

服务统计:

  • 被调用次数统计和排名
  • 出错次数统计和排名
  • 出错率统计和排名
  • 响应时间统计和排名
  • 出错率趋势

服务元数据:

  • 服务的方法和参数

服务查询:

  • 服务的应用负责人、测试负责人
  • 服务所属的应用名称
  • 服务发布时间
  • 服务提供者的地址列表
  • 服务容量
  • 服务质量
  • 服务调用次数
  • 服务依赖
  • 服务版本以及归组信息

服务报表:非实时统计,不同时段的对比。

服务监控:提供对于服务运行时关键数据的采集、规则处理和警告。(提供决策的数据基础)

4.2 服务管理

服务上下线:

  • 针对一个服所有机器的上线和下线操作。
  • 针对指定机器的上线和下线操作。
  • DoubleCheck控制

服务路由:

  • 路由管理界面支持
  • 路由信息更改前后对比和校验
  • 路由配置多版本管理和回滚
  • DoubleCheck控制

服务限流降级:

  • 根据调用来源限流
  • 根据具体服务限流
  • 针对服务开关降级
  • 流控、降级配置多版本管理和回滚
  • DoubleCheck控制

服务归组:

  • 归组归组的多版本管理和回滚
  • 归组规则预览
  • 归组规则的影响范围评估
  • DoubleCheck 控制

服务线程池管理:

  • 调用方服务线程管理,主要是最大并发的管理
  • 服务端线程工作状态查询
  • 服务端针对不同服务的多个业务的管理
  • DoubleCheck 控制

机房规则:

  • 规则查询和发布校验
  • 规则多版本管理和回滚
  • DoubleCheck 控制

服务授权:

  • 授权息查询
  • 授权规则多版本支持和回滚
  • DoubleCheck 控制

《大型网站系统与Java中间件实践》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. 到底什么是哈希Hash?

    知识点总结 ---------------------------------------------------------------------------------------------- ...

  2. halcon分离路径名称

    用haclon程序将目录名分离的算法. ParseFileName:='F:/D705/4-20/缺陷/81.bmp' parse_filename(ParseFileName, BaseName, ...

  3. jquery 返回浏览器顶部

    经常在网页中看到有这样的现象,点击一个按钮,然后页面会跳到页面的中指定的位置,那这种效果是怎么实现的呢? 很多网页都有这种效果:返回顶部或者跳到不同的楼层(以下是天猫的效果) 实现原理: 1.我们来看 ...

  4. canvas刮刮乐游戏等

    裁剪 ctx.clip():当前路径外的区域不再绘制 <canvas id="cans" width=500 height=500></canvas> &l ...

  5. Swagger使用

    Swagger 1.集成springboot 第一步:pom <dependency> <groupId>io.springfox</groupId> <ar ...

  6. linux下安装haproxy作为端口转发服务器,以及安装keepalived作为haproxy高可用方案

    一.安装haproxy作为端口转发服务器(主服务器:172.28.5.4,备服务器:172.28.5.8,浮点IP为:172.28.5.6) 1.安装依赖包 yum -y install wget g ...

  7. datatables插件提示Cannot reinitialise DataTable的解决办法

    这个错误是由于重新设置数据源,又没有将原来的数据清空导致的. 网上有很多解决方案,试了都不管用. 最后找到一种方法,将原来的table销毁,再初始化. 方法是在datatable初始化的时候加入属性 ...

  8. linux 部分常用命令

    1.Linux 删除除了某个文件之外的所有文件 [root@localhost abc]# ls |grep -v 'a' |xargs rm -f 其中rm -f  !(a) 最为方便.如果保留a和 ...

  9. python--第十天总结(线程、进程和协程)

    Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import t ...

  10. nginx命令启动及选项

    [root@ke]# nginx -h  #this help [root@ke]# nginx -t  #检查配置文件的语法 [root@ke]# nginx -T  #检查配置文件的语法并输出 [ ...