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

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. 01 Python初识

    基础: 1.后缀名是py       ATT: 单个文件执行,后缀无所谓 2.两种执行方式 终端 python+文件路径 解释器内部: 直接执行 3.解释器路径: #/usr/bin/env pyth ...

  2. Jquery中addClass方法不起作用的解决方案

    selected类是要在点击后添加上去的新样式,在点击后,发现没有变化,打开开发者工具,发现selected类已经添加成功了. 在这里没有显示成功的主要原因是后添加的样式表优先级更低,我暂时不清楚具体 ...

  3. Swift get和set方法以及只读属性(计算型属性,本身不保存数据,都是通过计算获得结果)

    import UIKit class Person: NSObject { private var _name: String? var name: String? { get { return _n ...

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

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

  5. springboot maven 部署

    1.在pom.xml文件中配置tomcat插件 <build> <plugins> <plugin> <groupId>org.springframew ...

  6. 《DOM Scripting》学习笔记-——第三章 DOM

    <Dom Scripting>学习笔记 第三章 DOM 本章内容: 1.节点的概念. 2.四个DOM方法:getElementById, getElementsByTagName, get ...

  7. windows from docker 安装部署spring jar包方法

    1.安装docker for windows,去官网下载就可以了,按照官网安装 2.把jar和dockerfile放在一个目录下(target 目录下) Dockerfile: FROM java:8 ...

  8. 浏览器useragent

    var ua = window.navigator.userAgent; edge :Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537 ...

  9. 168. Excel Sheet Column Title (Math)

    Given a positive integer, return its corresponding column title as appear in an Excel sheet. For exa ...

  10. linux环境下tomcat安装

    1.安装tomcat前安装jdk(前提下) 2.下载安装包apache-tomcat-8.0.36.tar.gz    解压:tar -zxvf apache-tomcat-8.0.36.tar.gz ...