严刑拷打_微服务

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
可观测监控 Prometheus 版,每月50GB免费额度
简介: 严刑拷打_微服务

文章详情

😊 @ 作者:Lion J
`💖 @ 主页:
https://blog.csdn.net/weixin_69252724`
🎉 @ 主题: 微服务相关知识
⏱️ @ 创作时间:2024年03月8日
————————————————



前言

在现在这个网络飞速发展的时代, 网站请求量也是越来越大, 从而导致系统架构也在不断发生变化;在早期的单体架构, 由于业务需求量,以及项目的拓展问题, 项目业务要求解耦, 代码的可维护性....摒弃了原来单体架构,升级为微服务架构


正文

一、微服务概述

1、微服务是什么?

微服务,顾名思义就是很多个微小的服务; 何为很多个微小的服务呢?就是将一个项目的功能分割开,将不同的功能抽离出来,实现低耦合, 把一个功能相关的代码合并在一起.实现高内聚; 将各个功能不相干扰, 各个功能已于维护.

如图: 是一个商品订单服务

在这里插入图片描述

2、微服务存在的问题

  1. 既然有许多个服务,那么应该将他们集中在一起易于管理,
  2. 要实现一个微服务调用另一个时性能,出现bug...问题时,如何进行自排查,自处理?

客户端如何调用它们,每一次都是不同的微服务ip的话,会导致某一个服务请求压力大,从而崩塌...问题

以上每一个问题都是服务区架构里面不可绕过的大头

3、微服务常见概念

服务治理

就是进行服务的自动化管理, 核心就是服务的 自动注册与发现
注册中心 注册中心的概念, 就是用来管理各个服务的

服务调用

就是一个服务去调用另一个服务的功能接口,实现两个服务之间的远程调用

目前主流的调用技术即使基于HTTP的Restful接口以及RPC(远程过程调用)

负载均衡

通俗的讲, 负载均衡就是将负载(工作任务,访问请求)进行分摊到多个
操作单元(服务器,组件)上进行执行。

服务网关

服务越多,服务的网络请求地址也会多

  1. 客户端在要使用不同的功能要使用对应的url地址,客户更加繁琐
  2. 存在跨域问题
  3. 在前端每次访问不同的微服务都要进行单独的的身份验证,业务重复,浪费通信资源

网关就是将所有微服务地址做到同一的管理, 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);

这种调用方式就会存在很多问题

  1. 服务提供者地址发生变化, 就需要修改原代码,维护性差

    1. 一旦多个服务提供者,就无法实现负载均衡

    3, 服务如果越来越多,维护麻烦,服务之间关系复杂

这种restful格式就淘汰

用Nacos Discover--服务治理

可以解决上面存在的问题
●服务治理: 是微服务架构中最核心最基本的模块。用于实现各个微服务的自动化注册与发现。
服务注册:在服务治理框架中,都会构建一个注册中心,每个服务单元向注册中心登记自己提供服务的详细信息。并在注册中心形成一张服务的清单,服务注册中心 需要以心跳的方式去监测清单中的服务是否可用,如果不可用,需要在服务清单中剔除不可用的服务。

在这里插入图片描述
常见的注册中心

  1. Zookeeper zookeeper是一个分布式服务框架,是Apache的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
  2. Eureka Eureka是SpringCloud微服务框架默认的也是推荐的服务注册中心,由Netflix公司与2012将其开源出来,主要作用就是做服务注册和发现。但是现在已经闭源,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能
  3. Nacos Nacos是阿里巴巴最新开源的项目,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它是SpringCloudAlibaba组件之一,负责服务注册发现和服务配置。

nacos环境搭建

搭建

  1. 安装nacos

地址: https://github.com/alibaba/nacos/releases
下载是zip格式,进行解压缩

  1. 启动nacos

--切换目录

cd nacos/bin

--启动命令

startup.cmd -m standalone
  1. 访问nacos

--打开浏览器
http://localhost:8848/nacos.即可访问服务,默认账号密码nacos nocos

