文章详情
:😊 @ 作者:Lion J
💖 @ 主页: https://blog.csdn.net/weixin_69252724
🎉 @ 主题: 微服务相关知识
⏱️ @ 创作时间:2024年03月8日
————————————————
文章目录
- 文章详情
- 前言
- 一、微服务概述
- 1、微服务是什么?
- 2、微服务存在的问题
- 3、微服务常见概念
- 服务治理
- 服务调用
- 负载均衡
- 服务网关
- 服务容错
- 二、微服务Demo搭建
- 服务调用
- 用Nacos Discover--服务治理
- nacos环境搭建
- nacos中来服务调用
- 负载均衡(在服务消费者上搭建)
- 基于Ribbon实现负载均衡
- 基于Feign实现负载均衡
- 服务容错
- 常见的容错方案
- 常见的容错组件
- Sentinel使用及概念
- sentinel搭建
- 微服务网关
- 常用网关
- Gateway 快速搭建
- 三、总结
前言
在现在这个网络飞速发展的时代, 网站请求量也是越来越大, 从而导致系统架构也在不断发生变化;在早期的单体架构, **由于业务需求量,以及项目的拓展问题, 项目业务要求解耦, 代码的可维护性…**摒弃了原来单体架构,升级为微服务架构
正文
一、微服务概述
1、微服务是什么?
微服务,顾名思义就是很多个微小的服务; 何为很多个微小的服务呢?就是将一个项目的功能分割开,将不同的功能抽离出来,实现低耦合, 把一个功能相关的代码合并在一起.实现高内聚; 将各个功能不相干扰, 各个功能已于维护.
如图: 是一个商品订单服务
2、微服务存在的问题
- 既然有许多个服务,那么应该将他们集中在一起易于管理,
- 要实现一个微服务调用另一个时性能,出现bug…问题时,如何进行自排查,自处理?
客户端如何调用它们,每一次都是不同的微服务ip的话,会导致某一个服务请求压力大,从而崩塌…问题
以上每一个问题都是服务区架构里面不可绕过的大头
3、微服务常见概念
服务治理
就是进行服务的自动化管理, 核心就是服务的自动注册与发现
注册中心
注册中心的概念, 就是用来管理各个服务的
服务调用
就是一个服务去调用另一个服务的功能接口,实现两个服务之间的远程调用
目前主流的调用技术即使基于HTTP的Restful接口以及RPC(远程过程调用)
负载均衡
通俗的讲, 负载均衡就是将负载(工作任务,访问请求)进行分摊到多个
操作单元(服务器,组件)上进行执行。
服务网关
服务越多,服务的网络请求地址也会多
- 客户端在要使用不同的功能要使用对应的url地址,客户更加繁琐
- 存在跨域问题
- 在前端每次访问不同的微服务都要进行单独的的身份验证,业务重复,浪费通信资源
网关就是将所有微服务地址做到同一的管理, ip地址统一起来, 每次请求都是从网关进行请求和响应
网关功能: 统一接入、安全防护、协议适配、流量管控、长短链接支持、容错能力。有了网关之后,各个API服务提供团队可以专注于自己的的业务逻辑处理,而API网关更专注于安全、流量、路由等问题。
服务容错
在一次服务调用中,涉及到多的微服务,那么如果在某个调用环节出错,就会出现一连串的服务不可用, 叫做服务雪崩,不能做到100%的预防服务雪崩,所以就只能尽最大可能去做服务认错,使得服务报错,还能接着走下去;
二、微服务Demo搭建
开始搭建微服务
可以使用Spring Could Alibaba 来提供微服务开发, 可以通过阿里的中间件来迅速搭建分布式系统, 只需要写几个注解
搭建一个类似于购物的微服务
请求如下图
就做到了订单服务的下订单于给用户返回订单消息做到解耦
服务调用
检查库存情况, 这次请求,如果使用resful格式调用
RestTemplate restTempalte = restTemplateConfig.createRestTempalte();Product product = restTempalte.getForObject("http://service-product/product/get/"+pid, Product.class);
这种调用方式就会存在很多问题
- 服务提供者地址发生变化, 就需要修改原代码,维护性差
- 一旦多个服务提供者,就无法实现负载均衡
3, 服务如果越来越多,维护麻烦,服务之间关系复杂
这种restful格式就淘汰
用Nacos Discover–服务治理
可以解决上面存在的问题
●服务治理: 是微服务架构中最核心最基本的模块。用于实现各个微服务的自动化注册与发现。
●服务注册:在服务治理框架中,都会构建一个注册中心,每个服务单元向注册中心登记自己提供服务的详细信息。并在注册中心形成一张服务的清单,服务注册中心**需要以心跳的方式去监测清单中的服务是否可用,**如果不可用,需要在服务清单中剔除不可用的服务。
常见的注册中心
- Zookeeper zookeeper是一个分布式服务框架,是Apache的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
- Eureka Eureka是SpringCloud微服务框架默认的也是推荐的服务注册中心,由Netflix公司与2012将其开源出来,主要作用就是做服务注册和发现。但是现在已经闭源,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能
- Nacos Nacos是阿里巴巴最新开源的项目,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它是SpringCloudAlibaba组件之一,负责服务注册发现和服务配置。
nacos环境搭建
搭建
- 安装nacos
地址: https://github.com/alibaba/nacos/releases
下载是zip格式,进行解压缩 - 启动nacos
–切换目录
cd nacos/bin
–启动命令
startup.cmd -m standalone - 访问nacos
–打开浏览器
http://localhost:8848/nacos.即可访问服务,默认账号密码nacos nocos
商品微服务注册到nocas
#修改shop-user代码
- pom.xml添加nacos依赖
<!--nacos 客户端--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
- 启动类添加@EnableDiscoveryClient注解
- 在application.yml中为每个微服务定义服务名,并添加nacos服务的地址
- 服务启动就会在nacos中注册管理
nacos中来服务调用
使用nacos客户端根据服务名动态获取服务地址和端口
负载均衡(在服务消费者上搭建)
自定义负载均衡
增加两个商品服务, 然后通过获取随机数的方式获取两个中的一个微服务
基于Ribbon实现负载均衡
通过配置实现负载均衡
Ribbon是SpringCloud的一个组件,它可以让我们使用一个注解就能轻松的搞定负载均衡
搭建
- 在RestTemplate的生成方法上添加**@LoadBalanced注解**
- 修改调用服务方法
restTemplate.getForObject(“http://服务名/product/get/”+pid,Product.class);
Ribbon支持的负载均衡策略Ribbon内置了多种负载均衡策略,感兴趣去搜搜, 比如: 轮询、权重、随机…
- nacos配置
基于Feign实现负载均衡
接口+注解实现
Nacos很好的兼容了Feign,Feign默认集成了Ribbon,所以在Nacos下使用Fegin默认就实现了负载均衡的效果。
搭建
- 订单服务加上Feign依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
- 启动类上加Fegin注解
@EnableFeignClients//开启 Fegin - 创建服务提供者的接口,并用Fegin实现微服务调用
访问地址要求一样
方法参数要求一样
服务容错
在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用,但是由于网络原因或者自身的原因,服务并不能保证服务的100%可用,如果单个服务出现问题,调用这个服务就会出现网络延迟,此时若有大量的网络涌入,会形成任务堆积,最终导致服务瘫痪。
由于服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩效应”。
雪崩发生的原因多种多样,有不合理的容量设计,或者是高并发下某一个方法响应变慢,亦或是某台机器的资源耗尽。我们无法完全杜绝雪崩源头的发生,只有做好足够的容错,保证在一个服务发生问题,不会影响到其它服务的正常运行。也就是"雪落而不雪崩"
常见的容错方案
**隔离:**它是指将系统按照一定的原则划分为若干个服务模块,各个模块之间相对独立,无强依赖。当有故障发生时,能将问题和影响隔离在某个模块内部,而不扩散风险,不波及其它模块,不影响整体的系统服务。常见的隔离方式有:线程池隔离和信号量隔离.
超时: 在上游服务调用下游服务的时候,设置一个最大响应时间,如果超过这个时间,下游未作出反应,就断开请求,释放掉线程。
**限流:**限流就是限制系统的输入和输出流量已达到保护系统的目的。为了保证系统的稳固运行,一旦达到的需要限制的阈值,就需要限制流量并采取少量措施以完成限制流量的目的。
**熔断: **在互联网系统中,当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。这种牺牲局部,保全整体的措施就叫做熔断。
**降级:**降级其实就是为服务提供一个托底方案,一旦服务无法正常调用,就使用托
常见的容错组件
●Hystrix: Hystrix是由Netflflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性与容错性
●Resilience4J: Resilicence4J一款非常轻量、简单,并且文档非常清晰、丰富的熔断工具,这也是Hystrix官方推荐的替代产品。不仅如此,Resilicence4j还原生支持
SpringBoot,而且监控也支持和prometheus等多款主流产品进行整合。
●*Sentinel: Sentinel是阿里巴巴开源的一款断路器实现,本身在阿里内部已经被大规模采用,非常稳定。
Sentinel使用及概念
sentinel是什么
Sentinel(分布式系统的流量防卫兵)是阿里开源的一套用于服务容错的综合性解决方案。它以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性
特点
- 丰富的应用场景:Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
- 完备的实时监控:Sentinel提供了实时的监控功能。通过控制台可以看到接入应用的单台机器秒级数据,甚至500台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel提供开箱即用的与其它开源框架/库的整合模块,例如与SpringCloud、Dubbo、RPC的整合。只需要引入相应的依赖并进行简单的配置即可快速地接入Sentinel。
**sentinel主要功能: **
●流量控制:
流量控制在网络传输中是一个常用的概念,它用于调整网络包的数据。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。
Sentinel作为一个调配器,可以根据需要把随机的请求调整成合适的形状。
●熔断降级:
当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联故障。
系统负载保护
●Sentinel同时提供系统维度的自适应保护能力。当系统负载较高的时候,如果还持续让请求进入可能会导致系统崩溃,无法响应。在集群环境下,会把本应这台机器承载的流量转发到其它的机器上去。如果这个时候其它的机器也处在一个边缘状态的时候,Sentinel提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求。
总之一句话:我们需要做的事情,就是在Sentinel的资源上配置各种各样的规则,来实现各种容错的功能。
sentinel搭建
- 导依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>
- 编写Contruller 测试
@RestController
@RequestMapping(path = "/message")
public class MessageController {
@GetMapping(path = "/test1")
public String test1(){
return "测试高并发";
}
}
- application中配置
- 下载客户端
https://github.com/alibaba/Sentinel/releases - 启动控制台
直接使用 jar 命令启动项目(控制台本身是一个 SpringBoot 项目)
java -Dserver.port=9999-Dcsp.sentinel.dashboard.server=localhost:9999
-Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.5.jar - 访问控制台
http://项目ip+端口 默认用户名密码是 sentinel/sentinel
为某个微服务的接口添加限流
如果访问数量超过限流数量
微服务网关
就是将多个微服务通过一个ip来管理,来访问
常用网关
Ngnix+lua
使用nginx的反向代理和负载均衡可实现对api服务器的负载均衡及高可
用 lua 是一种脚本语言,可以来编写一些简单的逻辑, nginx 支持 lua 脚本.
Kong
基于 Nginx+Lua 开发,性能高,稳定,有多个可用的插件(限流、鉴权等等)
可以开箱即用。 问题: 只支持 Http 协议;二次开发,自由扩展困难;提供管
理 API,缺乏更易用的管控、配置方式。
Zuul
Netflix 开源的网关,功能丰富,使用 JAVA 开发,易于二次开发 问题:缺乏管控,无法动态配 置;依赖组件较多;处理 Http 请求依赖的是 Web 容器,性能不如 Nginx
** Spring Cloud Gateway*
SpringCloud alibaba 技术栈中并没有提供自己的网关,我们可以采用Spring Cloud Gateway 来做网关,将在下面具体介绍。
Gateway 快速搭建
要求: 通过浏览器访问 api 网关,然后通过网关将请求转发到商品微服务.
- 创建 api 网关模块(略)
- 导入依赖,不能有web相关依赖
<!--gateway 网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
- 创建主类
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
- 添加application文件
- 访问网关访问订单微服务
http://127.0.0.1:7000/order-serv/order/create/1/1/1
gateway结合nacos
现在在配置文件中写死了转发路径的地址, 前面我们已经分析过地址写死
带来的问题, 接下来我们从注册中心获取此地址。
所以现在要修改网关中的配置__整合nacos
1.加入nacos依赖
<!--nacos 服务发现依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
-
主类加注解
@SpringBootApplication
@EnableDiscoveryClient -
修改配置文件
-
从注册中心中拿微服务地址
http://127.0.0.1:9001/order-serv/order/create/1/1/1
三、总结
至此,从前到后一共整合
nacos --服务治理
ribbon --负载均衡(基于配置)
feign --负载均衡(基于 注解+接口)
sentinel --实现服务容错
gateway --网关