一 认识微服务
1.1 什么是微服务
-
运用一套小服务来开发单个运用的办法,每个服务运转在独立的进程里,一般选用轻量级的通讯机制互联,而且它们可以通过主动化的办法布置
-
什么叫微?
- 单一功用
- 代码少,不是,而且代码多
- 架构变的杂乱了
- 微服务是规划思维,不是量的表现
1.2 微服务的特点
- 单一责任,此时项目专心于登录和注册
- 轻量级的通讯,通讯与渠道和言语无关,http是轻量的,例如java的RMI归于重量的
- 阻隔性,数据阻隔
- 有自己的数据
- 技能多样性
1.3 微服务诞生背景
- 互联网职业的快速开展,需求变化快,用户数量变化快
- 灵敏开发家喻户晓,用最小的代价,做最快的迭代,频频修改、测验、上线
- 容器技能的老练,是微服务的技能根底
1.4 微服务架构的优势
- 独立性
- 运用者简略了解
- 技能栈灵敏
- 高效团队
二 微服务生态
1.1 硬件层
- 用Docker+k8s去处理
1.2 通讯层
-
网络传输,用RPC(长途进程调用)
- HTTP传输,GET POST PUT DELETE
- 依据TCP,更靠底层,RPC依据TCP,Dubbo,Grpc,Thrift
-
需求知道调用谁,用服务注册和发现
- 需求分布式数据同步:etcd,consul,zookeeper
- 数据传递这里边可能是各种言语,各种技能,各种传递
1.3 运用渠道层
- 云办理渠道、监控渠道、日志办理渠道,需求他们支撑
- 服务办理渠道,测验发布渠道
- 服务办理渠道
1.4 微服务层
- 用微服务结构完结事务逻辑
三 微服务详解
1.1 微服务架构
- 从程序架构来看如下
1.2 服务注册和发现
-
客户端做,需求完结一套注册中心,记载服务地址,知道具体拜访哪个,轮询算法去做,加权轮询
-
服务端做,比较简略,服务端启动,主动注册即可,AWS的ELB去拜访
-
微服务一般不用LVS负载,扩展实例需求改装备,不符合微服务弹性扩展思维
-
更多公司倾向于客户端做注册发现
-
etcd处理分布式一致性,raft
-
etcd运用场景:
- 注册发现
- 同享装备
- 分布式锁
- leader选举
1.3 rpc调用和服务监控
-
RPC相关内容
- 数据传输:JSON Protobuf thrift
- 负载:随机算法 轮询 一致性hash 加权
- 反常容错:健康检测 熔断 限流
-
服务监控
- 日志搜集
- 打点采样
四 微服务与DDD
1.1 什么是DDD
- DDD(Domain-driven design)范畴驱动规划是一种通过将完结衔接到持续进化的模型来满意杂乱需求的软件开发办法。范畴模型是对事务模型的抽象,DDD是把事务模型翻译成体系架构规划的一种办法。
1.2 DDD作用
——真实决议软件杂乱性的是规划办法。
-
有助于咱们确定体系鸿沟
-
可以聚集在体系中心元素上
-
协助咱们拆分体系
1.3 DDD常用概念-范畴
-
范畴:范畴是有规模鸿沟的,也可以说是有鸿沟的
-
中心域:中心域是事务体系的中心价值
-
通用子域:一切子域的顾客,供给着通用服务
-
支撑子域:专心于事务体系的某一重要的事务
1.4 DDD常用概念-范畴模型
-
了解:范畴模型是对咱们软件体系中要处理问题的抽象表达。
-
范畴:反响的是咱们事务上需求处理的问题
-
模型:咱们针对该问题提出的处理方案
1.5 DDD常用概念-鸿沟上下文
-
了解 :语文中的语境的意思
-
办法:范畴+鸿沟上下文
-
目的:不在如如何区分鸿沟,而在如如何控制鸿沟
1.6 DDD域微服务四层架构
- DDD域微服务四层架构由接口、运用层、范畴层、根底设施层组成。
1.7 DDD优缺陷:
-
优点:体系演进更方便,分为事务杂乱性变化的演进和事务数据量变化的演进;更方便测验
-
缺陷:体系改造成DDD杂乱,开发熟悉DDD思维困难。
1.8 回到微服务的规划原则上
-
要范畴驱动规划,而不是数据驱动规划,也不是界面驱动规划
-
要鸿沟清晰的微服务,而不是泥球小单体
-
要职能清晰的分层,而不是什么都放的大箩筐
-
要做自己能hold住的微服务,而不是过度拆分的微服务
1.9 在本次微服务学习中,咱们将选用DDD开发微服务项目。
-
接口由go-micro的Api网关供给。
-
运用层由go-micro供给的可插拔插件供给。
-
范畴层运用Mysql进行开发。
-
根底设施处运用Docker+k8s完结。
五 RPC介绍
1.1 RPC简介
- 长途进程调用(Remote Procedure Call,RPC)是一个计算机通讯协议
- 该协议答应运转于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程
- 如果触及的软件选用面向对象编程,那么长途进程调用亦可称作长途调用或长途办法调用
1.2 盛行RPC结构的比照
1.3 golang中如何完结RPC
- golang中完结RPC非常简略,官方供给了封装好的库,还有一些第三方的库
- golang官方的net/rpc库运用encoding/gob进行编解码,支撑tcp和http数据传输办法,因为其他言语不支撑gob编解码办法,所以golang的RPC只支撑golang开发的服务器与客户端之间的交互
- 官方还供给了net/rpc/jsonrpc库完结RPC办法,jsonrpc选用JSON进行数据编解码,因而支撑跨言语调用,现在jsonrpc库是依据tcp协议完结的,暂不支撑http传输办法
1.4 RPC调用流程
- 微服务架构下数据交互一般是对内 RPC,对外 REST
- 将事务按功用模块拆分到各个微服务,具有进步项目协作效率、降低模块耦合度、进步体系可用性等优点,可是开发门槛比较高,比方 RPC 结构的运用、后期的服务监控等作业
- 一般情况下,咱们会将功用代码在本地直接调用,微服务架构下,咱们需求将这个函数作为单独的服务运转,客户端通过网络调用
六 gRPC介绍
1.1 gRPC简介
-
gRPC由google开发,是一款言语中立、渠道中立、开源的长途进程调用体系
-
gRPC是一个高性能、开源、通用的RPC结构,依据HTTP2协议规范规划开发,默许选用Protocol Buffers数据序列化协议,支撑多种开发言语。gRPC供给了一种简略的办法来准确的界说服务,而且为客户端和服务端主动生成牢靠的功用库。
-
在gRPC客户端可以直接调用不同服务器上的长途程序,运用起来就像调用本地程序相同,很简略去构建分布式运用和服务。和许多RPC体系相同,服务端担任完结界说好的接口并处理客户端的恳求,客户端依据接口描绘直接调用需求的服务。客户端和服务端可以别离运用gRPC支撑的不同言语完结。
1.2 gRPC与Protobuf介绍
- 微服务架构中,因为每个服务对应的代码库是独立运转的,无法直接调用,彼此间的通讯就是个大问题
- gRPC可以完结微服务,将大的项目拆分为多个小且独立的事务模块,也就是服务,各服务间运用高效的protobuf协议进行RPC调用,gRPC默许运用protocol buffers,这是google开源的一套老练的结构数据序列化机制
- 可以用proto files创立gRPC服务,用message类型来界说办法参数和回来类型
1.3 gRPC主要特性
-
强大的IDL
gRPC运用ProtoBuf来界说服务,ProtoBuf是由Google开发的一种数据序列化协议(类似于XML、JSON、hessian)。ProtoBuf可以将数据进行序列化,并广泛运用在数据存储、通讯协议等方面。
-
多言语支撑
gRPC支撑多种言语,并可以依据言语主动生成客户端和服务端功用库。现在已供给了C版别grpc、Java版别grpc-java 和 Go版别grpc-go,其它言语的版别正在积极开发中,其间,grpc支撑C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等言语,grpc-java现已支撑Android开发。
-
HTTP2
gRPC依据HTTP2规范规划,所以相对于其他RPC结构,gRPC带来了更多强大功用,如双向流、头部压缩、多复用恳求等。这些功用给移动设备带来严重好处,如节省带宽、降低TCP链接次数、节省CPU运用和延伸电池寿命等。一起,gRPC还可以进步了云端服务和Web运用的性能。gRPC既可以在客户端运用,也可以在服务器端运用,从而以通明的办法完结客户端和服务器端的通讯和简化通讯体系的构建。
1.4 装置gRPC和Protobuf
- gRPC与ProtoBuf的装置咱们自行百度,挺简略装置的。
七 Go Micro介绍
主要内容可以查看我写的别的一篇文章: Go Micro介绍与入门 – ()
接下来简略了解一下go-micro
1.1 go-micro简介
- Go Micro是一个插件化的根底结构,依据此可以构建微服务,Micro的规划哲学是可插拔的插件化架构
- 在架构之外,它默许完结了consul作为服务发现,通过http进行通讯,通过protobuf和json进行编解码
- 是用来构建和办理分布式程序的体系
- Runtime (运转时) : 用来办理装备,认证,网络等
- Framework (程序开发结构) : 用来方便编写微服务
- Clients (多言语客户端) : 支撑多言语拜访服务端
1.2 go-micro的主要功用
-
服务发现:主动服务注册和名称解析。
-
负载均衡:依据服务发现构建的客户端负载均衡。
-
消息编码:依据内容类型的动态消息编码。
-
恳求/呼应:依据RPC的恳求/呼应,支撑双向流。
-
Async Messaging:PubSub是异步通讯和事情驱动架构的一流公民。
-
可插拔接口:Go Micro为每个分布式体系抽象运用Go接口,因此,这些接口是可插拔的,并答应Go Micro与运转时无关,可以刺进任何根底技能
- 插件地址:github.com/micro/go-pl…
1.3 go-micro特性
- api: api 网关。运用服务发现具有动态恳求路由的单个进口点. API 网关答应您在后端构建可扩展的微服务体系结构,并在前端合并公共 api. micro api 通过发现和可插拔处理程序供给强大的路由,为 http, grpc, Websocket, 发布事情等供给服务.
- broker: 答应异步消息的消息署理。微服务是事情驱动的体系结构,应该作为一等公民供给消息传递。告诉其他服务的事情,而无需担心呼应.
- network: 通过微网络服务构建多云网络。只需跨任何环境衔接网络服务,创立单个平面网络即可大局路由. Micro 的网络依据每个数据中心中的本地注册表动态构建路由,保证依据本地设置路由查询.
- new: 服务模板生成器。创立新的服务模板以快速入门. Micro 供给用于编写微服务的预界说模板。始终以相同的办法启动,构建相同的服务以进步作业效率.
- proxy: 建立在 Go Micro 上的通明服务署理。将服务发现,负载平衡,容错,消息编码,中间件,监视等卸载到单个位置。独立运转它或与服务一起运转.
- registry: 注册表供给服务发现以查找其他服务,存储功用丰厚的元数据和终结点信息。它是一个服务资源办理器,答应您在运转时集中和动态地存储此信息.
- store: 有状况是任何体系的必然需求。咱们供给密钥值存储,供给简略的状况存储,可在服务之间同享或长期卸载 m 以保持微服务无状况和水平可扩展.
- web: Web 仪表板答应您阅读服务,描绘其终结点,恳求和呼应格局,甚至直接查询它们。仪表板还包括内置 CLI 的体验,适用于希望动态进入终端的开发人员.
1.4 go-micro通讯流程
- Server监听客户端的调用,和Brocker推送过来的信息进行处理。而且Server端需求向Register注册自己的存在或消亡,这样Client才能知道自己的状况
- Register服务的注册的发现,Client端从Register中得到Server的信息,然后每次调用都依据算法挑选一个的Server进行通讯,当然通讯是要通过编码/解码,挑选传输协议等一系列进程的
- 如果有需求告诉一切的Server端可以运用Brocker进行信息的推送,Brocker 信息行列进行信息的接收和发布
1.5 go-micro架构图
八 小结
-
学习微服务要首要对微服务有个体系认知,这篇文章可以协助回顾
-
微服务了解清楚,如果对概念还不清楚要在理清楚吸收
-
DDD模型架构很重要,可以协助在开发的时分事半功倍
-
要了解RPC与gRPC之间的关系
-
Go有许多gRPC结构,go-micro仅仅其间之一,可是也很重要
-
ProtoBuf是一个老练的数据传输机制,澄清弄懂也很重要
最后
希望咱们关注博主和关注专栏,第一时间获取最新内容
欢迎咱们参加 夏沫の梦的学习沟通群 进行学习沟通经验