在这里插入图片描述
商品微服务注册到nocas

修改shop-user代码

  1. pom.xml添加nacos依赖
        <!--nacos 客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
  1. 启动类添加@EnableDiscoveryClient注解

在这里插入图片描述

  1. 在application.yml中为每个微服务定义服务名,并添加nacos服务的地址

在这里插入图片描述

  1. 服务启动就会在nacos中注册管理

在这里插入图片描述

nacos中来服务调用

使用nacos客户端根据服务名动态获取服务地址和端口

在这里插入图片描述

负载均衡(在服务消费者上搭建)

自定义负载均衡

增加两个商品服务, 然后通过获取随机数的方式获取两个中的一个微服务
在这里插入图片描述

基于Ribbon实现负载均衡

通过配置实现负载均衡

Ribbon是SpringCloud的一个组件,它可以让我们使用一个注解就能轻松的搞定负载均衡

搭建

  1. 在RestTemplate的生成方法上添加@LoadBalanced注解
  2. 修改调用服务方法

restTemplate.getForObject("http://服务名/product/get/"+pid,Product.class);

Ribbon支持的负载均衡策略Ribbon内置了多种负载均衡策略,感兴趣去搜搜, 比如: 轮询、权重、随机....

  1. nacos配置

在这里插入图片描述

基于Feign实现负载均衡

接口+注解实现

Nacos很好的兼容了Feign,Feign默认集成了Ribbon,所以在Nacos下使用Fegin默认就实现了负载均衡的效果。

搭建

  1. 订单服务加上Feign依赖
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
  1. 启动类上加Fegin注解

@EnableFeignClients//开启 Fegin

  1. 创建服务提供者的接口,并用Fegin实现微服务调用

在这里插入图片描述

访问地址要求一样
方法参数要求一样

服务容错

在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用,但是由于网络原因或者自身的原因,服务并不能保证服务的100%可用,如果单个服务出现问题,调用这个服务就会出现网络延迟,此时若有大量的网络涌入,会形成任务堆积,最终导致服务瘫痪。

由于服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩效应”。

雪崩发生的原因多种多样,有不合理的容量设计,或者是高并发下某一个方法响应变慢,亦或是某台机器的资源耗尽。我们无法完全杜绝雪崩源头的发生,只有做好足够的容错,保证在一个服务发生问题,不会影响到其它服务的正常运行。也就是"雪落而不雪崩"

常见的容错方案

隔离:它是指将系统按照一定的原则划分为若干个服务模块,各个模块之间相对独立,无强依赖。当有故障发生时,能将问题和影响隔离在某个模块内部,而不扩散风险,不波及其它模块,不影响整体的系统服务。常见的隔离方式有:线程池隔离和信号量隔离.

超时: 在上游服务调用下游服务的时候,设置一个最大响应时间,如果超过这个时间,下游未作出反应,就断开请求,释放掉线程。
限流:限流就是限制系统的输入和输出流量已达到保护系统的目的。为了保证系统的稳固运行,一旦达到的需要限制的阈值,就需要限制流量并采取少量措施以完成限制流量的目的。

熔断: 在互联网系统中,当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。这种牺牲局部,保全整体的措施就叫做熔断。

降级:降级其实就是为服务提供一个托底方案,一旦服务无法正常调用,就使用托

常见的容错组件

●Hystrix: Hystrix是由Netflflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性与容错性
●Resilience4J: Resilicence4J一款非常轻量、简单,并且文档非常清晰、丰富的熔断工具,这也是Hystrix官方推荐的替代产品。不仅如此,Resilicence4j还原生支持
SpringBoot,而且监控也支持和prometheus等多款主流产品进行整合。
●*Sentinel: Sentinel是阿里巴巴开源的一款断路器实现,本身在阿里内部已经被大规模采用,非常稳定。

Sentinel使用及概念

sentinel是什么

