《大型网站系统与Java中间件实践》
读了一下,个人认为最好的部分,就是第四章了。
CH04 服务框架
4.2 服务设计与实现
// 获取可用服务地址列表
// 确定调用服务目标机器
// 建立连接(Socket)
// 请求序列化
// 发送请求
// 接收结果
// 解析结果
调用接口声明(ConsumerBean)
- 接口名称
- 版本
- 组
运行时服务框架与应用和容器的关系
服务框架自身的部署问题
实现自己的服务框架所依赖的一些外部jar与应用自身依赖的jar包之间的冲突。
服务框架依赖到应用本身
服务框架作为容器的一部分。(或者服务框架自身变为一个容器)
==> ClassLoader隔离。
将服务框架自身用的类与应用用到的类都控制在User-Defined Class Loader级别,实现隔离。(web容器之间隔离,以及OSGI对不同Bundle的隔离。)
有时候,遇到需要运行时统一版本的情况,需要服务框架比应用优先启动
服务注册中心(随机、轮询、权重)
实际过程中,计算需要的线程总数是很困难的。(控制慢方法)
- 增加资源保证系统的能力超出需求
- 隔离这些资源,快慢分离、重要级别分离。
需要把路由的规则做的更细致一些,基于具体方法来进行路由。
通过接口定位到服务地址列表,根据接口加方法名从规则中得到一个服务地址列表,再和刚才的地址列表取交集。
机房问题:
服务注册中心与机房甄别。机房是否对等呢?
调用端的流控处理:
- 根据服务端自身的接口、方法做控制,也就是针对不同的接口、方法设置不同的阈值,这是为了使服务端的不同接口、方法之间的负载不相互影响。
- 根据来源做控制,也就是对于同样的接口、方法,根据不同来源设置不同的限制,这一般用在比较基础的服务上,也就是多个集群使用同样的服务时,根据请求来源的不同级别等进行不同的流控处理。
==> 服务调用的协议扩展性、向后兼容性是需要重点考虑的。
NIO:
- Oneway,只管发送不关心结果。
- Callback (建议处理,新线程调用)
- Futrue (方便的并行处理)
- 可靠消息
异步
graph TB
数据入队-->生成通信对象;
生成通信对象-->等待;
等待-->处理结果;
数据入队-->数据队列;
数据队列-->IO线程;
SOCKET连接-->IO线程;
IO线程-->SOCKET连接;
通信对象队列-->等待;
通信对象队列-->定时任务;
生成通信对象-->通信对象队列;
通信对象队列-->IO线程;
graph TB
数据入队-->继续处理;
数据入队-->数据队列;
数据队列-->IO线程;
IO线程-->SOCKET连接;
服务暴露:(ProviderBean)
- 服务接口
- 实现
- 版本
- 分组
服务端的通信部分,也要采用NIO。
执行不同服务的线程隔离,不会出现争抢线程资源。
graph TB;
网络通信层-->协议解析/反序列化;
协议解析/反序列化--> 定位服务;
定位服务--> 线程池1;
定位服务--> 线程池2;
定位服务--> 线程池3;
4.2.5 服务升级
- 增加方法
- 修改调用参数列表(直接修改难,版本号解决,设计考虑参数的扩展性)
4.3 实战中的优化
- 服务拆分
- 服务粒度
- 优雅和实用的平衡
- 分布式中的请求合并
==> 问题,怎么确定只有一个服务在做这个事情。
4.4 服务治理
服务信息:
- 服务编码
- 支持编码注册
- 根据编码定位服务信息
服务质量:
- 最好、最差的服务排名
- 各个服务的质量
- 各种查询条件的支持
服务容量:
- 服务容量和当前水位
- 根据水位高低排序
- 各种查询条件的支持
服务依赖:
- 依赖服务展示
- 被依赖展示
- 依赖变化
服务分布:
- 服务在不同机房分布
- 服务在不同机柜分布
- 分布不均衡的服务列表
服务统计:
- 被调用次数统计和排名
- 出错次数统计和排名
- 出错率统计和排名
- 响应时间统计和排名
- 出错率趋势
服务元数据:
- 服务的方法和参数
服务查询:
- 服务的应用负责人、测试负责人
- 服务所属的应用名称
- 服务发布时间
- 服务提供者的地址列表
- 服务容量
- 服务质量
- 服务调用次数
- 服务依赖
- 服务版本以及归组信息
服务报表:非实时统计,不同时段的对比。
服务监控:提供对于服务运行时关键数据的采集、规则处理和警告。(提供决策的数据基础)
4.2 服务管理
服务上下线:
- 针对一个服所有机器的上线和下线操作。
- 针对指定机器的上线和下线操作。
- DoubleCheck控制
服务路由:
- 路由管理界面支持
- 路由信息更改前后对比和校验
- 路由配置多版本管理和回滚
- DoubleCheck控制
服务限流降级:
- 根据调用来源限流
- 根据具体服务限流
- 针对服务开关降级
- 流控、降级配置多版本管理和回滚
- DoubleCheck控制
服务归组:
- 归组归组的多版本管理和回滚
- 归组规则预览
- 归组规则的影响范围评估
- DoubleCheck 控制
服务线程池管理:
- 调用方服务线程管理,主要是最大并发的管理
- 服务端线程工作状态查询
- 服务端针对不同服务的多个业务的管理
- DoubleCheck 控制
机房规则:
- 规则查询和发布校验
- 规则多版本管理和回滚
- DoubleCheck 控制
服务授权:
- 授权息查询
- 授权规则多版本支持和回滚
- DoubleCheck 控制
《大型网站系统与Java中间件实践》的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- mysql 表映射为java bean 手动生成。
在日常工作中,一般是先建表.后建类.当然也有先UML构建类与类的层级关系,直接生成表.(建模)这里只针对先有表后有类的情况.不采用代码生成器的情况. 例如: 原表结构: ),)) BEGIN ); ) ...
- 正则表达式re.sub替换不完整的问题现象及其根本原因
title: 正则表达式re.sub替换不完整的问题现象及其根本原因 toc: true comment: true date: 2018-08-27 21:48:22 tags: ["Py ...
- django session 的简单操作
#!SESSION_SAVE_EVERY_REQUEST = True 设置根据最后一次操作设置登录超时时间#!SESSION_EXPIRE_AT_BROWSER_CLOSE = True 设置是否关 ...
- kaggle首秀之intel癌症预测(续篇)
之前写了这篇文章.现在把他搬到知乎live上了.书非借不能读也,因此搞了点小费用,如果你觉得贵,加我微信我给你发红包返回给你. 最近的空余时间拿去搞kaggle了, 好久没更新文章了.今天写写kagg ...
- Python : *args和**kwargs是什么东东呢?
def foo(*args, **kwargs): print 'args = ', args print 'kwargs = ', kwargs print '------------------- ...
- 常用的OO设计原则
常用的OO设计原则: 1 封装变化:找出应用中可能需要变化之处,把它们独立出来,不要和哪些不需要变化的代码混在一起. 2 针对接口编程,而不是针对实现编程. 3 多用组合,少用继承. 4 松耦合:为了 ...
- SSM商城项目(七)
1. 学习计划 1.Solr服务搭建 2.Solrj使用测试 3.把数据库中的数据导入索引库 4.搜索功能的实现 2. Solr服务搭建 2.1. Solr的环境 Solr是java开发. 需 ...
- 关于C语言头文件写法的探讨
我不是软件工程出身,对于这方面一直处于探索阶段. 目前按照这样的习惯吧. 除主函数所在的文件以外,为每一个源文件配置一个头文件. 头文件里面不能写变量的申明和定义.头文件里面只写 #define,st ...
- 关于EL表达式随笔记录
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- Http的缓存机制
最近参加一个面试,被面试官问到http的缓存机制,发现自己并不熟悉,于是这篇博客诞生了. HTTP是超文本传输协议,从万维网服务器传输文本到本地浏览器的传送协议,基于TCP/IP通信协议传递数据 HT ...