严刑拷打_微服务

news2024/11/15 4:26:07

文章详情

😊 @ 作者: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、微服务存在的问题

  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. 服务提供者地址发生变化, 就需要修改原代码,维护性差
  2. 一旦多个服务提供者,就无法实现负载均衡
    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格式,进行解压缩
  2. 启动nacos
    –切换目录
    cd nacos/bin
    –启动命令
    startup.cmd -m standalone
  3. 访问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注解
    在这里插入图片描述
  2. 在application.yml中为每个微服务定义服务名,并添加nacos服务的地址
    在这里插入图片描述
  3. 服务启动就会在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
  2. 创建服务提供者的接口,并用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中配置
    在这里插入图片描述
  2. 下载客户端
    https://github.com/alibaba/Sentinel/releases
  3. 启动控制台
    直接使用 jar 命令启动项目(控制台本身是一个 SpringBoot 项目)
    java -Dserver.port=9999-Dcsp.sentinel.dashboard.server=localhost:9999
    -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.5.jar
  4. 访问控制台
    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文件
    在这里插入图片描述
  2. 访问网关访问订单微服务
    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

  2. 修改配置文件
    在这里插入图片描述

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

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

三、总结

至此,从前到后一共整合
nacos --服务治理
ribbon --负载均衡(基于配置)
feign --负载均衡(基于 注解+接口)
sentinel --实现服务容错
gateway --网关

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1502745.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[数据结构]队列

1.队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾 出队列&#xff1a;进行删除操作的一端称为队头 2…

Dynamo3.0.3——六年来最大的更新

Hello大家好&#xff01;我是九哥~ 前几天&#xff0c;Dynamo Core 3.0.0版本发布&#xff0c;迎来了Dynamo六年来最大的一次更新。最大的改变&#xff0c;是更新到了.net8&#xff0c;这回对Dynamo节点包产生不小影响。接下来我们详细看一下都有哪些变化。 首先&#xff0…

【vue.js】文档解读【day 3】 | 列表渲染

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 文章目录 列表渲染v-forv-for 与对象在 v-for 里使用范围值template 上的 v-forv-for与v-if通过key管理状态组件上使用v-for数组变化侦测 列表渲染 v-for 在我们想要渲染出一个数组中的元素时&#xf…

node-day3-es6模块化+webpack

模块化 一、模块化分类 回顾node.js模块化&#xff1a; node.js遵循了CommonJS的模块化规范【见下文】&#xff0c;其中&#xff1a; 1.导入其它模块使用require()方法 2.模块对外共享成员使用module.exports对象 模块化的好处&#xff1a; 大家都遵守同样的模块化规范写代…

Only fullscreen opaque activities can request orientation

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 未经允许不得转载 目录 一、导读二、概览三、分析四、 推荐阅…

【电工学笔记】上册第一、二章

电工学 上次考试败在了单位&#xff0c;这次单位 一定要记熟。 第一章 电源或信号源的电压或电流称为激励,它推动电路工作; 由激励所产生的电压和电流称为响应。 复杂电路中,一般无法事先判断某个支路电流的 实际方向或者某个电路元件电压的实际方向 140V/4算不出总电阻的 …

leetcode26---删除有序数组中的重复项

大家好&#xff0c;我是大唐&#xff0c;刚刷完了几道经典的leetcode题&#xff0c;今天给大家分享一道leetcode上面的快慢指针经典题型---删除有序数组中的重复项&#xff0c;我们往下看。 题目描述 给你一个 非严格递增排列 的数组 nums &#xff0c;请你原地删除重复出现的元…

【数据结构】拆分详解 - 排序

文章目录 前言一、排序的概念及其运用  1.1 排序的概念  1.2 排序的运用  1.3 常见的排序算法  1.4 排序算法性能测试对比函数 二、常见排序算法的实现  2.1 插入排序   2.1.1  基本思想   2.1.2  直接插入排序   2.1.3  希尔排序     1. 预排序&am…

Dataset 读取数据

Dataset 读取数据 from torch.utils.data import Dataset from PIL import Image import osclass Mydata(Dataset):def __init__(self,root_dir,label_dir):self.root_dir root_dir #根目录 dataset/trainself.label_dir label_dir #标签的后面链接目录 ants_ima…

ChatGPT 提问没反应了,怎么办?4种方法!试试看