Sentinel(分布式系统的流量防卫兵)是阿里开源的一套用于服务容错的综合性解决方案。它以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性
特点

  1. 丰富的应用场景:Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
  2. 完备的实时监控:Sentinel提供了实时的监控功能。通过控制台可以看到接入应用的单台机器秒级数据,甚至500台以下规模的集群的汇总运行情况。
  3. 广泛的开源生态:Sentinel提供开箱即用的与其它开源框架/库的整合模块,例如与SpringCloud、Dubbo、RPC的整合。只需要引入相应的依赖并进行简单的配置即可快速地接入Sentinel。

sentinel主要功能:

●流量控制:
流量控制在网络传输中是一个常用的概念,它用于调整网络包的数据。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。
Sentinel作为一个调配器,可以根据需要把随机的请求调整成合适的形状。
●熔断降级:
当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联故障。
系统负载保护
●Sentinel同时提供系统维度的自适应保护能力。当系统负载较高的时候,如果还持续让请求进入可能会导致系统崩溃,无法响应。在集群环境下,会把本应这台机器承载的流量转发到其它的机器上去。如果这个时候其它的机器也处在一个边缘状态的时候,Sentinel提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求。

总之一句话:我们需要做的事情,就是在Sentinel的资源上配置各种各样的规则,来实现各种容错的功能。

sentinel搭建

  1. 导依赖
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
  1. 编写Contruller 测试
@RestController
@RequestMapping(path = "/message")
public class MessageController {
@GetMapping(path = "/test1")
public String test1(){
return "测试高并发";
}
}
  1. application中配置

在这里插入图片描述

  1. 下载客户端

https://github.com/alibaba/Sentinel/releases

  1. 启动控制台
    直接使用 jar 命令启动项目(控制台本身是一个 SpringBoot 项目)

java -Dserver.port=9999-Dcsp.sentinel.dashboard.server=localhost:9999
-Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.5.jar

  1. 访问控制台

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 网关,然后通过网关将请求转发到商品微服务.

  1. 创建 api 网关模块(略)
  2. 导入依赖,不能有web相关依赖

<!--gateway 网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
  1. 创建主类
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
  1. 添加application文件

在这里插入图片描述

  1. 访问网关访问订单微服务

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>
  1. 主类加注解

@SpringBootApplication
@EnableDiscoveryClient

  1. 修改配置文件

在这里插入图片描述

  1. 从注册中心中拿微服务地址

http://127.0.0.1:9001/order-serv/order/create/1/1/1

三、总结

至此,从前到后一共整合
nacos --服务治理
ribbon --负载均衡(基于配置)
feign --负载均衡(基于 注解+接口)
sentinel --实现服务容错
gateway --网关
相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
2月前
|
负载均衡 数据库 Docker
微服务(一)-微服务介绍
微服务(一)-微服务介绍
|
5月前
|
存储 分布式计算 Dubbo
微服务是什么?
微服务是小型独立的服务,每个服务聚焦单一功能,代码量少,复杂度低。与单体架构相比,微服务强调团队小规模,服务独立开发、部署,数据存储方式和部署方式也不同。微服务架构允许使用不同语言和工具,具有良好的可扩展性和与Docker的兼容性。常见的Java微服务框架有Spring Cloud、Spark和Dubbo。
|
6月前
|
Java 数据管理 API
详解微服务
详解微服务
|
运维 负载均衡 网络协议
微服务详解
微服务详解
104 0
|
运维 监控 Dubbo
认识微服务
认识微服务
81 0
|
JSON 负载均衡 监控
浅析-微服务1
当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是影响项目开发的关键。
浅析-微服务1
|
存储 JSON 编解码
关于微服务,这些你都了解吗-微服务介绍
关于微服务,这些你都了解吗-微服务介绍
214 0
|
自然语言处理 搜索推荐 微服务
了解微服务
微服务是与之前的服务化思路和实践相比较而来的。早些年的服务实现和实施思路是将很多功能从开发到交付都打包成一个很大的服务单元(一般称为Monolith),而微服务实现和实施思路则更强调功能趋向单一,服务单元小型化和微型化。
137 0
了解微服务
|
负载均衡 Dubbo 网络协议

热门文章

最新文章