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

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. suricata HTTP关键字

    http request http request请求包括请求行.请求头.空行和内容.一个普通的request请求如下: http response http response应答包括应答行,头部,空 ...

  2. Spring------生命周期

    Spring------生命周期 转:https://blog.csdn.net/qq_42112846/article/details/81368862 如图所示: 一下就是对上图的解释: Spri ...

  3. java 栈 最大深度

      1. 概述 某公司面试,总监大叔过来,问了图论及栈的最大深度,然后^_^ 一直记着,今天搞一下 2. 代码 package com.goodfan.test; public class JavaS ...

  4. scrapy-logging

    import logging logger = logging.getLogger(__name__) # 当前文件位置 logger.warning('haha') # debug info 201 ...

  5. 两个时间点计算相隔几年,几个月,几天-java

    本文采用Calendar 实现 ,当然也可以用java8提供的愉快且方便的时间处理- LocalDate import java.text.ParseException; import java.te ...

  6. JavaScript: RegExp check UserName

    Function : We can use regular expressions to check user input data formats. Homework: Check user inp ...

  7. 最适合入门的Laravel中级教程(一)

    Laravel 是一个全栈框架: 我们使用 Laravel 开发业务常见有 3 个方向: 前端页面和后端逻辑混合的应用 主要是面向对 SEO 有需求的项目: 比如说新闻资讯博客文章等: 一般在控制器中 ...

  8. 人工智能为什么选择Python语言?

    作为新手,在面对广泛应用于企业级应用开发的 Java.游戏客户端开发的 C++.嵌入式开发的 C.人工智能领域的 Python 等数百种编程语言时,你会如何选择自己的第一门编程语言? 作者 | JAC ...

  9. Object.assign()解释整理

    链接:https://blog.csdn.net/wang252949/article/details/79106160 语法 Object.assign(target, ...sources) 参数 ...

  10. Java虚拟机 内存区域划分

    (图片来自https://www.cnblogs.com/whgk/p/6138522.html) 先从线程私有区开始介绍 虚拟机栈 Java虚拟机栈是由一个个栈帧组成的,当一个方法被调用时,代表这个 ...