严刑拷打_微服务

文章详情

😊 @ 作者: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.mzph.cn/news/730342.shtml

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

相关文章

高级语言讲义2014计专(仅高级语言部分)

1. 已知&#xff0c;连续函数在区间[0, 3]有且只有一个实根&#xff0c;编写完整程序&#xff0c;利用二分法计算并输出该实根的近似值&#xff0c;要求结果精确到。 二分法的基本思路是:对于区间[a, b]上的连续函数f(x)&#xff0c;若f(a)和f(b)的正负号不同&#xff0c;则该区…

unicloud where 使用

where介绍 在uniCloud中&#xff0c;WHERE是一个用于指定查询条件的关键字。它允许用户根据特定的条件来筛选和查询云数据库中的数据。WHERE语句的基本语法格式是WHERE condition&#xff0c;其中condition表示查询条件&#xff0c;可以是一个或多个逻辑表达式组成的条件。 在…

达梦数据库将DMHR模式下的表(迁移)导出为EXCEL文件

数据库迁移工具&#xff08;Data Transfer Service&#xff09;位于/dm8/tool/dts.其中/dm8是数据库安装目录。 在创建数据库时我们如果勾选了 “创建示例库DMHR(R)”&#xff0c;数据库实例中就带有这个数据库。 这里是用MobaXterm客户端远程控制ip地址为192.168.148.130的虚…

【C++】C++11---右值引用和移动语义

目录 1、什么是左值引用和右值引用2、左值引用与右值引用比较3、右值引用使用场景和意义4、右值引用引用左值的分析5、完美转发 1、什么是左值引用和右值引用 传统的C语法中就有引用的语法&#xff0c;而C11中新增了的右值引用语法特性&#xff0c;所以从现在开始我们之前学习…

Xilinx 7系列 FPGA硬件知识系列(九)——FPGA的配置

目录 1 .1配置模式 1.1.1 主模式 1.1.2 从模式 1.2 7种配置模式 1.2.1 主串配置模式 1.2.2 从串配置模式 ​编辑1.2.3 主并配置模式 1.2.4 从并配置模式 1.2.5 JTAG配置模式 ​编辑1.2.6 主SPI配置模式 ​编辑1.2.7 主BPI配置模式 1.2.8 FPGA BPI加载时间…

详解float函数类型转换

函数描述 float([x]) 函数将数字或数字的字符串表示形式转换为与它等效的有符号浮点数。如果参数x是一个字符串&#xff08;十进制表示的数字串&#xff09;&#xff0c;数字前面可以添加符号来表示正数&#xff0c;或负数。符号和数字之间不能出现空格&#xff0c;但是符号前…

【Linux基础(三)】信号

学习分享 1、信号的基本概念2、查看信号列表3、常见信号名称4、signal库函数5、发送信号kill6、kill - signal &#xff08;无参信号&#xff09;示例6.1、kill - signal (不可靠信号)示例6.2、kill - signal (可靠信号)示例 7、信号分类7.1、信号运行原理分类7.2、信号是否携带…

java-抢红包一些简单概念

抢红包&#xff0c;比如微信中抢红包&#xff0c;红包金额分配使用的是二倍均值算法。 二倍均值拆包&#xff1a; 拆包要求:所有人抢到的金额之和等于红包总额&#xff0c;每个人最少抢到 0.01 元&#xff0c;每个人抢到的红包金额不要相差太大二倍均值法:假设红包总金额是X&…

【Spring云原生系列】Spring RabbitMQ:异步处理机制的基础--消息队列 原理讲解+使用教程

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…

3DES算法的起源与演进:保障信息安全的重要里程碑

title: 3DES算法的起源与演进&#xff1a;保障信息安全的重要里程碑 date: 2024/3/8 21:25:19 updated: 2024/3/8 21:25:19 tags: 3DES算法起源安全性增强三次迭代加密密钥管理复杂效率对比AES应用场景广泛Python实现示例 一、3DES算法的起源与演进 3DES算法是DES算法的增强版…

