关于微服务,这些你都了解吗-微服务介绍

news2024/12/25 15:23:30

文章目录

  • 一 认识微服务
    • 1.1 什么是微服务
    • 1.2 微服务的特点
    • 1.3 微服务诞生背景
    • 1.4 微服务架构的优势
  • 二 微服务生态
      • 1.1 硬件层
      • 1.2 通信层
      • 1.3 应用平台层
      • 1.4 微服务层
  • 三 微服务详解
      • 1.1 微服务架构
      • 1.2 服务注册和发现
      • 1.3 rpc调用和服务监控
  • 四 微服务与DDD
      • 1.1 什么是DDD
      • 1.2 DDD作用
      • 1.3 DDD常用概念-领域
      • 1.4 DDD常用概念-领域模型
      • 1.5 DDD常用概念-界限上下文
      • 1.6 DDD域微服务四层架构
      • 1.7 DDD优缺点:
      • 1.8 回到微服务的设计原则上
      • 1.9 在本次微服务学习中,我们将采用DDD开发微服务项目。
  • 五 RPC介绍
      • 1.1 RPC简介
      • 1.2 流行RPC框架的对比
      • 1.3 golang中如何实现RPC
      • 1.4 RPC调用流程
  • 六 gRPC介绍
      • 1.1 gRPC简介
      • 1.2 gRPC与Protobuf介绍
    • 1.3 gRPC主要特性
      • 1.4 安装gRPC和Protobuf
  • 七 Go Micro介绍
      • 1.1 go-micro简介
      • 1.2 go-micro的主要功能
      • 1.3 go-micro特性
      • 1.4 go-micro通信流程
      • 1.5 go-micro架构图
  • 八 小结
  • 最后

一 认识微服务

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

5c636758-0fef-426f-b09e-331569ab3bb9.jpg

  • 数据传递这里面可能是各种语言,各种技术,各种传递

1.3 应用平台层

  • 云管理平台、监控平台、日志管理平台,需要他们支持
  • 服务管理平台,测试发布平台
  • 服务治理平台

1.4 微服务层

  • 用微服务框架实现业务逻辑

三 微服务详解

1.1 微服务架构

ff7d3c41-6a7e-481b-a8e6-1d5352c794f5.jpg

  • 从程序架构来看如下

clipboard.png

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是把业务模型翻译成系统架构设计的一种方式。

clipboard.png

1.2 DDD作用

——真正决定软件复杂性的是设计方法。

  • 有助于我们确定系统边界

  • 能够聚焦在系统核心元素上

  • 帮助我们拆分系统

1.3 DDD常用概念-领域

  • 领域:领域是有范围界限的,也可以说是有边界的

  • 核心域:核心域是业务系统的核心价值

  • 通用子域:所有子域的消费者,提供着通用服务

  • 支撑子域:专注于业务系统的某一重要的业务

1.4 DDD常用概念-领域模型

  • 理解:领域模型是对我们软件系统中要解决问题的抽象表达。

  • 领域:反应的是我们业务上需要解决的问题

  • 模型:我们针对该问题提出的解决方案

1.5 DDD常用概念-界限上下文

  • 理解 :语文中的语境的意思

  • 方式:领域+界限上下文

  • 目的:不在如如何划分边界,而在如如何控制边界

1.6 DDD域微服务四层架构

  • 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框架的对比

ee5c3a20-fe22-4af1-aaf6-833c32b11bd0.jpg

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支持的不同语言实现。

clipboard.png

clipboard.png

1.2 gRPC与Protobuf介绍

  • 微服务架构中,由于每个服务对应的代码库是独立运行的,无法直接调用,彼此间的通信就是个大问题
  • gRPC可以实现微服务,将大的项目拆分为多个小且独立的业务模块,也就是服务,各服务间使用高效的protobuf协议进行RPC调用,gRPC默认使用protocol buffers,这是google开源的一套成熟的结构数据序列化机制
  • 可以用proto files创建gRPC服务,用message类型来定义方法参数和返回类型

image.png

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与运行时无关,可以插入任何基础技术

    • 插件地址: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通信流程

