2018-04-09 11:32:52
摘要:什么是链路监控
APM
什么是链路
在分布式系统中,完成一个功能 ,需要涉及到许多服务协作,连接这些服务的请求组合起来就是链路,
例如:就好比一台自行车,我想让自行车跑起来,必须使用链条,那么这个链条就是链路。
什么是链路监控
就是用来记录服务之间的请求过程,就是链路监控
为什么要使用链路监控
见图,微服务不使用链路监控
微服务系统正常运行,时间正常情况下,不需要使用监控中心
在微服务调用过程中比较耗时情况
2.1 如何知道是什么地方导致耗时,无法排查是哪一个节点出现了问题
在微服务调用过程中,涉及到哪些微服务情况
3.1 无法知道微服务的调用过程。
在这两个问题的情况下,所以我们需要使用知道微服务之间的调用过程和每一个微服务掉调用过程所需要的时间。
根据场景中出现的问题,来引出链路监控
那么如何解决这两种问题呢,所以出现了链路监控
链路监控框架
Cat :大众点评开发,基于java的实时应用监控平台,包括实时应用监控,业务是监控
Zipkin :java 开发Zipkin是Twitter开源的调用链分析工具,目前基于springcloud sleuth得到了广泛的使用,特点是轻量,使用部署简单 :代码嵌入性强,基于中间件实现,
Pinpoint:java开发 Pinpoint是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能强大,接入端无代码侵入
SkyWalking:java 开发 SkyWalking是本土开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能较强,接入端无代码侵入。目前已加入Apache孵化器。全链路追踪,配置极其简单。没有任何代码入侵。
Naver的Pinpoint、Apache的HTrace、阿里的鹰眼Tracing、京东的Hydra、新浪的Watchman,美团点评的CAT,skywalking等。
根据优点和缺点(也是框架内部的一些配置和对比)进行比较得出结论
两方面考虑 结合框架特点,结合业务场景特点
所以我们选择SkyWalking
微服务系统中如何使用SkyWalking
SkyWalking概念
Skywalking Agent: SkyWalking客户端,用来发送链路数据到Collecter
SkyWalking Collect……
阅读全文
2018-04-04 14:27:26
摘要:什么是事物
例如:事物 所有看到的一切都是事物,不能看到的也是事物
例如:团队微服务,成员微服务,聚合微服务,网关api,认证中心等等包括类,对象
所有的事件都是事物变化的结果
大家接触事件最早就是在js 或者是c#高级特性。大家对于事件不默认,但是对于事件不是很好理解
什么是事件
事件就是指事物状态的变化,每一次事物变化的结果都称作为事件
什么是事件总线
就是用来管理所有的事件的一种机制就称作为事件总线
包括事件发布,事件存储,事件订阅,事件处理的统称
作用:
事件总线是一种机制,它允许不同的组件彼此通信而不彼此了解。 组件可以将事件发送到Eventbus,而无需知道是谁来接听或有多少其他人来接听。 组件也可以侦听Eventbus上的事件,而无需知道谁发送了事件。 这样,组件可以相互通信而无需相互依赖。 同样,很容易替换一个组件。 只要新组件了解正在发送和接收的事件,其他组件就永远不会知道.
为什么要使用事件总线
将微服务系统各组件之间进行解耦
使用业务的发展来说
事件总线框架
CAP
masstransit
CAP内部概念
事件 : 就是一些状态信息
发布者:发布事件的角色 cap
订阅者:订阅消费事件的角色 cap
消息传输器:传输事件
消息存储器:存储事件
CAP存储事件消息队列类型Transport
Azure
rabbitmq
kafaka
In Memory Queue
CAP存储事件持久化类型
SQL Server
MySQL
PostgreSQL
MongoDB
InMemoryStorage
CAP事件监控
Dashboard
微服务系统中如何使用CAP
条件
微服务系统
RabbitMQ
SqlServer
CAP
步骤
微服务系统准备
微服务系统全部准备完毕
RabbitMQ准备
2.1 环境准备
Erlang下载地址:https://www.erlang.org/downloads
RabbitMQ下载地址:https://www.rabbitmq.com/download.html
2.2 RabbitMQ 启动
1、在安装目录下添加可视化插件
rabbitmq-plugins enable rabbitmq_management
在安装目录下启动
rabbitmq-server
查看rabbitmq状态
……
阅读全文
2018-03-27 13:48:22
摘要:什么是配置中心
配置是用来动态修改程序执行的一种行为的机制
为什么要使用配置中心
安全性:配置跟随源代码保存在代码库中,容易造成配置泄漏。
时效性:修改配置,需要重启服务才能生效。
局限性:无法支持动态调整:例如日志开关、功能开关。
因此,分布式配置中心应运而生!
配置中心类型方式
Apollo,java开发 ----- 运维成本比高
Apollo分为MySQL,Config Service,Admin Service,Portal四个模块,MySQL存储Apollo元数据和用户配置数据; Config Service提供配置的读取、推送等功能,客户端请求都是落到Config Service上; Admin Service提供配置的修改、发布等功能,Portal操作的服务就是Admin Service; Portal提供给用户配置管理界面;功能强大,社区活跃,但较为复杂,部署组件较多,运维成本比高
Consul, go开发
依赖:不依赖其他组件
应用内/外:属于外部应用,侵入性小
ACP原则:遵循CP原则(一致性+分离容忍) 服务注册稍慢,由于其一致性导致了在Leader挂掉时重新选举期间真个consul不可用。
版本迭代:目前仍然进行版本迭代
集成支持:支持SpringCloud K8S集成
访问协议:HTTP/DNS
雪崩保护:不支持雪崩保护
集成:SpringCloud集成,K8S集成
自动注销实例:不支持
界面:英文界面,不符合国人习惯
上手:复杂一点
Nacos,依赖:mysql -----
依赖:mysql
应用内/外:属于外部应用,侵入性小
ACP原则:通知遵循CP原则(一致性+分离容忍) 和AP原则(可用性+分离容忍)
版本迭代:目前仍然进行版本迭代,最近的提交是几天前
集成支持:支持Dubbo 、SpringCloud、K8S集成
访问协议:HTTP/动态DNS/UDP
雪崩保护:支持雪崩保护
Spring cloud config java开发 ----- Net支持比较差
自动注销实例:支持
界面:国产服务,中文界面,符合国人习惯
上手:极易,中文文档,案例,社区活跃
Consul实际上是和Nacos比较相似的产品,虽然Consul目前的主要发展方向放在了Service Mesh,但是Consul最初支持的服务发现和配置管理,也是Naco……
阅读全文
2018-03-23 21:30:31
摘要:什么是身份认证
身份认证是指当客户端访问服务端资源时,验证客户端是否合法的一种机制
什么是授权
授权就是指当客户端经过身份认证后,能够有限的访问服务端资源的一种机制
为什么要使用身份验证和授权
为了保证服务端资源的安全,我们要理解必须从真实项目中去理解
身份认证和授权方式有哪些
Base认证
Base64编号认证 == https
Digest认证
MD5消息摘要认证 == https
Bearer认证
就是基于token(电子身份证)认证,讲用户信息等其他信息转换成为token,然后以token进行认证
token认证是一种无状态的认证方式,能够无限扩展,特别适合做单点登录
3.1 OAuth 2.0 ==== 授权方式的认证
3.2 JWT的也是一种身份认证
token 分两种类型
引用类型token == OAuth 2.0
无用户相关信息
自包含token
有用户相关信息 JWT === 地址,电话,id,等
在实际分布式项目中,大部分都是使用Bearer来进行身份认证和身份授权
在分布式项目或者微服务项目中,为了保证系统统一登录(SSO登录),
使用OpenID协议标准来规范身份认证功能 === 规范
同时使用OAuth 2.0协议标准来规范权限访问 === 规范
为了将身份认证(单点登录)和授权结合起来,所以出现了OpenID Connect协议标准 === 接口
OpenID Connect = OpenID + OAuth 2.0
SSO+OAuth 2.0可以实现单点登录和授权
IdentityServer4 也可以实现单点登录和授权
然后综合实现了这些框架就是今天要讲的IdentityServer4 身份认证服务器
如何在项目中使用IdentityServer4
IdentityServer4 是什么
IdentityServer是基于OpenID Connect协议标准的身份认证和授权程序,它实现了OpenID Connect 和 OAuth 2.0 协议。
IdentityServer4 功能
保护你的资源
使用本地帐户或通过外部身份提供程序对用户进行身份验证
提供会话管理和单点登录
管理和验证客户机
向客户发出标识和访问令牌
验证令牌
IdentityServer4 内部概念
下面对以下几个转用术语进行解释
用户……
阅读全文
2018-03-18 18:31:04
摘要:什么是API网关
就是用来限制客户端访问服务端api一到门槛,在图例中已经进行了展示
什么是API
API是Application Programming Interface缩写,翻译成中文就是应用程序接口。在实际微服务中可以理解一个个功能方法。就比如你一个用户服务的微服务,可以对外提供 API 接口为,查找用户,创建用户等。
什么是网关
网关, wiki 上定义。
在计算机网络中,网关(英语:Gateway)是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理
为什么要使用微服务网关
大概有4四种情况
聚合微服务增多,导致客户端不好维护
聚合微服务进行集群
2.1 增加和修改聚合微服务集群,都要修改客户端,导致客户端不稳定
2.2 服务集群,无法解决复杂均衡的问题
客户端访问多个聚合微服务
3.1 如果需要对客户端身份验证和授权,会导致每个服务都进行授权
3.2 如何客户端访问过大,无法限制客户端流量,导致系统宕机
3.3 如果客户端访问微服务系统,每个微服务之间进行调用。会导致耗时操作很难统计。
3.4 如果客户端访问微服务系统,如何统计客户端的调用日志
总结
路由
负载均衡
限流
认证
授权
链路监控
熔断降级
Service Fabric
如何在项目中使用API网关
API网关类型
Netflix Zuul +java实现
Kong nginx +lua脚本实现
Tyk go语言开发,收费版本
Ocelot aspnetcore开发的
如何在项目中使用Ocelot
Ocelot是什么
简单的来说Ocelot是一堆的asp.net core middleware组成的一个管道。当它拿到请求之后会用一个request builder来构造一个HttpRequestMessage发到下游的真实服务器,等下游的服务返回response之后再由一个middleware将它返回的HttpResponseMessage映射到HttpResponse上。
Ocelot内部概念
上游
Ocelot为上游:Upstream
下游
Ocelot下面映射的服务为下游:Downstream
主要功能
路由
1.1 接受客户端请求
1.2 奖客户端请求转换成下游地址
1.3 调用下游服务,并返回……
阅读全文
2018-03-15 20:56:36
摘要:概念------为什么-----如何使用----运行原理------熔断-----降级-----超时------重试----封装 -----consul和polly整合到项目中
首先我们来明确一下,微服务架构的基本单位是微服务,也就主体是微服务----同时每一个微服务都有自己的结构。这些结构组合成了一个微服务(这属于文件夹分层发)这个时候,那么每一个微服务都会出现相同的结构。这个时候很多同学会有疑问,为什么各个微服务之间这些相同的文件不能够进行通用呢,反而会出现这么多冗余。这样做的原因,1、保证微服务的独立性,2、保证微服务的稳定。我举个例子:微服务就好比我们每一个人,我们每一个人就组成了一个社会架构,微服务和这种场景是类似的。大家都知道,每个人的结构都是一样的。如果每个人结构都全部集中到一起。会出现什么问题,大家可以想象一下。全部乱套了。同理,微服务也是一样。所有微服务的第一要务就是保证独立性。所以我这里对微服务采用文件夹分层法。
对于什么时候用程序集分层。先明白一下,每一个微服务都有自己的领域模型(也就是我们昨天说的问题和问题边界)。如果多个微服务之间。存在不得不共享资源,共享资源是不易变化,且变化不影响每一个微服务的逻辑的时候。那么我们就把这通用的逻辑抽取出来,用dll来分层进行引用,例如:微服务之间都需要通信,需要认证,需要限流,负载均衡等等。那么咱们就把这一层称作为工具层。
什么是熔断
熔断就是在被调用端出现宕机,和超时两种情况出现的一种策略应对机制。
熔断就好比保险丝,我们先来看一看保险丝的情况
为什么要使用熔断
服务调用出现异常(包括超时和宕机两种情况)
如果服务连续几次都出现异常,那么就将服务进行熔断一段时间,
服务调用出现异常(包括超时和宕机两种情况) 如果服务连续几次都出现异常,那么就将服务进行熔断一段时间
服务调用出现异常(包括超时和宕机两种情况)
如果服务连续几次都出现异常,那么就将服务进行熔断一段时间
什么是降级
为什么要使用降级
服务主动降级(选择性放弃)
主动将服务进行进行异常返回
服务异常降级
如果服务调用出现超时或者宕机的情况,就按照自定义的策略进行返回。
服务主动降级(选择性放弃)
主动将服务进行进行异常返回
服务异常降级
如果服务调用出现超时或者宕机的情况,就按照自定义的策略进行返回。
服务主动降……
阅读全文
2018-03-10 11:27:00
摘要:注册中心
什么是注册中心
我们要搞清楚这个问题,咋们得从一个实际的场景中去学习,我们以购物场景为例来说明,在购物和场景中,总共涉及到三个角色,消费者,商店,商场。
在这个场景中,我们以画图来解决
为什么要使用注册中心
优点
解耦
服务消费者个服务提供者解耦,各自变化,不互相影响
扩展
服务消费者和服务提供者增加和删除新的服务,对于双方没有任何影响
中介者设计模式
这是一种多对多关系的典范
注册中心类型
zookeeper
一个被广泛使用的分布式的高性能服务
consul
一个发现和配置服务的工具,提供API注册和发现服务,为了确保操作性,consul会执行健康检查
etcd
一个高可用,分布式的,一致性key-value结构,用于共享配置信息和服务发现K8s使用了etcd
eureka
这个注册中心已经闭源了,建议不要使用了
在微服务中如何使用consul
什么是Consul
Consul是一个用来实现分布式系统的服务发现与配置的开源工具。是由go语言开发。他主要由多个组成部分:
服务发现:客户端通过Consul提供服务,类似于API,MySQL,或者其他客户端可以使用Consul发现服务的提供者。使用类似DNS或者HTTP,应用程序和可以很轻松的发现他们依赖的服务。
检查健康:Consul客户端可以提供与给定服务相关的健康检查(Web服务器返回200 ok)或者本地节点(“内存利用率低于90%”)。这些信息可以监控集群的运行情况,并且使访问远离不健康的主机组件。
键值对存储:应用程序可以使用Cousul的层级键值对。
多数据中心:Consul有开箱及用的多数据中心。
Consul 的角色
client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群.
server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其他数据中心通讯. 每个数据中心的 server 数量推荐为 3 个或是 5 个.
agent
组成 consul 集群的每个成员上都要运行一个 agent,可以通过 consul agent 命令来启动。agent 可以运行在 server 状态或者 client 状态。自然的,运行在 server 状态的节点被称为 server 节点;运行在 client ……
阅读全文
2017-10-22 11:48:21
摘要:高并发系统架构常用案例
通用场景
日用户流量大,但是比较分散,偶尔会有用户高聚的情况;
解决思路
通过服务器架构和代码分流,系统架构设计保证它能够同时并行处理很多请求
场景特征
高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率 QPS(Query Per Second),每秒事务处理量(TPS),并发用户数等
测试模拟工具
Apache Jmeter
2.Visual Studio性能负载测试
3.Microsoft Web Application Stress Tool
分布式
分布式应用和服务,将分层或者分割后的业务分布式部署,独立的应用服务器,数据库,缓存服务器
当业务达到一定用户量的时候,再进行服务器均衡负载,数据库,缓存主从集群
分布式静态资源,比如:静态资源上传cdn
分布式计算,比如:使用hadoop进行大数据的分布式计算
分布式数据和存储,比如:各分布节点根据哈希算法或其他算法分散存储数据。
缓存
分析:高并发业务接口多数都是进行业务数据的查询,如:商品列表,商品信息,用户信息,红包信息等,这些数据都是不会经常变化,并且持久化在数据库中. 高并发的情况下直接连接从库做查询操作,多台从库服务器也抗不住这么大量的连接请求数(前面说过,单台数据库服务器允许的最大连接数量是有限的)。 结论:缓存将是一个不错的选择。浪费内存。
异步
分析:在高并发业务中如果涉及到数据库操作,主要压力都是在数据库服务器上面,虽然使用主从分离,但是数据库操作都是在主库上操作,单台数据库服务器连接池允许的最大连接数量是有限的 。当连接数量达到最大值的时候,其他需要连接数据操作的请求就需要等待有空闲的连接,这样高并发的时候很多请求就会出现connection time out 的情况 。 结论:异步将是一个不错的选择
分层/隔
1.分层,将系统在横向维度上切分成几个部分,每个部门负责一部分相对简单并比较单一的职责,然后通过上层对下层的依赖和调度组成一个完整的系统.
2.分隔,在纵向方面对业务进行切分,将一块相对复杂的业务分割成不同的模块单元.
3.包装成高内聚低耦合的模块不仅有助于软件的开发维护,也便于不同模块的分布式部署,提高网站的并发处理能力和功能扩展. 比如用户中心可以分割成:账户信息模块,订单模块,充……
阅读全文
2017-09-21 20:54:57
摘要:参考
什么是负载均衡--阿里云
反向代理
内容服务器的替身
如果内容服务器具有必须保持安全的敏感信息,如信用卡号数据库,可在防火墙外部设置一个代理服务器作为内容服务器的替身。
当外部客户机尝试访问内容服务器时,会将其送到代理服务器。
实际内容位于内容服务器上,在防火墙内部受到安全保护。
代理服务器位于防火墙外部,在客户机看来就像是内容服务器。
代理服务器成为安全数据库和可能的恶意攻击之间又一道屏障。
即便这道屏障打破,充其量也仅限于访问单个事务中所涉及的信息。
未经授权的用户无法访问到真正的内容服务器,因为防火墙通路只允许代理服务器有权进行访问。
内容服务器的负载均衡器
可以在一个组织内使用多个代理服务器来平衡各 Web 服务器间的网络负载。
在此模型中,可以利用代理服务器的高速缓存特性,创建一个用于负载平衡的服务器池。
对于客户机发往真正服务器的请求,代理服务器座位中间调停者,将所请求的文档存入高速缓存。
如果有不止一个代理服务器,DNS 采用“循环复用法”选择其 IP 地址,随机地为请求选择路由。
即便是同一个 URL发出请求,所采取的路由每次都可能经过不同的代理服务器。
特征:
内容服务器可以处理更高的负载,并且比其独自工作时更有效率。
适用于处理高用量内容服务器的请求
负载均衡
四层负载均衡
四层负载均衡工作在 OSI 模型的传输层,由于在传输层,只有 TCP/UDP 协议,这两种协议中除了包含源 IP、目标 IP 以外,还包含源端口号及目的端口号。
四层负载均衡服务器在接受到客户端请求后,以后通过修改数据包的地址信息( IP+端口号 )将流量转发到应用服务器
七层负载均衡
七层负载均衡工作在 OSI 模型的应用层,应用层协议较多,常用 HTTP、Radius、DNS 等。
七层负载就可以基于这些协议来负载。 这些应用层协议中会包含很多有意义的内容。
LVS(Linux Virtual Server)
也就是 Linux 虚拟服务器,是一个由章文嵩博士发起的自由软件项目。 使用 LVS 技术要达到的目标是:通过 LVS 提供的负载均衡技术和 Linux 操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。
SLB
阿里云当前提供四层和七层的负载均衡服务。
四层采用开源软件L……
阅读全文
2017-09-16 10:41:18
摘要:高并发高可用角度架构演进
单机应用(WebSite)
渐渐的随着用户量的增加, 问题:一台服务器已经不够用了,服务器不稳定。挑战:高可用/高并发。 解决方式:于是我们将准备两台服务器搭成集群
简单集群(WebSite)
搭完集群之后,假如原来十个用户访问一台服务器,现在平均开,五个人访问上面的服务器,五个人访问另一个服务器。 用户的体验就会稍微好一点。
好处:简单高可用,假如其中一台服务器挂了,是不影响用户访问的,因为用户可以访问另一台好的服务器
问题:这样做有一个局限性,就是同时存在两个服务器,就会同时存在两个外网IP/域名 。 解决方式:于是我们增加了一个代理服务器,用户不需要记住两个服务器的IP或域名了,只要记住一台(代理服务器)IP就可以
负载均衡集群(WebSite)
增加代理服务器后,用户不需要记住两个服务器的IP或域名了,只要记住一台(代理服务器)IP就可以了。由代理服务器来负责分发用户是访问服务器A还是访问服务器B。用户具体是访问服务器A还是访问服务器B,我们可以通过nginx里面的权重设置来决定的。
好处:服务器高可用,户不需要记住两个服务器的IP或域名了,只要记住一台(代理服务器)IP就可以
问题:这样做不少局限性,数据的存储问题,服务器缺少角色分工,如磁盘损坏,数据是不安全的。
解决方式:于是这里我们使用了JAVA的MVC设计思想,我们将数据进行了抽取,服务器A和服务器B仅负责动态代理的分发,而不负责数据的存储,具体的数据放到数据服务器当中,数据库分离
MVC集群(WebSite)
增加代理服务器后,用户不需要记住两个服务器的IP或域名了,只要记住一台(代理服务器)IP就可以了。由代理服务器来负责分发用户是访问服务器A还是访问服务器B。用户具体是访问服务器A还是访问服务器B,我们可以通过nginx里面的权重设置来决定的。
好处:服务器高可用,户不需要记住两个服务器的IP或域名了,只要记住一台(代理服务器)IP就可以
问题:用户通过代理服务器分发到应用服务器,而应用服务器负责从数据库服务器进行数据的读取和写入。
解决方式:这里是关系型数据库,是遵循原子性、一致性、隔离性、持久性四大特性的;这时候是业务层分离的,即主服务器负责写,从服务器负责读,这就是数据的一致性和主从库读写分离。
数据库集群(DataBase)
用户通过代理服务器分发……
阅读全文