Linux第72步_使用“新字符设备的一般模板”编写LED驱动

使用“新字符设备的一般模板”编写LED驱动&#xff0c;使用寄存器直接开关灯。 1、创建LED目录 输入“cd /home/zgq/linux/Linux_Drivers/回车” 切换到“/home/zgq/linux/Linux_Drivers/” 输入“ls回车”&#xff0c;查看“/home/zgq/linux/Linux_Drivers/” 输入“mkdi…

IDEA自带 .http 请求工具文档

基础语法 请求格式 基础格式 Method Request-URI HTTP-Version Header-field: Header-valueRequest-Body其中&#xff0c;GET 请求可以省略 Method 不写&#xff1b;HTTP-Version 可以省略不写&#xff0c;默认使用 1.1 版本。 示例&#xff1a; GET https://www.baidu.co…

【LaTeX】行内代码块、行间代码块的插入以及高亮(懒人版)

文章目录 思路和优点基本框架行内代码行间代码pythoncpp 所支持的语言所支持的代码风格 思路和优点 思路是listingsminted包&#xff0c; 一个负责插入代码一个负责高亮代码 这种方法显著的优点在于&#xff1a;完全不需要自定义代码风格 使用其他方法时&#xff0c;你定义好…

组合逻辑电路(二)(译码器和编码器)

目录 译码器 简单逻辑门译码器 二进制译码器 2线-4线译码器 3线-8线译码器 二-十进制译码器 4线-10线译码器 七段显示译码器 编码器 二进制普通编码器 二-十进制普通编码器&#xff08;8421BCD码编码器&#xff09; 优先编码器&#xff08;Priority Encoder&#xff09; 译…

httprunner参数化

1. 示例 引入对应的Parameters 1.1. CSV参数 from httprunner import HttpRunner, Config, Step, RunRequest, Parameters pytest.mark.parametrize("param", Parameters({"mobile_phone-pwd": "${P(csv_data/mobile_phone-pwd.csv)}"}))def …

【粉丝福利】探秘内部审计数字化之道:精准解析转型方法与成功路径

&#x1f33c;前言 内部审计是一种独立的、客观的确认和咨询活动&#xff0c;包括鉴证、识别和分析问题以及提供管理建议和解决方案。狭义的数字化转型是指将企业经营管理和业务操作的各种行为、状态和结果用数字的形式来记录和存储&#xff0c;据此再对数据进行挖掘、分析和应…

基于textdistance计算文本相似度

textdistance是Python的第三方库&#xff0c;用于计算文本之间的相似度或距离。它提供了30个算法&#xff0c;简单易用。 安装 pip install textdistance# 使用扩展库&#xff0c;提高性能 pip install "textdistance[extras]"使用 import textdistance# 计算编辑…

多目标跟踪中的数据关联

多目标追踪之数据关联多目标跟踪数据关联算法比较 在单目标无杂波环境下&#xff0c;目标的相关波门内只有一个点迹&#xff0c;此时只涉及跟踪问题。 在多目标情况下&#xff0c;有可能出现单个点迹落入多个波门的相交区域内&#xff0c;或者多个点迹落入单个目标的相关波门内…

本鲸多方位助力创业者高效对接创新创业机遇

在科技创新的浪潮中&#xff0c;创业者们不断探索着新的商业机会&#xff0c;寻求着创新创业的道路。然而&#xff0c;面对复杂多变的市场环境和激烈的竞争压力&#xff0c;如何高效对接创新创业机遇成为了摆在创业者面前的重要课题。 本鲸依托海南本鲸投资有限公司和重庆本鲸…

007-双向绑定原理

双向绑定原理 双向绑定思考&#xff1a;一句话描述原理DocuemntFragment&#xff08;碎片化文档&#xff09;Object.defineProperty&#xff08;数据劫持&#xff09;发布订阅者模式Vue 双向绑定图示Vue 双向绑定完整实现代码 双向绑定 vue中 data定义的数据会添加双向绑定的功…