add(post) : 微服务架构

This commit is contained in:
lemonchann
2020-04-07 22:37:51 +08:00
parent 2487af8d5f
commit edc2cf1a18
11 changed files with 69 additions and 41 deletions

View File

@@ -12,7 +12,7 @@ author: lemonchann
使用Linux的同学应该对linux的`date`命令不会陌生,经常需要在命令行敲一下这个命令获取当前时间。然而这只是他的能力冰山一角。
```bash
[llchan@localhost ~]$ date
[lemon@localhost ~]$ date
2020年 02月 12日 星期三 19:51:46 CST
```
@@ -23,7 +23,7 @@ author: lemonchann
#### 获取时间戳1970年1月1日0点0分0秒到现在历经的秒数
```bash
[llchan@localhost ~]$ date +%s
[lemon@localhost ~]$ date +%s
1581508426
```
@@ -32,7 +32,7 @@ author: lemonchann
#### 时间戳还原,把刚才的秒数还原成时间字符串
```bash
[llchan@localhost ~]$ date -d "@1581508426"
[lemon@localhost ~]$ date -d "@1581508426"
2020年 02月 12日 星期三 19:53:46 CST
```
@@ -41,10 +41,10 @@ author: lemonchann
#### 指定的时间字符串转换成时间戳
```bash
[llchan@localhost ~]$ date -d '02/22/2222 07:21:22' +%s
[lemon@localhost ~]$ date -d '02/22/2222 07:21:22' +%s
7956832882
#或者
[llchan@localhost ~]$ date -d '2222-02-22 07:21:22' +"%s"
[lemon@localhost ~]$ date -d '2222-02-22 07:21:22' +"%s"
7956832882
```
@@ -53,11 +53,11 @@ author: lemonchann
#### 格式化输出时间格式
```bash
[llchan@localhost ~]$ date "+%Y-%m-%d"
[lemon@localhost ~]$ date "+%Y-%m-%d"
2020-02-12
[llchan@localhost ~]$ date "+%H:%M:%S"
[lemon@localhost ~]$ date "+%H:%M:%S"
20:01:53
[llchan@localhost ~]$ date "+%Y-%m-%d %H:%M:%S"
[lemon@localhost ~]$ date "+%Y-%m-%d %H:%M:%S"
2020-02-12 20:02:06
```
@@ -144,11 +144,11 @@ author: lemonchann
#### 获取相对当前时间的明天的时间
```bash
[llchan@localhost ~]$ date -d next-day
[lemon@localhost ~]$ date -d next-day
2020年 02月 13日 星期四 20:08:35 CST
#你可以指定输出格式,比如
[llchan@localhost ~]$ date -d next-day +%Y%m%d
[lemon@localhost ~]$ date -d next-day +%Y%m%d
20200213
```
@@ -157,11 +157,11 @@ author: lemonchann
#### 获取相对于当前时间的昨天的时间
```bash
[llchan@localhost ~]$ date -d last-day
[lemon@localhost ~]$ date -d last-day
2020年 02月 11日 星期二 20:11:35 CST
#你也可以指定输出格式,比如
[llchan@localhost ~]$ date -d last-day +%Y%m%d
[lemon@localhost ~]$ date -d last-day +%Y%m%d
20200211
```
@@ -170,11 +170,11 @@ author: lemonchann
#### 获取相对当前时间的上个月的时间
```bash
[llchan@localhost ~]$ date -d last-month
[lemon@localhost ~]$ date -d last-month
2020年 01月 12日 星期日 20:13:20 CST
#同样的你也可以指定输出格式,比如
[llchan@localhost ~]$ date -d last-month +%Y-%m-%d
[lemon@localhost ~]$ date -d last-month +%Y-%m-%d
2020-01-12
```
@@ -183,10 +183,10 @@ author: lemonchann
#### 获取相对当前时间的下个月的时间
```bash
[llchan@localhost ~]$ date -d next-month
[lemon@localhost ~]$ date -d next-month
2020年 03月 12日 星期四 20:15:44 CST
[llchan@localhost ~]$ date -d next-month "+%Y-%m-%d %H:%M:%S"
[lemon@localhost ~]$ date -d next-month "+%Y-%m-%d %H:%M:%S"
2020-03-12 20:15:38
```
@@ -195,7 +195,7 @@ author: lemonchann
#### 获取相对当前时间的明年的时间
```bash
[llchan@localhost ~]$ date -d next-year
[lemon@localhost ~]$ date -d next-year
2021年 02月 12日 星期五 20:17:21 CST
```
@@ -204,7 +204,7 @@ author: lemonchann
#### 获取相对当前时间的上一年的时间
```bash
[llchan@localhost ~]$ date -d last-year
[lemon@localhost ~]$ date -d last-year
2019年 02月 12日 星期二 20:17:29 CST
```

