微服务架构知识总结
一、单体架构
1. 单体架构的简介
2. 单体架构的架构图
3. 单体架构的优点
4. 单体架构的缺点
二、微服务架构
1. 微服务架构的简介
2. 微服务架构的架构图
3. 微服务架构的设计原则
4. 微服务架构的优点
5. 微服务架构的缺点
6. 微服务架构的拆分思路
6.1 横向拆分:根据业务来拆分
6.2 纵向拆分:根据层次来拆分
7. 微服务架构的选择
7.1 Dubbo(RPC)
7.1.1 Dubbo
7.1.2 RPC
7.2 SpringCloud(HTTP)
7.2.1 SpringCloud
7.2.2 HTTP
7.3 小结
8. 微服务架构的基本概念
8.1 服务提供者(Provider)
8.2 服务调用者(Consumer)
什么是微服务架构
微服务是指开发一个单个 小型的但有业务功能的服务,每个服务都有自己的处理和轻量通讯机制,可以部署在单个或多个服务器上.
微服务也指一种种松耦合的、有一定的有界上下文的面向服务架构.也就是说,如果每个服务都要同时修改,那么它们就不是微服务,因为它们紧耦合在一起;如果你需要掌握一个服务太多的上下文场景使用条件,那么它就是一个有上下文边界的服务,这个定义来自DDD领域驱动设计.
Spring Cloud微服务体系的组成
Netflix Eureka是Spring Cloud服务注册发现的基础组件
Eureka提供RESTful风格(HTTP协议)的服务注册与发现
Eureka采用C/S架构,Spring Cloud内置客户端
启用应用,访问
Eureka客户端开发要点
maven依赖spring-cloud-starter-netflix-eureka-client application.yml
配置eureka.client.service-url.defaultZone
入口类增加@EnableEurekaClient
先启动注册中心,在启动客户端,访问 localhost:8761查看eureka注册中心,看到客户端注册
Eureka名词概念
Register - 服务注册, 向Eureka进行注册登记
Renew - 服务续约,30秒/次心跳包健康检查.90秒未收到剔除服务
Fetch Registries - 获取服务注册列表,获取其他微服务地址
Cancel - 服务下线, 某个微服务通知注册中心暂停服务
Eviction - 服务剔除,90秒未续约,从服务注册表进行剔除
Eureka自我保护机制
Eureka在运行期去统计心跳失败率在15分钟之内是否低于 85%
如果低于 85%,会将这些实例保护起来,让这些实例不会被剔除
关闭自我保护:eureka.服务实例.
enable-self-preservation: false
PS: 如非网络特别不稳定,建议关闭
Eureka高可用配置步骤
服务提供者defaultZone指向其他的Eureka
客户端添加所有Eureka 服务实例 URL
Actuator自动为微服务创建一系列的用于监控的端点
Actuator在SpringBoot自带,SpringCloud进行扩展
pom.xml依赖spring-boot-starter-actuator
RestTemplate + @LoadBalanced 显式调用
OpenFeign 隐藏微服务间通信细节
Ribbon是RestTemplate与OpenFeign的通信基础
Feign是一个开源声明式WebService客户端,用于简化服务通信
Feign采用“接口+注解”方式开发,屏蔽了网络通信的细节
OpenFeign是SpringCloud对Feign的增强,支持Spring MVC注解
1.新建Spring boot Web项目,application name 为 product-service
在pom.xml中引入依赖
spring-cloud-starter-alibaba-nacos-discovery作用为向Nacos server注册服务。
spring-cloud-starter-openfeign作用为实现服务调用。
2.修改application.yml配置文件
3.在启动类上添加@EnableDiscoveryClient、@EnableFeignClients注解
4.编写OrderClient Interface
注:/api/v1/order/test 会在下面order-service声明。
OrderClient.java
5.编写Controller和service
ProductController.java
ProductService.java
1.OpenFeign开启通信日志
基于SpringBoot的logback输出,默认debug级别
设置项:feign.client.config.微服务id.loggerLevel
微服务id:default代表全局默认配置
2.通信日志输出格式
NONE: 不输出任何通信日志
BASIC: 只包含URL、请求方法、状态码、执行时间
HEADERS:在BASIC基础上,额外包含请求与响应头
FULL:包含请求与响应内容最完整的信息
3.OpenFeign日志配置项
LoggerLevel开启通信日志
ConnectionTimeout与ReadTimeout
利用httpclient或okhttp发送请求
1.OpenFeign通信组件
OpenFeign基于JDK原生URLConnection提供Http通信
OpenFeign支持Apache HttpClient与Square OkHttp
SpringCloud按条件自动加载应用通信组件
2.应用条件
Maven引入feign-okhttp或者feign-httpclient依赖
设置feign.[httpclient|okhttp].enabled=true
POST方式传递对象使用@RequestBody注解描述参数
GET方式将对象转换为Map后利用@RequestParam注解描述
雪崩效应:服务雪崩效应产生与服务堆积在同一个线程池中,因为所有的请求都是同一个线程池进行处理,这时候如果在高并发情况下,所有的请求全部访问同一个接口,这时候可能会导致其他服务没有线程进行接受请求,这就是服务雪崩效应效应。
服务熔断:熔断机制目的为了保护服务,在高并发的情况下,如果请求达到一定极限(可以自己设置阔值)如果流量超出了设置阈值,让后直接拒绝访问,保护当前服务。使用服务降级方式返回一个友好提示,服务熔断和服务降级一起使用。
1.Hystrix熔断器
Hystrix(豪猪)是Netflix开源的熔断器组件,用于为微服务提供熔断机制预防雪崩,保护整体微服务架构的健康
2.Hystrix功能
预防微服务由于故障,请求长时间等待导致Web容器线程崩溃
提供故障备选方案,通过回退(fallback)机制提供”服务降级”
提供监控仪表盘,实时监控运行状态
3.Hystrix 熔断器工作原理
服务的健康状况 = 请求失败数 / 请求总数.
熔断器开关由关闭到打开的状态转换是通过当前服务健康状况和设定阈值比较决定的.
当熔断器开关关闭时, 请求被允许通过熔断器. 如果当前健康状况高于设定阈值, 开关继续保持关闭. 如果当前健康状况低于
设定阈值, 开关则切换为打开状态.
当熔断器开关打开时, 请求被禁止通过.
当熔断器开关处于打开状态, 经过一段时间后, 熔断器会自动进入半开状态, 这时熔断器只允许一个请求通过. 当该请求调用
成功时, 熔断器恢复到关闭状态. 若该请求失败, 熔断器继续保持打开状态, 接下来的请求被禁止通过.
熔断器的开关能保证服务调用者在调用异常服务时, 快速返回结果, 避免大量的同步等待. 并且熔断器能在一段时间后继续侦测请求执行结果, 提供恢复服务调用的可能.
4.什么情况下会触发服务降级
FAILURE: 执行失败,抛出异常
TIMEOUT:执行超时(默认1秒)
SHORT_CIRCUITED:熔断器状态为Open
THREAD_POOL_REJECTED:线程池拒绝
SEMAPHORE_REJECTED:信号量拒绝
5.使用Hystrix步骤
1.引入pom文件依赖
6.OpenFeign与Hystrix整合
OpenFeign中使用Hystrix
OpenFeign内置Hystrix,feign.hystrix.enable开启即可
feign: hystrix: enabled: true
在@FeignClient增加fallback属性说明Fallback类
@FeignClient(name="message-service",fallback = MessageServiceFallback.class) public interface MessageService { @GetMapping("/sendsms") public CallbackResult sendSMS(@RequestParam("mobile") String mobile , @RequestParam("message") String message); }
Fallback类要实现相同接口,重写服务降级业务逻辑
@Component public class MessageServiceFallback implements MessageService { @Override public CallbackResult sendSMS(String mobile, String message) { return new CallbackResult("INVALID_SERVICE","消息服务暂时无法使用,短信发送失败"); } }
7.Hystrix超时设置
8.部署Hystrix Dashboard监控
Hystrix Client依赖hystrix-metrics-event-stream
Hystrix Client注册HystrixMetricsStreamServlet
监控微服务依赖spring-cloud-starter-netflix-hystrix-dashboard
监控微服务利用@EnableHystrixDashboard开启仪表盘
9.Hystrix熔断设置
产生熔断的条件:
当一个Rolling Window(滑动窗口)的时间内(默认:10秒),最近20次调用请求,请求错误率超过50%,则触发熔断5秒,期间快速失败。
TIPS: 如10秒内未累计到20次,则不会触发熔断
Hystrix熔断设置项:
统一访问出入口,微服务对前台透明
安全、过滤、流控等API管理功能
易于监控、方便管理
Netflix Zuul
Spring Cloud Gateway
Zuul 是Netflix开源的一个API网关, 核心实现是Servlet
Spring Cloud内置Zuul 1.x
Zuul 1.x 核心实现是Servlet,采用同步方式通信
Zuul 2.x 基于Netty Server,提供异步通信
认证和安全
性能监测
动态路由
负载卸载
静态资源处理
压力测试
Spring Cloud Gateway,是Spring“亲儿子”
Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式
Gateway基于Spring 5.0与Spring WebFlux开发,采用Reactor响应式设计
1.使用三部曲
依赖spring-cloud-starter-netflix-zuul
入口增加 @EnableZuulProxy
application.yml 增加微服务映射
2.微服务映射
Spring Cloud Zuul内置Hystrix
服务降级实现接口:FallbackProvider
1.微服务网关流量控制
微服务网关是应用入口,必须对入口流量进行控制
RateLimit是Spring Cloud Zuul的限流组件
RateLimit采用“令牌桶”算法实现限流
2.什么是令牌桶
1.Zuul的执行过程
2.Http请求生命周期
1.需要实现ZuulFilter接口
shouldFilter() - 是否启用该过滤器
filterOrder() - 设置过滤器执行次序
filterType() - 过滤器类型:pre|routing|post
run() - 过滤逻辑
2.Zuul内置过滤器
3.Zuul+JWT跨域身份验证
1.Spring Cloud Config
2.携程 Apollo
3.阿里巴巴Nacos
1.依赖"spring-cloud-starter-config"
2.删除application.yml,新建bootstrap.yml
3.配置"配置中心"服务地址与环境信息
1、微服务依赖"spring-boot-starter-actuator";
2、动态刷新类上增加@RefreshScope注解
3、通过/actuator/refresh刷新配置
1、通过加入重试机制、提高应用启动的可靠性;
2、重试触发条件1:配置中心无法与仓库正常通信
3、重试触发条件2:微服务无法配置中心正常通信
微服务架构总览
微服务是一种基于有界上下文的,松散耦合的面向服务的架构。
什么场景下适用微服务?什么阶段时适用微服务?
设计的微服务系统的组织,其产生的架构设计应等价于组织间的沟通结构。
这句话的意思是说,原始组织之间的结构最好能映射到设计的微服务系统架构上。比如一个系统包含订单、商品、用户等功能,现实中分别由A、B、C三个小组进行开发维护,那么如果要拆分为微服务的架构,最好就能拆分为订单服务、商品服务、用户服务三个微服务,对应A、B、C三个现实的小组结构。
微服务并不是适合任何阶段,最好的方式就是随着项目的扩大或者团队的扩大时,逐步演进到微服务。因为单体应用会随着规模的扩大而逐渐增加内耗,导致生产力降低。微服务的目标是在规模扩大时,使得生产力能维持在一个稳定的水准之上。
微服务生产力超过单体的拐点,一般来说是指当团队人数规模达到百人时。当然,这也不是绝对的,需要团队负责人自己视情况进行评估。
如果在项目一开始就设计微服务的架构,一路上会遇到极大的困难与风险。比如业务模块边界的划分、无法预估的业务或者技术复杂性,这些都会耗费更多的人力和时间,甚至最终导致项目失败。
建议的方式就是由单体演进,我们可以在单体阶段不断摸索和沉淀业务和技术上的问题,随着越来越清晰的认知,再加上日渐增加的复杂度,可以考虑逐步拆分部分服务出来,朝着微服务架构的方向演进。
微服务架构中服务与服务各有不同,相互之间也应该按照层级的方式进行编排。有的与业务无关的服务天然属于底层基础服务,有的与业务有关联的服务则属于聚合了基础服务的聚合服务。
在常见的公司微服务总体架构中,一般的架构表现就如下所示:
有了各个层级的服务之后,中台的概念和战略就显得很自然。
服务注册与发现是微服务架构得以运转的核心功能,它不提供任何业务功能,仅仅用来进行服务的发现和注册,并对服务的健康状态进行监控和管理。其核心的工作原理:
现在注册中心比较多,主流的有Eureka、Consul、Zookeeper、Nacos等。
网关是整个系统对外暴露的唯一入口,它封装了系统内的所有微服务,对外看来,别人只知道也只能通过网关才可以和系统进行交互。网关对所有请求进行非业务功能的处理,然后再将请求发送给内部指定的微服务进行业务上的处理。总的来说,网关最主要的功能如下:
现在常见的网关有Kong、Zuul、Spring Cloud Gateway等;
在实际应用中,一个微服务体系架构的系统可以有多个网关用来应对不同的使用场景,比如公司内网网关、外网网关、提供给第三方调用的网关等;
微服务在启动和运行的过程中,经常会需要读取一些配置信息,这些配置信息拥有如下的特点:
如上这些特点和需求,催生了配置中心的出现。现在主流的配置中心有Spring Cloud Config、Nacos、Apollo等;
在微服务架构中,一次调用请求可能贯穿多个服务,这些服务可能是由不同的团队使用不同的技术开发而成的,如果出现调用失败需要排查问题时,如何能快速地复现调用现场,发现问题出在哪个服务哪个服务器上就成了全链路监控需要解决的问题。
全链路监控的基本原理都是:
全链路监控主流工具有CAT、Zipkin、Pinpoint、Skywalking等;
在微服务架构体系中,服务之间的调用是很频繁的,一旦某些服务出现故障或者高延迟,会很可能造成级联故障,如果客户端还在不停重试,将会加剧问题的严重性,最终导致整个系统彻底崩溃。
断路器的设计与实现有助于防止多服务之间的级联故障,允许我们构建具有容错性和高弹性的微服务架构系统,当某些服务不可用时,提供服务熔断和服务降级功能,保证系统的其它部分仍能正常运行。
断路器的三个状态和含义如下:
主流常见的断路器有Hystrix、Sentinel等;
如果使用了容器技术,那么容器编排、发布、治理就成了避不开的话题。主流的技术如下:
各大容器云厂商基本都是使用基于k8s的容器治理方案,k8s也已经成为该领域事实上的标准了。
如上是自己在极客时间App上学习《微服务架构核心20讲》的笔记,该课程一天就能学完,没有实现微服务的细节,是高屋建瓴地讲解微服务架构的蓝图,带你鸟瞰整个微服务架构,推荐学习。
微服务架构是什么
微服务架构,主要是中间层分解,将系统拆分成很多小应用(微服务),微服务可以部署在不同的服务器上,也可以部署在相同的服务器不同的容器上。当应用的故障不会影响到其他应用,单应用的负载也不会影响到其他应用,其代表框架有 Spring cloud、Dubbo 等。
微服务 Microservices 之父,马丁.福勒,对微服务大概的概述如下:就目前而言,对于微服务业界并没有一个统一的、标准的定义(While there is no precise definition of this architectural style ) 。但通常在其而言,微服务架构是一种架构模式或者说是一种架构风格,它提倡将单一应用程序划分成一组小的服务,每个服务运行独立的自己的进程中,服务之间互相协调、互相配合,为用户提供最终价值。服务之间采用轻量级的通信机制互相沟通(通常是基于 HTTP 的 RESTful API ) 。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建,可以有一个非常轻量级的集中式管理来协调这些服务。可以使用不同的语言来编写服务,也可以使用不同的数据存储。
六种常见的微服务架构模式:
1、聚合器微服务设计模式
聚合器调用多个服务实现应用程序所需的功能。它可以是一个简单的Web页面,将检索到的数据进行处理展示。它也可以是一个更高层次的组合微服务,对检索到的数据增加业务逻辑后进一步发布成一个新的微服务,这符合DRY原则。另外,每个服务都有自己的缓存和数据库。如果聚合器是一个组合服务,那么它也有自己的缓存和数据库。聚合器可以沿X轴和Z轴独立扩展。
2、代理微服务设计模式
这是聚合模式的一个变种,在这种情况下,客户端并不聚合数据,但会根据业务需求的差别调用不同的微服务。代理可以仅仅委派请求,也可以进行数据转换工作。
3、链式微服务设计模式
这种模式在接收到请求后会产生一个经过合并的响应,在这种情况下,服务A接收到请求后会与服务B进行通信,类似地,服务B会同服务C进行通信。所有服务都使用同步消息传递。在整个链式调用完成之前,客户端会一直阻塞。因此,服务调用链不宜过长,以免客户端长时间等待。
4、分支微服务设计模式
这种模式是聚合器模式的扩展,允许同时调用两个微服务链。
5、数据共享微服务设计模式
自治是微服务的设计原则之一,就是说微服务是全栈式服务。但在重构现有的“单体应用(monolithic application)”时,SQL数据库反规范化可能会导致数据重复和不一致。因此,在单体应用到微服务架构的过渡阶段,可以使用这种设计模式,在这种情况下,部分微服务可能会共享缓存和数据库存储。不过,这只有在两个服务之间存在强耦合关系时才可以。对于基于微服务的新建应用程序而言,这是一种反模式。
6、异步消息传递微服务设计模式
虽然REST设计模式非常流行,但它是同步的,会造成阻塞。因此部分基于微服务的架构可能会选择使用消息队列代替REST请求/响应。