一 认识微服务
1.1 什么是微服务
什么叫微?
单一功能
代码少,不是,而且代码多
架构变的复杂了
微服务是设计思想,不是量的体现
1.2 微服务的特点
单一职责,此时项目专注于登录和注册
轻量级的通信,通信与平台和语言无关,http是轻量的,例如java的RMI属于重量的
隔离性,数据隔离
有自己的数据
技术多样性
1.3 微服务诞生背景
互联网行业的快速发展,需求变化快,用户数量变化快
敏捷开发深入人心,用最小的代价,做最快的迭代,频繁修改、测试、上线
容器技术的成熟,是微服务的技术基础
1.4 微服务架构的优势
独立性
使用者容易理解
技术栈灵活
高效团队
二 微服务生态
1.1 硬件层
用Docker+k8s去解决
1.2 通信层
HTTP传输,GET POST PUT DELETE
基于TCP,更靠底层,RPC基于TCP,Dubbo,Grpc,Thrift
需要知道调用谁,用服务注册和发现
需要分布式数据同步:etcd,consul,zookeeper
数据传递这里面可能是各种语言,各种技术,各种传递
1.3 应用平台层
云管理平台、监控平台、日志管理平台,需要他们支持
服务管理平台,测试发布平台
服务治理平台
1.4 微服务层
用微服务框架实现业务逻辑
三 微服务详解
1.1 微服务架构
从程序架构来看如下
1.2 服务注册和发现
服务端做,比较简单,服务端启动,自动注册即可,AWS的ELB去访问
更多公司倾向于客户端做注册发现
etcd使用场景:
注册发现
共享配置
分布式锁
leader选举
1.3 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提供的可插拔插件提供。
基础设施处使用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 是一个高性能、开源、通用的RPC框架,基于HTTP2协议标准设计开发,默认采用Protocol Buffers数据序列化协议,支持多种开发语言。gRPC提供了一种简单的方法来精确的定义服务,并且为客户端和服务端自动生成可靠的功能库。
1.2 gRPC与Protobuf介绍
微服务架构中,由于每个服务对应的代码库是独立运行的,无法直接调用,彼此间的通信就是个大问题
gRPC可以实现微服务,将大的项目拆分为多个小且独立的业务模块,也就是服务,各服务间使用高效的protobuf协议进行RPC调用,gRPC默认使用protocol buffers,这是google开源的一套成熟的结构数据序列化机制
可以用proto files创建gRPC服务,用message类型来定义方法参数和返回类型
1.3 gRPC主要特性
gRPC支持多种语言,并能够基于语言自动生成客户端和服务端功能库。目前已提供了C版本grpc、Java版本grpc-java 和 Go版本grpc-go,其它语言的版本正在积极开发中,其中,grpc支持C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等语言,grpc-java已经支持Android开发。
gRPC基于HTTP2标准设计,所以相对于其他RPC框架,gRPC带来了更多强大功能,如双向流、头部压缩、多复用请求等。这些功能给移动设备带来重大益处,如节省带宽、降低TCP链接次数、节省CPU使用和延长电池寿命等。同时,gRPC还能够提高了云端服务和Web应用的性能。gRPC既能够在客户端应用,也能够在服务器端应用,从而以透明的方式实现客户端和服务器端的通信和简化通信系统的构建。
gRPC使用ProtoBuf来定义服务,ProtoBuf是由Google开发的一种数据序列化协议(类似于XML、JSON、hessian)。ProtoBuf能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。
1.4 安装gRPC和Protobuf
gRPC与ProtoBuf的安装大家自行百度,挺容易安装的。
七 Go Micro介绍
1.1 go-micro简介
Go Micro是一个插件化的基础框架,基于此可以构建微服务,Micro的设计哲学是可插拔的插件化架构
在架构之外,它默认实现了consul作为服务发现,通过http进行通信,通过protobuf和json进行编解码
是用来构建和管理分布式程序的系统
Runtime (运行时 : 用来管理配置,认证,网络等
Framework (程序开发框架 : 用来方便编写微服务
Clients (多语言客户端 : 支持多语言访问服务端
1.2 go-micro的主要功能
服务发现:自动服务注册和名称解析。
消息编码:基于内容类型的动态消息编码。
Async Messaging:PubSub是异步通信和事件驱动架构的一流公民。
-
插件地址:https://github.com/micro/go-plugins
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架构图
八 小结
微服务了解清楚,如果对概念还不清楚要在理清楚吸收
要理解RPC与gRPC之间的关系
ProtoBuf是一个成熟的数据传输机制,弄清弄懂也很重要