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

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. Spring 中 Bean 的生命周期

    所谓 Bean 的生命周期,就是一个 Bean 从创建到销毁,所经历的各种方法调用.大致包含下面几个方法(不是全部) Bean 的实例化,调用了构造方法. 使用 setter 方法填充属性. 一旦依赖 ...

  2. 【JVM底层策略 一】GC roots如何判断对象不可达

    查找内存中不再使用的对象 引用计数法 引用计数法就是如果一个对象没有被任何引用指向,则可视之为垃圾.这种方法的缺点就是不能检测到环的存在. 2.根搜索算法 根搜索算法的基本思路就是通过一系列名为”GC ...

  3. [持续交付实践] pipeline使用:项目样例

    项目说明 本文将以一个微服务项目的具体pipeline样例进行脚本编写说明.一条完整的pipeline交付流水线通常会包括代码获取.单元测试.静态检查.打包部署.接口层测试.UI层测试.性能专项测试( ...

  4. 推特算法,分布式ID

    package casclient_demo1.util; import java.lang.management.ManagementFactory; import java.net.InetAdd ...

  5. uva-993-贪心

    题意:给你一个数字y,生成另外一个最小的数字x,使得x里面的每一位相乘等于y 解题思路:直接贪心就是,x里面的每一位都小于等于9 #include <string> #include< ...

  6. django 数据库查询的几个知识点

    django查询db过程中遇到的几个问题: 1. 数据库切换,用using products = models.TProductCredit.objects.using(') 2.查询结构集是Quer ...

  7. svn的下载及安装

    什么是SVN: SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS. SVN的下载安装: 下载地址:https: ...

  8. Nginx 工作原理

    Nginx 工作原理 Nginx由内核和模块组成. Nginx本身做的工作实际很少,当它接到一个HTTP请求时,它仅仅是通过查找配置文件将此次请求映射到一个location block,而此locat ...

  9. 整数中1出现的次数(从1到n整数中1出现的次数)(python)

    题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...

  10. easyui 回车搜索

    代码: js: // 搜索 $("#searchButton").click(function() { var ip = $("#searchIp").val( ...