From 637acd353a6c5bee063c8453d464b243c3feb3cb Mon Sep 17 00:00:00 2001 From: linlongchen Date: Sat, 4 Apr 2020 15:23:32 +0800 Subject: [PATCH] add microservice --- _posts/架构/01-微服务/TARS.png | Bin 0 -> 77414 bytes .../架构/01-微服务/what_is_micro_service.md | 225 ++++++++++++++++++ _posts/架构/RPC_vs_REST.md | 16 ++ about.md | 2 +- 4 files changed, 242 insertions(+), 1 deletion(-) create mode 100644 _posts/架构/01-微服务/TARS.png create mode 100644 _posts/架构/01-微服务/what_is_micro_service.md create mode 100644 _posts/架构/RPC_vs_REST.md diff --git a/_posts/架构/01-微服务/TARS.png b/_posts/架构/01-微服务/TARS.png new file mode 100644 index 0000000000000000000000000000000000000000..4f94a9da504a1cf7c14e2286652ed090eaac6466 GIT binary patch literal 77414 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
  • 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 literal 0 HcmV?d00001 diff --git a/_posts/架构/01-微服务/what_is_micro_service.md b/_posts/架构/01-微服务/what_is_micro_service.md new file mode 100644 index 0000000..f81c0ad --- /dev/null +++ b/_posts/架构/01-微服务/what_is_micro_service.md @@ -0,0 +1,225 @@ +什么是微服务和服务治理 + +## 单体式应用程序 + +与微服务相对的另一个概念是传统的**单体式应用程序**( Monolithic application ),单体式应用内部包含了所有需要的服务。而且各个服务功能模块有很强的耦合性,也就是相互依赖彼此,很难拆分和扩容。 + +说在做的各位都写过单体程序,大家都没意见吧?给大家举个栗子,刚开始写代码你写的helloworld程序就是单体程序,一个程序包含所有功能,虽然helloworld功能很简单。 + +#### 单体应用程序的优点 + +- 开发简洁,功能都在单个程序内部,便于软件设计和开发规划。 +- 容易部署,程序单一不存在分布式集群的复杂部署环境,降低了部署难度。 +- 容易测试,没有各种复杂的服务调用关系,都是内部调用方便测试。 + +### 单体应用程序的缺点 + +单体程序的缺点一开始不是特别明显,项目刚开始需求少,业务逻辑简单,写代码一时爽,一直爽。噩梦从业务迭代更新,系统日益庞大开始,前期的爽没有了,取而代之的是软件维护和迭代更新的无尽痛苦。 + +由于单体式应用程序就像一个大型容器一样,里面放置了许多服务,且他们都是密不可分的,这导致应用程序在扩展时必须以「应用程序」为单位。 + +当里面有个业务模块负载过高时,并不能够单独扩展该服务,必须扩展整个应用程序(就是这么霸道),这可能导致额外的资源浪费。 + +此外,单体式应用程序由于服务之间的紧密度、相依性过高,这将导致测试、升级有所困难,且开发曲线有可能会在后期大幅度地上升,令开发不易。相较之下「微服务架构」能够解决这个问题。 + +## 微服务 + +微服务( Microservices )就是一些协同工作小而自治的服务。 + +> 2014年,[Martin Fowler](https://zh.wikipedia.org/wiki/Martin_Fowler) 与 [James Lewis](https://zh.wikipedia.org/w/index.php?title=James_Lewis&action=edit&redlink=1) 共同提出了微服务的概念,定义了微服务是由以单一应用程序构成的小服务,自己拥有自己的行程与轻量化处理,服务依业务功能设计,以全自动的方式部署,与其他服务使用 HTTP API 通信。同时服务会使用最小的规模的集中管理 (例如 [Docker](https://zh.wikipedia.org/wiki/Docker)) 能力,服务可以用不同的编程语言与数据库等组件实现 。「维基百科」 + +### 举例 + +还是拿前面的 helloworld 程序来举栗子,想象一下你是 helloworld 公司的 CTO(老板还缺人吗?会写代码的那种),假设你们公司的 helloworld 业务遍布全球,需要编写不同语种的 helloworld 版本,分别输出英语、日语、法语、俄语...现在世界有6000多种语言(奇怪的知识又增加了)。 + +有人会说这还不简单我用`switch case`语句就完事了,同学,不要较真我就是举个例子,现实中的业务比 helloworld 复杂多了。好了,我们姑且认为按语言输出是个庞大复杂的工作,这时候就可以用微服务架构了,架构图如下: + + + +## 微服务与SOA + +**面向服务的体系结构** `SOA (Service-Oriented Architecture)` 听起来和微服务很像,但 `SOA` 早期均使用了总线模式,这种总线模式是与某种技术栈强绑定的,比如:`J2EE`。这导致很多企业的遗留系统很难对接,切换时间太长,成本太高,新系统稳定性的收敛也需要一些时间,最终 `SOA` 看起来很美,但却成为了企业级奢侈品,中小公司都望而生畏。 + +此外,实施`SOA`时会遇到很多问题,比如通信协议(例如SOAP)的选择、第三方中间件如何选择、服务粒度如何确定等,目前也存在一些关于如何划分系统的指导性原则,但其中有很多都是错误的。`SOA`并没有告诉你如何划分单体应用成微服务,所以在实施`SOA`时会遇到很多问题。 + +这些问题再微服务框架中得到很好的解决,你可以认为微服务架构是`SOA`的一种特定方法。 + +## 微服务架构 + +合久必分,鉴于「单体应用程序」有上述的缺点,单个应用程序被划分成各种小的、互相连接的微服务,一个微服务完成一个比较单一的功能,相互之间保持独立和解耦合,这就是微服务架构。 + +### 微服务优点 + +相对于单体服务,微服务有很多优点,这里列举几个主要的好处 + +#### 技术异构性 + +不同服务内部的开发技术可以不一致,你可以用java来开发helloworld服务A,用golang来开发helloworld服务B,大家再也不用为哪种语言是世界上最好的语言而争论不休。 + +为不同的服务选择最适合该服务的技术,系统中不同部分也可以使用不同的存储技术,比如A服务可以选择redis存储,B服务你可以选择用MySQL存储,这都是允许的,你的服务你做主。 + +#### 隔离性 + +一个服务不可用不会导致另一个服务也瘫痪,因为各个服务是相互独立和自治的系统。这在单体应用程序中是做不到的,单体应用程序中某个模块瘫痪,必将导致整个系统不可用,当然,单体程序也可以在不同机器上部署同样的程序来实现备份,不过,同样存在上面说的资源浪费问题。 + +#### 可扩展性 + +庞大的单体服务如果出现性能瓶颈只能对软件整体进行扩展,可能真正影响性能的只是其中一个很小的模块,我们也不得不付出升级整个应用的代价。这在微服务架构中得到了改善,你可以只对那些影响性能的服务做扩展升级,这样对症下药的效果是很好的。 + +#### 简化部署 + +如果你的服务是一个超大的单体服务,有几百万行代码,即使修改了几行代码也要重新编译整个应用,这显然是非常繁琐的,而且软件变更带来的不确定性非常高,软件部署的影响也非常大。在微服务架构中,各个服务的部署是独立的,如果真出了问题也只是影响单个服务,可以快速回滚版本解决。 + +#### 易优化 + +微服务架构中单个服务的代码量不会很大,这样当你需要重构或者优化这部分服务的时候,就会容易很多,毕竟,代码量越少意味着代码改动带来的影响越可控。 + + + +### 微服务缺点 + +我们上面一直在强调微服务的好处,但是,微服务架构不是万能的,并不能解决所有问题,其实这也是微服务把单体应用拆分成很多小的分布式服务导致的,所谓人多手杂,服务多起来管理的不好各种问题就来了。 + +为了解决微服务的缺点,前辈们提出了下面这些概念。 + +**服务注册与发现** + +微服务之间相互调用完成整体业务功能,如何在众多微服务中找到正确的目标服务地址,这就是所谓「服务发现」功能。 + +常用的做法是服务提供方启动的时候把自己的地址上报给「服务注册中心」,这就是「服务注册」。服务调用方订阅「服务变更通知」,动态的接收「服务注册中心」推送的动态服务地址列表,以后想找哪个服务直接发给他就可以。 + +**服务监控** + +单体程序的监控运维还好说,大型微服务架构的服务运维是一大挑战。服务运维人员需要实时的掌握服务运行中的各种状态,最好有个控制面板能看到服务的内存使用率、调用次数、健康状况等信息。 + +这就需要我们有一套完备的服务监控体系,包括拓扑关系、监控(Metrics)、日志监控(Logging)、调用追踪(Trace)、告警通知、健康检查等,防患于未然。 + +**服务容错** + +任何服务都不能保证100%不出问题,生产环境复杂多变,服务运行过程中不可避免的发生各种故障(宕机、过载等等),工程师能够做的是在故障发生时尽可能降低影响范围、尽快恢复正常服务。 + +程序员为此避免被祭天,需要引入「熔断、隔离、限流和降级、超时机制」等「服务容错」机制来保证服务持续可用性。 + +**服务安全** + +有些服务的敏感数据存在安全问题,「服务安全」就是对敏感服务采用安全鉴权机制,对服务的访问需要进行相应的身份验证和授权,防止数据泄露的风险,安全是一个长久的话题,在微服务中也有很多工作要做。 + + + +## 服务治理 + +说到「治理」一般都是有问题才需要治理,我们平常说环境治理、污染治理一个意思,微服务架构中的微服务越来越多,上面说的那些问题就更加显现,为了解决上面微服务架构缺陷「服务治理」就出现了。 + +微服务的那些问题都要公司技术团队自己解决的话,如果不是大型公司有成熟的技术团队,估计会很头大。幸好,有巨人的肩膀可以借给我们站上去,通过引入「微服务框架」来帮助我们完成服务治理。 + +## 微服务框架 + +业界比较成熟的微服务框架有。 + +### Dubbo + +是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。 Apache Dubbo |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现 。2011 年末对外开源,仅支持 Java 语言。 + +官网:` http://dubbo.apache.org/zh-cn/ ` + +![Dubbo架构图|图片来源dubbo.apache.org](http://dubbo.apache.org/img/architecture.png) + + + +### Tars + +腾讯内部使用的微服务架构 TAF(Total Application Framework)多年的实践成果总结而成的开源项目。 仅支持 C++ 语言,目前在腾讯内部应用也非常广泛。2017 年对外开源,仅支持 C++ 语言。 + +源码: `https://github.com/TarsCloud/Tars/blob/master/ ` + +![TARS架构图|来源github.com/TarsCloud](F:\github\lemonchann.github.io\_posts\架构\TARS.png) + +本命鹅厂TARS框架介绍PPT已下载,不想自己麻烦去找的同学,在我公众号「后端技术学堂」回复「tars」获取。 + +### Motan + +是新浪微博开源的一个Java 框架。Motan 在微博平台中已经广泛应用,每天为数百个服务完成近千亿次的调用。于 2016 年对外开源,仅支持 Java 语言。 + + ![img](https://user-gold-cdn.xitu.io/2019/8/20/16caf43c8ce67a63?imageView2/0/w/1280/h/960/format/webp/ignore-error/1) + +### gRPC + +是Google开发的高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发。本身它不是分布式的,所以要实现上面的框架的功能需要进一步的开发。2015 年对外开源的跨语言 RPC 框架,支持多种语言。 + +教程:` https://doc.oschina.net/grpc?t=58008 ` + + ![gRPC架构图|图片来源www.grpc.io](http://www.grpc.io/img/grpc_concept_diagram_00.png) + +### thrift + +最初是由 Facebook 开发的内部系统跨语言的高性能 RPC 框架,2007 年贡献给了 Apache 基金,成为 Apache 开源项目之一, 跟 gRPC 一样,Thrift 也有一套自己的接口定义语言 IDL,可以通过代码生成器,生成各种编程语言的 Client 端和 Server 端的 SDK 代码,支持多种语言。 + + ![thrift架构|图片来源wikimedia](https://upload.wikimedia.org/wikipedia/commons/d/df/Apache_Thrift_architecture.png) + + + +## 微服务框架和RPC + +很多人对这两个概念有点混淆,微服务框架上面我们说过了,我们再来看下RPC的概念。 + +### 什么是RPC + +`RPC (Remote Procedure Call)`远程过程调用是一个计算机通信协议。我们一般的程序调用是本地程序内部的调用,`RPC`允许你像调用本地函数一样去调用另一个程序的函数,这中间会涉及网络通信和进程间通信,但你无需知道实现细节,`RPC`框架为你屏蔽了底层实现。RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过**发送请求-接受回应**进行信息交互的系统。 + +### 两者关系 + +`RPC`和微服务框架的关系我的理解,微服务框架一般都包含了`RPC`的实现和一系列「服务治理」能力,是一套软件开发框架。我们可以基于这个框架之上实现自己的微服务,方便的利用微服务框架提供的「服务治理」能力和`RPC能力`,所以微服务框架也被有些人称作`RPC框架`。 + + + +## 下一代微服务架构 + +`Service Mesh`(服务网格)被认为是下一代微服务架构,`Service Mesh`并没有给我们带来新的功能,它是用于解决其他工具已经解决过的服务网络调用、限流、熔断和监控等问题,只不过这次是在`Cloud Native` 的 `kubernetes` 环境下的实现。 + +### 特点 + +Service Mesh 有如下几个特点: + +- 应用程序间通讯的中间层 +- 轻量级网络代理 +- 应用程序无感知 +- 解耦应用程序的重试/超时、监控、追踪和服务发现 + +目前两款流行的 `Service Mesh` 开源软件 `[Istio](https://istio.io/)` 和 `[Linkerd](https://linkerd.io/) `都可以直接在` kubernetes` 中集成,其中` Linkerd `已经成为`云原生计算基金会 CNCF (Cloud Native Computing Foundation)` 成员。 + +### Why Service Mesh + +为什么现有微服务架构已经解决的问题还要用`Service Mesh`呢?`istio.io`上对`service mesh`的解释,我觉得挺好的,摘抄出来: + +> As a service mesh grows in size and complexity, it can become harder to understand and manage. Its requirements can include discovery, load balancing, failure recovery, metrics, and monitoring. A service mesh also often has more complex operational requirements, like A/B testing, canary rollouts, rate limiting, access control, and end-to-end authentication. +> +> makes it easy to create a network of deployed services with load balancing, service-to-service authentication, monitoring, and more, **with few or no code changes in service code. ** + +我试着总结一下:随着微服务的增多复杂程度也增加,管理变得更加困难,微服务架构虽然解决了「网络调用、限流、熔断和监控」等问题,但大多数框架和开源软件对原有业务是`侵入式`的,也就是需要在业务服务程序中集成相关的「服务治理」组件。 + +有了`Service Mesh`你也不必去操心「服务治理」的细节,不需要对服务做特殊的改造,所有业务之外的功能都由`Service Mesh`帮你去做了。它就像一个`轻量级网络代理` 对应用程序来说是透明,所有应用程序间的流量都会通过它,所以对应用程序流量的控制都可以在 serivce mesh 中实现 。 + +`Service Mesh`之于微服务,就像`TCP/IP`之于互联网,`TCP/IP`为网络通信提供了面向连接的、可靠的、基于字节流的基础通信功能,你不再需要关心底层的重传、校验、流量控制、拥塞控制。 + + ![ 图片来自:[Pattern: Service Mesh](http://philcalcado.com/2017/08/03/pattern_service_mesh.html) ](https://jimmysong.io/blog/what-is-a-service-mesh/service-mesh-arch.png) + + + + + +## reference + + https://www.cnblogs.com/Zachary-Fan/p/service_manage_discovery.html + + https://www.zhihu.com/question/56125281 + + http://dockone.io/article/3687 + + https://www.infoq.cn/article/micro-service-technology-stack + + https://segmentfault.com/a/1190000010224335 + + https://book.douban.com/subject/26772677/ + + https://jimmysong.io/blog/what-is-a-service-mesh/ + diff --git a/_posts/架构/RPC_vs_REST.md b/_posts/架构/RPC_vs_REST.md new file mode 100644 index 0000000..7a01305 --- /dev/null +++ b/_posts/架构/RPC_vs_REST.md @@ -0,0 +1,16 @@ +RPC和RESTfull + +REST的约束条件有: + +1. 统一接口 +2. 无状态 +3. 缓存 +4. 客户端-服务器 +5. 分层系统 +6. 按需代码(可选) + +https://juejin.im/post/5c19f94fe51d45069e53c03c RPC和RESTful API入门篇 + + https://juejin.im/post/5b92475a5188255c5644819a 那些年,我们一起误解过的REST + + https://juejin.im/post/5d5bfab6f265da03d2114215 6种微服务RPC框架,你知道几个 \ No newline at end of file diff --git a/about.md b/about.md index 18f1ad7..ed98df1 100644 --- a/about.md +++ b/about.md @@ -16,5 +16,5 @@ Linux后端分布式高性能服务开发,差一点精通C++,Python小玩具 ### 版权声明 -博客文章存档于**[此处](https://github.com/lemonchann/lemonchann.github.io/tree/master/_posts)** ,所有文章若无特别声明均使用[CC BY-SA 4.0 International License(知识共享署名-相同方式共享 4.0 国际许可协议)](http://creativecommons.org/licenses/by-sa/4.0/)授权。 +博客文章存档于**[此处](https://github.com/lemonchann/lemonchann.github.io/tree/master/_posts)** ,所有文章若无特别声明均使用[**CC BY-SA 4.0 International License(知识共享署名-相同方式共享 4.0 国际许可协议)**](http://creativecommons.org/licenses/by-sa/4.0/)授权。