严刑拷打_微服务

文章详情

😊 @ 作者: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 --网关

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

webpack5:基本概念整理

写在前头&#xff1a;这篇文章只是我个人在学习过程中对webpack文档的简单总结&#xff0c;更多详细信息请在官网阅读。 一、webpack是什么 webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具。当 webpack 处理应用程序时&#xff0c;它会在内部从一个或多个入口…

掌握MySQL,看完这篇文章就够了!

1. MySQL MySQL是一种广泛使用的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典的MySQL AB公司开发&#xff0c;目前属于甲骨文公司&#xff08;Oracle Corporation&#xff09;。 MySQL使用结构化查询语言&#xff08;SQL&#xff09;进行数据库管理…

C语言指针——常量字符串和 变量字符串

常量字符串和 变量字符串 常量字符串和变量字符串是在编程中常见的两种字符串类型&#xff0c;它们有以下区别&#xff1a; 值的不可变性&#xff1a;常量字符串的值是不可变的&#xff0c;一旦被定义&#xff0c;就不能修改。而变量字符串的值是可变的&#xff0c;可以随时修…

Redis进阶(三):主从复制

为了解决单点问题&#xff0c;实现多服务器部署redis&#xff0c;有几种解决方案可以实现&#xff1a;主从复制&#xff0c;主从哨兵还有集群。 何为主从复制 简单来说有三个服务器分别部署了redis-server程序&#xff0c;选中一个服务器当作主节点&#xff0c;其他的就是从节…

【PCL】(二十六)自定义条件的欧几里得聚类分割点云

&#xff08;二十六&#xff09;自定义条件的欧几里得聚类分割点云 以下代码实现自定义条件对点进行欧几里得聚类分割。 conditional_euclidean_clustering.cpp #include <pcl/point_types.h> #include <pcl/io/pcd_io.h> #include <pcl/console/time.h>#…

Android Studio编译及调试知识

文章目录 Android Studio编译kotlin项目Android Studio编译Java和kotlin混合项目的过程gradle打印详细错误信息&#xff0c;类似这种工具的使用Android apk 从你的代码到APK打包的过程&#xff0c;APK安装到你的Android手机上的过程&#xff0c;最后安装好的形态&#xff0c;以…

Mint_21.3 drawing-area和goocanvas的FB笔记(五)

FreeBASIC SDL图形功能 SDL - Simple DirectMedia Layer 是完整的跨平台系统&#xff0c;有自己的窗口、直接捕获键盘、鼠标和游戏操纵杆的事件&#xff0c;直接操作音频和CDROM&#xff0c;在其surface上可使用gfx, openGL和direct3D绘图。Window3.0时代&#xff0c;各种应用…

准谐振PWM控制器-能够实现多种保护功能FAN6921MRMY 功率因数控制器

高度集成的FAN6921MRMY将功率因数控制器 (PFC) 和准谐振 PWM 控制器相结合。集成提供了成本高效的设计&#xff0c;可减少外部组件数量。对于 PFC&#xff0c;FAN6921MRMY使用控制导通时间技术提供调节的直流输出电压&#xff0c;执行自然的功率因数校正。FAN6921MRMY使用创新的…

【代码随想录算法训练营Day40】01背包问题一维dp数组;二维dp数组(滚动数组);416.分割等和子集

文章目录 ❇️Day 41 第九章 动态规划 part04✴️今日任务❇️01背包问题 二维背包问题的区别暴力解法动规五部曲 ❇️01背包问题 一维二维转一维&#xff1a;滚动数组动规五部曲 ❇️416. 分割等和子集随想录思路自己的思路二维方法一维方法 自己的代码二维方法一维方法 ❇️D…

Kibana二次开发环境搭建

1 kibana环境搭建 1.1 搭建后端服务 &#xff08;1&#xff09;java环境安装 ElasticSearch运行需要java jdk支持。所以要先安装JAVA环境。由于ElasticSearch 5.x 往后依赖于JDK 1.8的&#xff0c;所以现在我们下载JDK 1.8或者更高版本。下载JDK1.8,下载完成后安装&#xff…

