截止目前来说微服务架构算是Java程序员的最后一站了(就我所理解是这样的)。初学者对它会有些恐惧,它的架构图很复杂,也很庞大,但只要你明白了其中的逻辑,代码的编写就不那么难了,就像写代码最难的是不知道写什么,并不是怎么写,这篇文章就是帮助你来理解微服务。
具体的学习可以去B站上面看阳哥的SpingCloud第二季,可能初看会有些迷茫,但是看两遍应该可以了解其中精髓,然后就是自己上手去写了。
技术的更新迭代属实是快,阳哥的SpringCloud第一季是18年录制,第二季是20年录制的。稍微了解一点微服务就知道里面有很多的组件,而第二季基本上替换了第一季的全部组件,不过好在思想不变。
我搜索了很多架构图都写的很好,但是不好理解,因为他们都画的大而全,所以我就按照执行的流程图去画了一个简单的,理解之后再去加上:集群概念就好了。
每一个过程都有多种具体实现,而现在最火的微服务是springcloud alibaba,我把相关匹配的组件都标红了。(当然了每个过程还有其它组件就不一一写出了)
我们写了一个查看当前时间的服务,谁需要使用,谁就通过接口去查询,这个就是服务的调用方,一般我们都是通过浏览器来访问的。
在微服务中,我们的服务入口是网关。微服务每一个过程都是部署多份的,每个网关提供的服务也是一样的。
如果所有的请求都去访问一个网关,那这个网关也是遭不住的,所以这时候我们可以使用nginx做负载均衡。
Nginx实现负载均衡Linux版本(六种负载策略)
我们会提供很多服务,用户服务、账单服务、消息服务、订单服务…
每一个服务都会部署N份,每一份都有单独的ip、port,我们不可能让调用者去记录每一个ip、port,这时候就产生了网关的概念。
调用方只需要去请求我们的网关,网关再去调用具体的服务。(网关先去注册中心找到对应的服务信息,然后再通过负载均衡策略去调用)
同上面,我们有很多的服务,每个服务能做什么。这是一个庞大的信息量,网关很难去找到对应的服务,这时候我们就需要一个注册中心。
把所有的服务信息都放到注册中心里面,然后我们的网关直接查询请求所对应的服务信息就好了。
每一种服务,比如消息服务,都是会提供多份的,所以我们需要使用某种负载策略去调用。
具体的服务提供者,比如消息服务、账单服务。
当大量请求过来之后,我们服务被击溃了,这时候就需要一种自我保护机制,也就是服务熔断。服务熔断之后我们的请求都会立马返回错误的结果。
hystrix:服务熔断之后会有一个半熔断状态,这时候它会去尝试通过少量的请求看服务是否可用,如果可以,服务恢复,不可以则继续熔断
sentinel:没有半熔断状态,只有熔断和恢复两种
可以理解成提供一个计划B,我们的服务是计划A,B是一个兜底的服务。
本来正常情况下,我们的服务应该返回结果Axxxxx,但是现在我们的服务不可用了,如果直接返回错误十分不友好,所以我们可以返回Bxxxx。
如果请求量过大,服务定然击垮,这样所有的请求过来都会得到错误的结果。这时我们应该进行限流,让一部分请求是可以得到正确的结果,肯定是好过所有的请求都失败。
我们要看到每个服务,在某个时间段请求的情况,比如成功次数、失败次数、超时次数,等等。
我们的微服务很少是调用一个服务就能返回结果的,通常都是一个请求过来,然后服务A > 服务B > 服务C,如果我们想要看到完整的服务调用链路呢?
还有很多其它的监控场景,这时候我们就需要搭建一个服务监控了。
我们的微服务会有很多的个服务,每个服务都有自己的配置文件,比如说我们的服务A,部署了18份,现在我们要修改里面的一个配置文件,我们要怎么去做呢?
很显然,我们可以去手动的修改这18个配置文件,但也很显然,这是一个傻叉的做法。
所有我们需要一个统一配置文件的功能,最终实现我们在总配置里面修改一下,然后每一个小的服务都可以收到了。
我们在还没有学习微服务的时候,相比也遇到了分布式事务的问题。
比如我们的服务A去调用服务B,怎么保证服务A、B的事务呢?
如果A、B必须要是原子性,也不是不可以,但会很复杂。
分布式事务就是来解决这个痛点,我们只要使用简单的注解即可实现分布式事务的一致性。
小伙伴可以关注我的公众号,一个不务正业的程序员,可以和我一起交流技术、生活。
小道仙97