clipboard.png

  • Server监听客户端的调用,和Brocker推送过来的信息进行处理。并且Server端需要向Register注册自己的存在或消亡,这样Client才能知道自己的状态
  • Register服务的注册的发现,Client端从Register中得到Server的信息,然后每次调用都根据算法选择一个的Server进行通信,当然通信是要经过编码/解码,选择传输协议等一系列过程的
  • 如果有需要通知所有的Server端可以使用Brocker进行信息的推送,Brocker 信息队列进行信息的接收和发布

1.5 go-micro架构图

clipboard.png

clipboard.png

八 小结

  • 学习微服务要首先对微服务有个系统认知,这篇文章能够帮助回顾

  • 微服务了解清楚,如果对概念还不清楚要在理清楚吸收

  • DDD模型架构很重要,能够帮助在开发的时候事半功倍

  • 要理解RPC与gRPC之间的关系

  • Go有很多gRPC框架,go-micro只是其中之一,但是也很重要

  • ProtoBuf是一个成熟的数据传输机制,弄清弄懂也很重要

最后

希望大家关注博主和关注专栏,第一时间获取最新内容

欢迎大家加入 夏沫の梦的学习交流 进行学习交流经验夏沫の梦学习交流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/133113.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python快速实现某东方视频解密wasm算法

开始之前请大家先去了解一下 wasm这种技术(可以百度搜索一下 WebAssembly是什么?) 现在开始.... 1,先看一张图 首先写一个本地加载wasm的方法 00043706.wasm就是当前网站load的wasm库,如果遇到报错,请联系我,文章最后有qq联系方式 let u {} functio…

C++类和对象2:默认成员函数

我们通过this指针可以看出来,C其实隐藏了非常多的东西,很多事情它会在编译的时候包揽,那么作为最为重要的类和对象,它是不是还隐含了更多我们平常看不到的东西呢? 我们创建一个空类里面啥也不放。 class Text{}; 看上…

2_类加载子系统