去电脑维修店修电脑需要注意什么呢?装机之家晓龙

每当电脑出现故障时&#xff0c;你无疑会感到非常沮丧。 如果计算机已过了保修期&#xff0c;您将无法享受制造商的免费保修服务。 这意味着您必须自费找到一家电脑维修店。 去电脑维修店并不容易。 大家一定要知道&#xff0c;电脑维修非常困难&#xff0c;尤其是笔记本电脑维…

qtCreator可以全局包含。VSqt中千万不能全局包含,你的控件头文件会自己变成<>括号,编译就报错

qtCreator可以全局包含。 VSqt中千万不能全局包含&#xff0c;你的控件头文件会自己变成&#xff1c;&#xff1e;括号&#xff0c;编译就报错

重建大师6.2版本的建模效果出现下图中模糊的情况,是什么原因?

可能是因为坐标原点设置的不对&#xff0c;图例中的三角网都出现了精度损失的问题。 坐标原点设置的具体操作&#xff1a;提交产品后&#xff0c;在弹出的界面&#xff0c;可以设定坐标原点。 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件&#xff0…

第七届强网杯-PWN-【warmup】

文章目录 warmup libc 2.35检查IDA逆向maindeldelete_noteadd_noteshow_noteinput_numberread_16atoi __errno_location()相关解释prctl相关 思路高版本off by null利用技巧产生chunk extend泄露libc基地址泄露heap基地址修改放入tcachebin中的chunk的fd为stdout最后add两个chu…

AI大模型助力创意思维,拓展无限可能性

在当今快速发展的科技时代&#xff0c;人工智能大模型正逐渐成为我们生活中不可或缺的一部分。它们拥有强大的计算能力和学习能力&#xff0c;能够帮助我们解决许多复杂的问题&#xff0c;同时也可以为创意思维的拓展提供无限可能性。 人工智能大模型可以通过对海量数据的分析…

docker部署springboot jar包项目

docker部署springboot jar包项目 前提&#xff0c;服务器环境是docker环境&#xff0c;如果服务器没有安装docker&#xff0c;可以先安装docker环境。 各个环境安装docker&#xff1a; Ubuntu上安装Docker&#xff1a; ubuntu离线安装docker: CentOS7离线安装Docker&#xff1…

华为北向网管NCE开发教程(1)闭坑选接口协议

华为北向网管NCE开发教程&#xff08;1&#xff09;闭坑选接口协议 华为北向网管NCE开发教程&#xff08;2&#xff09;REST接口开发 华为北向网管NCE开发教程&#xff08;3&#xff09;CORBA协议开发 本文一是记录自己开发华为北向网管遇到的坑&#xff0c;二是给需要的人&…

Rocky Linux 的安装

1. 为什么用Rocky 因为CentOS不干了&#xff0c;这是CentOS的现状&#xff1a; CentOS Linux 8 在 2021 年底停止更新&#xff1b; CentOS Linux 7 用户较多&#xff0c;这个版本将在 2024 年 6 月 30 日停止支持&#xff1b; 未来社区不会再有 CentOS Linux 的新版本&…

联立方程模型的可识别性的通俗解释

联立方程模型的可识别性&#xff0c;主要的解法是阶条件算法和秩条件算法&#xff0c;数学公式角度的解释就不讲了&#xff0c;参考下面的前人文献。 【计量经济学】联立方程模型-CSDN博客 说一下公式算法背后的通俗原理。 在计量经济模型中&#xff0c;比如 Y23*Xu中&#x…

[java基础揉碎]super关键字

super关键字: 基本介绍 super代表父类的引用&#xff0c;用于访问父类的属性、方法、构造器 super给编程带来的便利/细节 1.调用父类的构造器的好处(分工明确&#xff0c;父类属性由父类初始化&#xff0c;子类的属性由子类初始化) 2.当子类中有和父类中的成员(属性和方法)重…