一 认识微服务
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介绍与入门 - 掘金 (juejin.cn)
接下来简单了解一下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与运行时无关,可以插入任何基础技术
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是一个成熟的数据传输机制,弄清弄懂也很重要
最后
希望大家关注博主和关注专栏,第一时间获取最新内容