目录 概述 类加载器子系统作用 类的加载过程 加载阶段 加载class文件的方式 链接阶段 准备 Prepare 解析 Resolve 初始化阶段 类加载器的分类 虚拟机自带的加载器 扩展类加载器(Extension ClassLoader) 应用程序类加载器(系统类加…

阿里云计算工程师ACP考题归类解析

目录考纲答题技巧四式记的牢三妙招一、对象存储OSS二、专有网络VPC三、服务器ECS四、安全五、阿里云弹性伸缩Auto Scaling五、内容分发网络CDN总结考纲 重点学习ECS、VPC、OSS三部分。 答题技巧四式 战略是先做简单后做难度高的。 一、简化 做题问三个问题,按回答…

【云原生 | Kubernetes 实战】20、K8s Ingress 实现业务灰度发布

目录 通过 Ingress-nginx 实现灰度发布 一、Ingress Controller 多种发布策略介绍 场景一:将新版本灰度给部分用户 场景二:切一定比例的流量给新版本 二、模拟部署生产测试版本 Web 服务 2.1 部署一个 v1 版本: 2.2 再部署一个 v2 版本: 2.3 再…

论文投稿指南——中文核心期刊推荐(化学)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…

本地方法接口

什么是本地方法 简单地讲,一个Native Methodt是一个Java调用非Java代码的接囗。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,…

AQS核心原理之

AQS系列 1、AQS核心原理之 2、ReentrantLock 原理及示例 文章目录AQS系列一、什么是AQS?二、AQS特性三、AQS内部维护 state四、队列4.1 同步等待队列4.2 条件等待队列5、总结一、什么是AQS? AQS全称是 AbstractQueuedSynchronizer(抽象对了同步器)&am…

Cento6从零开始用Nginx+mysql+php搭建Discuz在线论坛系统

首先我的liunx使用版本是 centos6.5 32位 discuz版本是Discuz_X3.2_SC_UTF8.zip Xshell版本是6 xftp是7版本 mysql也是是这个版本:mysql这里写目录标题1.yum安装php2.安装nginx包3.安装php-fpm4.安装php-mysql5. 安装Discuz在线论坛系统由于目前yum源已经无法使用需…

力扣 2037. 使每位学生都有座位的最少移动次数

题目 一个房间里有 n 个座位和 n 名学生,房间用一个数轴表示。给你一个长度为 n 的数组 seats ,其中 seats[i] 是第 i 个座位的位置。同时给你一个长度为 n 的数组 students ,其中 students[j] 是第 j 位学生的位置。 你可以执行以下操作任…

unidbg案例-爱库存app之sig和sign分析

新年的第一篇文章,新的一年继续加油,奥利给!冲冲冲。 今天分析的app是爱库存,版本号6.1.6,这次还是使用unidbg分析该样本,加密参数有很多,不过只关注sig和sign两个参数。 老规矩,上来先抓个包。 1.抓包 可以看到上面👆🏻的sign,就是本次研究的重点。 2.jadx静…

A* 算法详解(超级详细讲解,附有大图)

目录 引入 一.基本概念 二.算法原理 ①用宽度优先搜索 ②狄克斯特拉算法 ③A*算法 三.需要注意 四.c伪代码 最后 引入 今天想跟大家聊的,是我们经常用到,但是却让大家觉得十分神秘的那个算法:A* 。 这是一个远古而又非常经典的游戏…

【C++ STL】-- 用一棵红黑树的插入实现同时封装map与set

用一棵红黑树同时封装map与set的意义:所谓的 “用一棵红黑树同时封装map与set” 只是在程序员的角度,通过一系列手段,以一个红黑树同时满足map与set。但是在编译器的角度,实际上并不是一颗树实现的,程序员所写的只是一…

机器学习 10:激活函数大全

虽称为激活函数大全,但也不敢太过自满,如有遗漏与错误,还请指正 文章目录线性激活函数Sigmoid 函数LogSigmoidSwishTanh / 双曲正切激活函数TanhShrinkSoftsignReLU 函数BReLULeaky ReLUPReLURReLUELUSELUCELUGELUSoftmax 函数Maxout 函数Sof…

Android 实现多语言

工具下载连接 链接:https://pan.baidu.com/s/1Wq9DTzhP2fkHXLEbOQFr9A?pwdlmcz 提取码:lmcz 1.将你需要的翻译的strings放到exe目录下 2.双击执行xml转xls.exe 英文 日文 韩文(使用空格分割)回车,会在当前目录下生…

jvm学习的开端(一)----类的加载(类加载子系统)

文章目录1.Loading(加载阶段)2.Linking(链接阶段)2.lnitialization(初始化阶段)来自 百度百科: 类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的…

【java项目】飞机大战

文章目录项目-飞机大战窗口的创建背景图片的添加/点击事件的启动游戏物体父类的编写背景的移动双缓存技术--解决文字闪动背景图片循环出现我方战斗机的添加和鼠标控制添加首颗子弹批量添加子弹敌方飞机的批量添加功能我方子弹与敌方飞机的碰撞检测我方子弹与敌方飞机碰撞时的处…

单片机基础之单片机中断、定时器中断、PWM及SG90舵机的初识认知

目录 一、初探单片机中断 二、定时器中断相关寄存器 1、中断寄存器 2、中断结构 3、用定时器中断方式控制LED,代码编程测试 三、初识PWM 1、什么是占空比 2、如何输出PWM信号 四、SG90舵机基本认知 1、什么是舵机 2、怎么控制舵机 3、舵机编程实战 一、…

Jetson nano 入手系列之2—板载摄像头IMX219启动

Jetson nano 入手系列之2—板载摄像头IMX219启动1.亚克力板安装2.摄像头启动3.nvgstcapture常用命令3.1 Set sensor orientation3.2 Get Image Capture Resolution3.3 Capture3.4 quit参考文献Jetson nano 入手系列: Jetson nano 入手系列之1—如何SSH远程登录 Jets…

Redis学习(一)

Redis入门 Redis是一个基于内存的key-value结构数据库,读写性能较高 Redis数据类型 Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种数据类型: 1.字符串 string 2.哈希 hash 3.列表 list 4.集合 set 5.有序集…