用了将近 1 年的 ChatGPT 昨天下午提问忽然之间没反应了&#xff0c;有点失落&#xff0c;我原本以为是账号到期了呢。 之后&#xff0c;尝试用谷歌邮箱注册登录也不行。 打开调试一看&#xff0c;接口状态 403 &#xff0c;没有权限了&#xff0c;logout。 怎么办呢&#xf…

2023年12月CCF-GESP编程能力等级认证Python编程七级真题解析

本文收录于专栏《Python等级认证CCF-GESP真题解析》,专栏总目录・点这里 一、单选题(每题 2 分,共 30 分) 第1题 假设变量 x 为 float 类型,如果下面代码输入为 100,输出最接近( )。 A.0 B.-5 C.-8 D.8 答案:B 第2题 对于下面动态规划方法实现的函数,以下选项中…

【Nestjs实操】服务依赖注入

在开始学习之前&#xff0c;我们首先准备下开发环境&#xff1a; Node&#xff1a;16.20.2包管理器&#xff1a;pnpmnestjs版本&#xff1a;10.2.1全局安装nestjs命令行&#xff1a;pnpm add -g nestjs/cli 一、初始化项目 执行nest new nestjs-blog&#xff0c;系统会自动创…

关于 JVM

1、请你谈谈你对JVM的理解&#xff1f; JVM由JVM运行时数据区&#xff08;图示中蓝色框包含部分&#xff09;、执行引擎、本地库接口、本地方法库组成。 JVM运行时数据区&#xff0c;分为方法区、堆、虚拟机栈、本地方法栈和程序计数器。 1.方法区 Java 虚拟机规范中定…

黑马点评-异步秒杀实现

异步秒杀思路 我们来回顾一下下单流程 当用户发起请求&#xff0c;此时会请求nginx&#xff0c;nginx会访问到tomcat&#xff0c;而tomcat中的程序&#xff0c;会进行串行操作&#xff0c;分成如下几个步骤 1、查询优惠卷 2、判断秒杀库存是否足够 3、查询订单 4、校验是…

Draco点云压缩测试

ref&#xff1a;https://github.com/google/dracohttps://codelabs.developers.google.com/codelabs/draco-3d/index.html#6 Draco Draco 是一个用于编码压缩和解压缩 3D 几何网格和点云的库&#xff0c;从而改进 3D 图形的存储和传输该代码支持压缩点、连接信息、纹理坐标、颜…

个人代码分享(底层模板函数和三大模板)2024.3.6

源码&#xff1a;&#xff08;百度网盘&#xff09; 链接&#xff1a;https://pan.baidu.com/s/1jdfrQOGCWJaQgSUPEWcfdw?pwd1234 提取码&#xff1a;1234 说明&#xff1a; 从复习到应用所有学到的东西去做真题&#xff0c;笔者对于之前发过的文章里面的代码有着很多改动&…

用msvc编译器的cl.exe将gcc编译器的.s汇编文件转masm编译器的.asm文件

用msvc编译器的cl.exe将gcc编译器的.s汇编文件转masm编译器的.asm文件 cl /nologo /X /II:/code/reactos-master/sdk/include/asm /II:/code/reactos-master/output-VS-amd64-sln/sdk/include/asm -II:/code/reactos-master/sdk/include -II:/code/reactos-master/sdk/include…

051-WEB攻防-前后台功能点文件下载文件读取文件删除目录遍历目录穿越

051-WEB攻防-前后台功能点&文件下载&文件读取&文件删除&目录遍历&目录穿越 #知识点&#xff1a; 1、文件安全-前后台功能点-下载&读取&删除 2、目录安全-前后台功能点-目录遍历&目录穿越 演示案例&#xff1a; ➢文件安全-下载&删除-案例…

Centos 安装 redis【最简单】

Centos7 使⽤ yum 安装 ⾸先安装 scl 源, 再安装 redis &#xff08;因为 Centos7 yum 提供的软件包只有 3.0 版本的 Redis &#xff0c;太老了&#xff0c;我们要安装 redis 5 系列的&#xff09; yum install centos-release-scl-rh yum install rh-redis5-redis 创建符号…

阿里云99计划优惠:云服务器租用价格61元、99元、165元

阿里云99计划还有谁不知道么&#xff1f;阿里云不杀熟&#xff0c;新老用户同享&#xff0c;阿里云服务器99元一年&#xff0c;续费也是99元&#xff0c;续费不涨价家人们&#xff0c;2024年阿里云把云服务器价格打下来了&#xff0c;2核2G、2核4G、4核8G、4核16G、8核16G、8核…