View File

@@ -1,3 +1,5 @@
> 文章每周持续更新,原创不易,「三连」让更多人看到是对我最大的肯定。可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇)
学习关系型数据库MySQL是很好的切入点大部分人工作中用惯了CRUD对面试官刨根问底的灵魂拷问你还能对答如流吗我们有必要了解一些更深层次的数据库基础原理。
整理了面试中关于MySQL事务和存储引擎10个FAQFrequently asked questions你想知道的都在这里。
@@ -190,7 +192,7 @@ MySQL还支持其他一些存储引擎比如memory引擎、NDB集群引擎、
最后,感谢各位的阅读,文章的目的是分享对知识的理解,若文中出现明显纰漏也欢迎指出,我们一起在探讨中学习。
> 可以微信搜索公众号「 后端技术学堂 」回复「资料」「1024」有我给你准备的各种编程学习资料。文章每周持续更新我们下期见
### References

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -1,8 +1,7 @@
什么是微服务和服务治理
> 文章每周持续更新,各位的「三连」是对我最大的肯定。可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇)
## 单体式应用程序
与微服务相对的另一个概念是传统的**单体式应用程序** Monolithic application ,单体式应用内部包含了所有需要的服务。而且各个服务功能模块有很强的耦合性,也就是相互依赖彼此,很难拆分和扩容。
与微服务相对的另一个概念是传统的**单体式应用程序**( Monolithic application ),单体式应用内部包含了所有需要的服务。而且各个服务功能模块有很强的耦合性,也就是相互依赖彼此,很难拆分和扩容。
说在做的各位都写过单体程序大家都没意见吧给大家举个栗子刚开始写代码你写的helloworld程序就是单体程序一个程序包含所有功能虽然helloworld功能很简单。
@@ -16,6 +15,8 @@
单体程序的缺点一开始不是特别明显,项目刚开始需求少,业务逻辑简单,写代码一时爽,一直爽。噩梦从业务迭代更新,系统日益庞大开始,前期的爽没有了,取而代之的是软件维护和迭代更新的无尽痛苦。
![单体架构](https://upload-images.jianshu.io/upload_images/7842464-a3829e92d3f8b90d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
由于单体式应用程序就像一个大型容器一样,里面放置了许多服务,且他们都是密不可分的,这导致应用程序在扩展时必须以「应用程序」为单位。
当里面有个业务模块负载过高时,并不能够单独扩展该服务,必须扩展整个应用程序(就是这么霸道),这可能导致额外的资源浪费。
@@ -24,16 +25,19 @@
## 微服务
微服务 Microservices 就是一些协同工作小而自治的服务。
微服务 (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)) 能力,服务可以用不同的编程语言与数据库等组件实现 。「维基百科」
### 举例
![](http://ww2.sinaimg.cn/large/9150e4e5ly1fswbux3qi6j206y06cmx4.jpg)
还是拿前面的 helloworld 程序来举栗子,想象一下你是 helloworld 公司的 CTO老板还缺人吗会写代码的那种假设你们公司的 helloworld 业务遍布全球,需要编写不同语种的 helloworld 版本,分别输出英语、日语、法语、俄语...现在世界有6000多种语言奇怪的知识又增加了
有人会说这还不简单我用`switch case`语句就完事了,同学,不要较真我就是举个例子,现实中的业务比 helloworld 复杂多了。好了,我们姑且认为按语言输出是个庞大复杂的工作,这时候就可以用微服务架构了,架构图如下:
![微服务架构](https://upload-images.jianshu.io/upload_images/7842464-fb70f0681d8bdf16.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
## 微服务与SOA
@@ -55,9 +59,13 @@
#### 技术异构性
不同服务内部的开发技术可以不一致你可以用java来开发helloworld服务A用golang来开发helloworld服务B大家再也不用为哪种语言是世界上最好的语言而争论不休。
![微服务架构-多技术](https://upload-images.jianshu.io/upload_images/7842464-cb50824fae547f82.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
为不同的服务选择最适合该服务的技术系统中不同部分也可以使用不同的存储技术比如A服务可以选择redis存储B服务你可以选择用MySQL存储这都是允许的你的服务你做主。
#### 隔离性
一个服务不可用不会导致另一个服务也瘫痪,因为各个服务是相互独立和自治的系统。这在单体应用程序中是做不到的,单体应用程序中某个模块瘫痪,必将导致整个系统不可用,当然,单体程序也可以在不同机器上部署同样的程序来实现备份,不过,同样存在上面说的资源浪费问题。
@@ -82,39 +90,42 @@
为了解决微服务的缺点,前辈们提出了下面这些概念。
**服务注册与发现**
#### 服务注册与发现
微服务之间相互调用完成整体业务功能,如何在众多微服务中找到正确的目标服务地址,这就是所谓「服务发现」功能。
常用的做法是服务提供方启动的时候把自己的地址上报给「服务注册中心」,这就是「服务注册」。服务调用方订阅服务变更通知」,动态的接收服务注册中心推送的动态服务地址列表,以后想找哪个服务直接发给他就可以。
常用的做法是服务提供方启动的时候把自己的地址上报给「服务注册中心」,这就是「服务注册」。服务调用方订阅服务变更通知」,动态的接收服务注册中心推送的服务地址列表,以后想找哪个服务直接发给他就可以。
**服务监控**
![服务发现](https://upload-images.jianshu.io/upload_images/7842464-db86dceac215e2fd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
#### 服务监控
单体程序的监控运维还好说,大型微服务架构的服务运维是一大挑战。服务运维人员需要实时的掌握服务运行中的各种状态,最好有个控制面板能看到服务的内存使用率、调用次数、健康状况等信息。
这就需要我们有一套完备的服务监控体系包括拓扑关系、监控Metrics、日志监控Logging、调用追踪Trace、告警通知、健康检查等防患于未然。
**服务容错**
#### 服务容错
任何服务都不能保证100%不出问题,生产环境复杂多变,服务运行过程中不可避免的发生各种故障(宕机、过载等等),工程师能够做的是在故障发生时尽可能降低影响范围、尽快恢复正常服务。
程序员为此避免被祭天,需要引入「熔断、隔离、限流和降级、超时机制」等「服务容错」机制来保证服务持续可用性。
**服务安全**
#### 服务安全
有些服务的敏感数据存在安全问题,「服务安全」就是对敏感服务采用安全鉴权机制,对服务的访问需要进行相应的身份验证和授权,防止数据泄露的风险,安全是一个长久的话题,在微服务中也有很多工作要做。
## 服务治理
说到「治理」一般都是有问题才需要治理,我们平常说环境治理、污染治理一个意思,微服务架构中的微服务越来越多,上面说的那些问题就更加显现,为了解决上面微服务架构缺陷「服务治理」就出现了。
![](http://ww2.sinaimg.cn/large/9150e4e5gy1fx4lsf0onmj20dw0dwwes.jpg)
微服务的那些问题都要公司技术团队自己解决的话,如果不是大型公司有成熟的技术团队,估计会很头大。幸好,有巨人的肩膀可以借给我们站上去,通过引入「微服务框架」来帮助我们完成服务治理。
## 微服务框架
业界比较成熟的微服务框架
介绍一些业界比较成熟的微服务框架。
### Dubbo
@@ -130,23 +141,28 @@
腾讯内部使用的微服务架构 TAFTotal Application Framework多年的实践成果总结而成的开源项目。 仅支持 C++ 语言目前在腾讯内部应用也非常广泛。2017 年对外开源,仅支持 C++ 语言。
源码: `https://github.com/TarsCloud/Tars/blob/master/ `
源码: `https://github.com/TarsCloud/Tars/ `
![TARS架构图|来源github.com/TarsCloud](F:\github\lemonchann.github.io\_posts\架构\TARS.png)
![TARS架构图|来源github.com/TarsCloud](https://upload-images.jianshu.io/upload_images/7842464-66f3c1a50c8518f5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
本命鹅厂TARS框架介绍PPT已下载不想自己麻烦去找的同学在我公众号「后端技术学堂」回复「tars」获取。
**本命鹅厂 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)
官方指南: `https://github.com/weibocom/motan/wiki/zh_userguide`
![Motan框架|图片来源github.com/weibocom/motan](https://github.com/weibocom/motan/wiki/media/14612352579675.jpg)
### gRPC
是Google开发的高性能、通用的开源RPC框架其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计基于ProtoBuf(Protocol Buffers)序列化协议开发。本身它不是分布式的所以要实现上面的框架的功能需要进一步的开发。2015 年对外开源的跨语言 RPC 框架,支持多种语言。
教程:` https://doc.oschina.net/grpc?t=58008 `
中文教程:` https://doc.oschina.net/grpc?t=58008 `
![gRPC架构图|图片来源www.grpc.io](http://www.grpc.io/img/grpc_concept_diagram_00.png)
@@ -154,7 +170,7 @@
最初是由 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)
![thrift架构 | 图片来源wikimedia](https://upload.wikimedia.org/wikipedia/commons/d/df/Apache_Thrift_architecture.png)
@@ -189,23 +205,32 @@ Service Mesh 有如下几个特点:
### Why Service Mesh
为什么现有微服务架构已经解决的问题还要用`Service Mesh`呢?`istio.io`上对`service mesh`的解释,我觉得挺好的,摘抄出来:
为什么现有微服务架构已经解决的问题还要用`Service Mesh`呢?这个问题问的好。
![](http://wx3.sinaimg.cn/large/006ARE9vgy1fy0s455zzxj303c02pjrb.jpg)
回答问题之前,先看下`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)
用了`Service Mesh`你也不必去操心「服务治理」的细节,不需要对服务做特殊的改造,所有业务之外的功能都由`Service Mesh`帮你去做了。它就像一个`轻量级网络代理` 对应用程序来说是透明,所有应用程序间的流量都会通过它,所以对应用程序流量的控制都可以在 `serivce mesh` 中实现 。
![ Service Mesh架构|图片来自:[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)
## 写在最后
在IT世界没有什么技术是永不过时的微服务架构的演进就是一个例子从单体程序到微服务架构再到`service mesh`架构我不知道下一个技术迭代点是什么时候但我知道微服务架构肯定还会更新IT人更应该建立终身学习习惯。
当然更重要的是拥有对技术的热情热于拥抱变化、接受新技术当我看到新技术我是兴奋的内心os是`厉害了,还能这么玩!`,希望你也有这般热情,而不仅仅是面向工资编程,生活会有趣很多。
老规矩。感谢各位的阅读,文章的目的是分享对知识的理解,技术类文章我都会反复求证以求最大程度保证准确性,若文中出现明显纰漏也欢迎指出,我们一起在探讨中学习。
**原创不易,看到这里动动手指,各位的「三连」是对我持续创作的最大支持。**
> 可以微信搜索公众号「 后端技术学堂 」回复「资料」有我给你准备的各种编程学习资料。文章每周持续更新,我们下期见!
## reference
@@ -223,3 +248,4 @@ Service Mesh 有如下几个特点:
https://jimmysong.io/blog/what-is-a-service-mesh/
https://github.com/weibocom/motan/wiki/zh_userguide

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB