Spiga

标签为微服务的文章

微服务落地方案

2018-05-10 10:54:43

摘要:#本方案定义公司实施微服务的开发标准,规定了源码的分层结构、各层次的编码规范;单个微服务采用CQRS架构;微服务间使用gRCP通信;并提供了微服务需要的基础设施,如ELK,下面具体说明: 分层 领域层 基础设施层 应用层 共享层 注意: 领域模型专注业务的设计,不依赖仓储等基础设施层 基础设施的仓储层仅负责领域模型的取出和存储 使用CQRS 模式设计应用层 Web API 是面向前端的交互的接口,避免依赖领域模型 定义Entity,区分内在逻辑和外部行为 将领域模型字段的修改设置为私有 使用构造函数表示对象的创建 使用具有业务含义的动作来操作模型字段 领域模型负责对自己数据的处理 领域服务或命令处理者负责调用领域模型业务动作 工作单元模式(UnitOfWork) 使用同一上下文 跟踪实体的状态 保障事务一致性 使用EF实现仓储 领域事件来实现模块解耦 由领域模型内部创建事件 由专有的领域事件处理类处理领域事件 根据实际情况来决定是否在同一事务中处理(如一致性、性能等因素) 集成事件解决跨服务最终一致性 集成事件是跨服务的领域事件 集成事件一般由领域事件驱动触发 不通过事务来处理集成事件(实现最终一致性) 仅在必要的情况下定义和使用集成事件 用RabbitQM来实现EventBus MediatR实现CQRS IMediator IRequest、IRequest​ IRequestHandlerin TRequest, TResponse INotification INotificationHandler​ gRPC实现内部服务间通信 gRPC的特点: 提供几乎所有主流语言的实现,打破语言隔阂 基于HTTP/2 ,开放协议,受到广泛的支持,易于实现和集成 默认使用Protocol Buffers 序列化,性能相较于RESTful Json 好很多 工具链成熟,代码生成便捷,开箱即用 支持双向流式的请求和响应,对批量处理、低延时场景友好 NET 生态对gRPC 的支持情况 提供基于HttpClient 的原生框架实现 提供原生的ASP.NET Core 集成库 提供完整的代码生成工具 Visual Studio 和Visual Stuido Code 提供proto 文件的智能提示 网关区分场景与职责 Poll…… 阅读全文

微服务架构(九):k8s

2018-04-20 16:07:57

摘要:k8s介绍 什么是k8s k8s是一个舵手,专门用来进行给docker掌管方向的,换句话说,就是用来控制docker运行容器的 和docker 是一样的功能。所以就有一个概念cluster 为什么要使用k8s 因为当docker容器异常的时候,docker无法将容器进行重启,如果容器数量比较大 swarm 优点 架构简单,部署运维成本低 docker swarm 集群模式由于原生态集成到docker-engine中,所以首先学习成本低,对于使用docker-engine 1.12版本及以上可以平滑过渡,service服务可以满足动态增减容器个数,同时具备自身的负载均衡,swarm管理者多台设定保证了机器在出错后有一个良好的容灾机制 启动速度快 swarm集群只会有两层交互,容器启动是毫秒级 swarm缺点 1 无法提供更精细的管理 swarm API兼容docker API,所以使得swarm无法提供集群的更加精细的管理 2 网络问题 在网络方面,默认docker容器是通过桥接与NAT和主机外网络通信,这样就出现2个问题,一个是因为是NAT,外部主机无法主动访问到容器内(除了端口映射),另外默认桥接IP是一样的,这样会出现不同主机的容器有相同的IP的情况。这样两容器更加不能通信。同时网络性能方面,有人测试经过桥接的网络性能只有主机网络性能的70%。当然以上问题可以通过其他工具解决,比如用 Flannel 或者 OVS网桥 3 容器可靠性 在容器可靠性方面,相较于Kubernetes的Replication Controllers可以监控并维持容器的生命,swarm在启动时刻可以控制容器启动,在启动后,如果容器或者容器主机崩溃,swarm没有机制来保证容器的运行。 kubernetes优点: 1 管理更趋于完善稳定 kubernetes 集群管理更趋于完善稳定,同时pod功能上比swarm的service更加强大 2 健康机制完善 Replication Controllers可以监控并维持容器的生命 3 轻松应对复杂的网络环境 kubernetes默认使用Flannel作为overlay网络。 Flannel是CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(OverlayNetwork)工具,其目的在于帮助每一个使用 Kuberen…… 阅读全文

微服务设计(八):docker

2018-04-15 10:53:53

摘要: Docker版本 17.03版本之后 1、CE(Community Edition: 社区版) ---- 免费 2、EE(Enterprise Edition: 企业版)---- 收费 windows 安装 条件 1、windows 10 2、开启Hyper-V 3、安装Toolbox 最新版 Toolbox 下载地址: https://www.docker.com/get-docker 点击 Download Desktop and Take a Tutorial,并下载 Windows 的版本 linux安装 1. centos7.0 以上的版本 ​ 2. 安装docker 版本仓库 docker版本 ​ 2.1 设置仓库 ​       sudo yum install -y yum-utils device-mapper-persistent-data lvm2 ​ 2.2 稳定仓库 ​     sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo ​ 3. 安装docker(默认安装最新版本) ​ sudo yum install docker-ce docker-ce-cli containerd.io ​ 如果要安装其他版本 ​       要安装特定版本的 Docker Engine-Community,请在存储库中列出可用版本,然后选择并安装: ​       1、列出并排序您存储库中可用的版本。此示例按版本号(从高到低)对结果进行排序。 ​         yum list docker-ce --showduplicates | sort -r ​               docker-ce.x86_64 3:18.09.1-3.el7                     docker-ce-stable               docker-ce.x86_64 3:18.09.0-3.el7                     docker-ce-stable               docker-ce.x86_64 1…… 阅读全文

微服务架构(七):链路监控

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 内部概念 下面对以下几个转用术语进行解释 用户…… 阅读全文

微服务架构(三):API网关

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-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 …… 阅读全文