SpringCloud 微服务框架

单体架构:将业务全部功能集中到一个项目中,打成一个war包存储,部署在一台服务器中,只有一个数据库

优点 :架构简单,部署成本低。适合小型项目

问题:高并发性能问题,开发时代码耦合问题,部署升级时停服的问题

垂直架构:拆分模块,每个模块使用自己的数据库,如果有模块需要其他模块数据时需要自己查对方模块数据库

问题:大量代码冗余,系统难以维护,性能问题,部署问题

分布式架构:根据业务功能对系统做拆分,每个业务功能作为独立项目开发,称为一个服务

服务之间相互调用,分布式多节点部署

优点:降低耦合,有利于服务升级和拓展 适合大型互联网项目

缺点:服务调用关系错综复杂

在进行服务拆分的时候要考虑很多问题:服务拆分的粒度如何界定,服务之后如何调用,服务的调用关系如何管理,需要指定一套有效的标准来约束分布架构

微服务

架构特点:1.单一职责,每一个服务对应唯一的业务能力,做到单一职责

2.自治,团队独立,技术独立,数据独立,独立部署和交付

3.面向服务,服务提供统一的接口,与语言技术无关

4.隔离性强,服务调用做好隔离,容错,降级避免出现级联问题(级联故障是由于正反馈循环并且随着时间的增加所产生的故障。典型表现:最初由单个节点或子系统故障触发的连锁反应)

微服务的上述特点给分布式架构制定啦一个标准,进一步降低服务之间的耦合,提供服务的独立性和灵活性。微服务是一种经过良好架构设计的分布式架构方案

微服务技术的对比

SpringCloud微服务框架

官网地址:Spring Cloud

开发springcloud组件的组织:spring社区,alibaba,netflix

springCloud集成了各种微服务功能组件,基于SpringBoot实现组件的自动装配

常见的组件:服务注册发现(Eureka,nacos,consul),服务远程调用(OpenFeign,Dubbo),服务链路监控(Zipkin,Sleuth),统一配置管理(SpringCloudConfig,nacos),统一网关路由(SpringCloudGateway,zuul),流控降级保护(Hystix,Sentinel)

SpringCloud底层是依赖于SpringBoot的,并且有版本兼容关系

服务拆分原则:1.不同微服务不用重复开发相同业务

2.微服务数据独立,有自己的数据库

3.微服务可以将自己的业务暴露为接口,供其他微服务使用

远程调用

微服务的调用方式:基于RestTemplate发起的http请求实现远程调用,http请求做远程调用只要知道ip,端口,接口路径,请求参数即可。

步骤:1.注册RestTemplate的实例到Spring容器

2.修改消费者order-service服务中的OrderService类中的queryOrderById方法,根据Order对象中的userId查询User

3.将查询到的User填到Order对象

    #在order-service服务中的OrderApplication启动类中,注册RestTemplate实例 @MapperScan("cn.itcast.order.mapper") @SpringBootApplication public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); } @Bean public RestTemplate restTemplate() { return new RestTemplate(); } }
      #修改order-service服务中的OrderService类中的queryOrderById方法 @Service public class OrderService { @Autowired private OrderMapper orderMapper; @Autowired private RestTemplate restTemplate; public Order queryOrderById(Long orderId) { // 1.查询订单 Order order = orderMapper.findById(orderId); //2查询用户 String url="http://userservice/user/"+order.getUserId(); User user = restTemplate.getForObject(url, User.class); // 3封装user信息 order.setUser(user); // 4.返回 return order; } }

      在服务调用关系中,会有两个不同的角色,这两个角色是相对的

      服务提供者Provider:一次业务中,被其他微服务调用的服务,提供接口给其他服务

      服务消费者consumer:一次业务中,调用其他微服务的服务,调用其他微服务提供的接口

      注册中心

      解决问题:服务注册与发现(服务治理问题)

      Eureka注册中心

      EurekaServer:服务端,注册中心

      EurekaClient:客户端

      服务注册:提供者启动之后将自己的信息注册到eureka-server(Eureka服务端)

      eureka-server保存服务名称到服务实例地址列表的映射关系

      服务拉取:消费者根据服务名称拉取实例地址列表(注册表)并缓存到本地

      消费者根据负载均衡算法选中一个实例地址,发起远程调用

      健康检查:提供者每隔一段时间(默认30秒)向eureka-server发起请求,报告自己状态。称为心跳

      当超过一段时间(90秒)没有发送心跳,eureka-server认为微服务实例故障,将该实例从列表中剔除,拉取服务时,该故障实例排除

      搭建eureka-server

      1.引入依赖

      <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>

      2.编写启动类

      @SpringBootApplication @EnableEurekaServer //开启eureka的注册中心功能 public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class, args); } }

      3.编写配置文件application.yml

      server: port: 10086 spring: application: name: eureka-server eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka

      启动成功

      服务注册

      引入依赖

      <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>

      配置文件

      spring: application: name: orderservice eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka

      可以将user-service多次启动,模拟多实例部署,注意修改端口设置-Dserver.port=自定义的端口号

      如果没有service选项【IDEA】idea打开新项目,左下角的工作栏中没有显示Services解决办法 - Angel挤一挤 - 博客园

      在order-service完成服务拉取,修改OrderService的代码,修改访问路径

      在order-service项目的启动类OrderApplication中RestTemplate添加负载均衡诸界

      @Bean @LoadBalanced //负载均衡注解 public RestTemplate restTemplate(){ return new RestTemplate(); }

      负载均衡

      SpringCloud底层利用Ribbon的组件,实现负载均衡。服务调用者动态调用服务提供者的多个节点

      Ribbon内部就是集成了LoadBalancerClient负载均衡,通过@LoadBalance注解开启负载均衡器。

      基本流程:RibbonLoadBalanceClient从请求url中获取服务名称,DynamicServerListLoadBalancer根据服务名称到eureka拉取服务列表eureka返回服务列表,IRule利用内置的负载均衡规则从列表中选择一个服务,返回给RibbonLoadBalanceClient

      Ribbon的负载均衡规则时一个叫IRule的接口来定义的,每一个接口就是一种规则

      内置的负载均衡规则:

      RoundRobinRule 简单的轮询服务列表来选择服务器,Ribbon默认的负载均衡规则

      ZoneAvoidanceRule以区域可用的服务器为基础进行服务器的选择

      默认的实现就是ZoneAvoidanceRule,是一种轮询方案(一般使用默认的负载均衡规则,不修改)

      Ribbon采用默认的懒加载,第一次访问才会去创建LoadBalanceClient,请求时间会很长。

      Nacos注册中心

      Nacos是阿里巴巴的产品,现在是SpringCloudAlibaba中的一个组件(SpringCloudAlibaba实现啦对SpringCloud组件进行扩展)

      与Eureka的差异:依赖不同,服务地址不同

      Nacos服务搭建,下载安装包,解压,在bin目录下运行startup.cmd -mstandalone

      引入依赖,在父工程里面,引入

      <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.6.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency>

      在服务消费者和提供者的pom文件引入nacos的依赖,注释掉eureka的依赖

      <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>

      配置nacos地址,在user-service和order-service的application.yml中添加nacos地址,不要忘了注释掉eureka的地址

      spring: cloud: nacos: server-addr: localhost:8848

      在启动类添加注解@EnableDicoveryClient

      Nacos服务分级存储模型

      一个服务有多个实例,实例分布在不同的机房中,Nacos将同一机房的实例划分为一个集群

      服务-集群-实例

      服务调用尽可能选择本地集群的服务,跨集群调用延迟较高。(本地集群不可访问时,在访问其他集群)

      给user-service配置集群,修改user-service的application.yml文件

      spring: cloud: nacos: server-addr: localhost:8848 discovery: cluster-name: HZ # 集群名称

      复制一个user-service启动配置,添加属性

      -Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH

      默认的zoneAvoidanceRule不能实现同集群有效实现负载均衡,Nacos中提供了一个NacosRule的实现,可以优先从同集群中挑选实例。

      修改负载均衡规则修改order-service的application.yml文件,修改负载均衡规则:

      userservice: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则

      根据权重负载均衡:在实际部署中提高权重配置来控制访问频率,权重高访问频率高

      在Nacos控制台设置实例的权重值0~1之间

      环境隔离namespace

      Nacos中服务存储和数据存储的最外层都是一个namespace的东西,用做最外层隔离,修改order-service的application.yml文件:

      spring: cloud: nacos: server-addr: localhost:8848 discovery: cluster-name: HZ namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID

      Nacos的服务实例分为两种类型:

      临时实例:如果实例宕机超过一段时间,会从服务列表中剔除,默认的类型

      非临时实例:如果实例宕机,不会从服务列表中剔除,也叫永久实例

      Nacos和Eureka的区别:

      相同点:都支持服务注册和服务拉取,都支持服务提供者心跳方式做健康检测

      区别:1.Nacos支持服务端主动检测提供者状态:临时实例采用心跳检测,非临时实例nacos主动询问

      2.临时实例心跳不正常被剔除,非临时实例则不会剔除

      3.Nacos支持服务礼包变更的消息推送模式,服务列表更新更及时

      4.Nacos集群默认采用AP方式,集群中存在非实例时采用CP模式;Eureka采用AP模式

      CAP定理:布鲁尔定理

      指出对于一个分布式计算机来说,不可能同时满足三点,最多同时满足两点:

      一致性(Consistency)系统中所有数据备份,在同一时刻同样的值

      可用性(Availability)保证每次请求不管成功失败都有响应

      分区容错性(Partition tolerance)系统中任意信息的丢失或失败不会影响系统的继续运作

      配置中心

      配置统一管理和配置隔离问题

      nacos=SpringCloud eureka注册中心+SpringCloud config配置中心

      项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。(热加载:不重启一个项目,使得部分代码更新,通过java类加载器实现)

      保证项目中有bootstrap.yml

      微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动

      在bootstrap.yml中提那就配置中心相关内容:环境相关spring.profiles.active

      配置中心地址,配置文件后缀

      配置加载顺序:先加载共享配置文件,再加载环境相关配置文件,在加载application.yml

      在idea中的使用

      导入依赖

      <!--nacos配置管理依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>

      添加bootstrap.yaml

      spring: application: name: userservice # 服务名称 profiles: active: dev #开发环境,这里是dev cloud: nacos: server-addr: localhost:8848 # Nacos地址 config: file-extension: yaml # 文件后缀名
      配置热更新

      最终目的,是修改nacos中的配置后,微服务无需重启就可以让配置生效(配置热更新)

      使用两种方式:

      一:@Value注入的变量所在类上添加注解@RefreshScope:

      二: 在controller中使用@ConfigurationProperties注解代替@Value注解。

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

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

      相关文章

      RISC单周期处理器设计:项目应用实例分享

      从零构建一个RISC单周期处理器&#xff1a;我的FPGA实战手记最近在带学生做数字系统课程设计时&#xff0c;我又一次亲手复现了那个经典的“玩具”——RISC单周期处理器。虽然它看起来像个教学模型&#xff0c;远不如现代流水线CPU那样炫酷&#xff0c;但正是这个看似简单的结构…

      B站视频下载完整攻略:一键保存高清内容的终极方案

      B站视频下载完整攻略&#xff1a;一键保存高清内容的终极方案 【免费下载链接】bilibili-downloader B站视频下载&#xff0c;支持下载大会员清晰度4K&#xff0c;持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 还在为B站视频无法离线观…

      如何轻松下载M3U8流媒体:N_m3u8DL-RE完整解决方案

      如何轻松下载M3U8流媒体&#xff1a;N_m3u8DL-RE完整解决方案 【免费下载链接】N_m3u8DL-RE 跨平台、现代且功能强大的流媒体下载器&#xff0c;支持MPD/M3U8/ISM格式。支持英语、简体中文和繁体中文。 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE …

      N_m3u8DL-RE流媒体下载器:新手快速上手指南

      N_m3u8DL-RE流媒体下载器&#xff1a;新手快速上手指南 【免费下载链接】N_m3u8DL-RE 跨平台、现代且功能强大的流媒体下载器&#xff0c;支持MPD/M3U8/ISM格式。支持英语、简体中文和繁体中文。 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE 你是否…

      Mac NTFS读写困境的破局之道:开源工具实战指南

      Mac NTFS读写困境的破局之道&#xff1a;开源工具实战指南 【免费下载链接】Free-NTFS-for-Mac Nigate&#xff0c;一款支持苹果芯片的Free NTFS for Mac小工具软件。NTFS R/W for macOS. Support Intel/Apple Silicon now. 项目地址: https://gitcode.com/gh_mirrors/fr/Fre…

      YimMenu DLL注入实战秘籍:高效提升GTA5游戏体验

      YimMenu DLL注入实战秘籍&#xff1a;高效提升GTA5游戏体验 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu …

      YimMenu深度解析:7个关键步骤实现GTA5菜单完美注入

      YimMenu深度解析&#xff1a;7个关键步骤实现GTA5菜单完美注入 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu…

      TuneFree:终极免费音乐播放器完全指南

      TuneFree&#xff1a;终极免费音乐播放器完全指南 【免费下载链接】TuneFree 一款基于Splayer进行二次开发的音乐播放器&#xff0c;可解析并播放网易云音乐中所有的付费资源。 项目地址: https://gitcode.com/gh_mirrors/tu/TuneFree 还在为音乐平台的会员付费而烦恼吗…

      JiYuTrainer终极破解指南:3分钟掌握极域电子教室完全解锁

      JiYuTrainer终极破解指南&#xff1a;3分钟掌握极域电子教室完全解锁 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer 还在为极域电子教室的全屏控制而束手无策吗&#xff1f;当教…

      Godot卡牌游戏框架:5个关键模块解锁专业级开发体验

      Godot卡牌游戏框架&#xff1a;5个关键模块解锁专业级开发体验 【免费下载链接】godot-card-game-framework A framework which comes with prepared scenes and classes to kickstart your card game, as well as a powerful scripting engine to use to provide full rules e…

      TuneFree音乐播放器:解锁付费音乐资源的5大核心优势

      TuneFree音乐播放器&#xff1a;解锁付费音乐资源的5大核心优势 【免费下载链接】TuneFree 一款基于Splayer进行二次开发的音乐播放器&#xff0c;可解析并播放网易云音乐中所有的付费资源。 项目地址: https://gitcode.com/gh_mirrors/tu/TuneFree TuneFree是一款革命性…

      如何快速迁移艾尔登法环存档:EldenRingSaveCopier完整指南

      如何快速迁移艾尔登法环存档&#xff1a;EldenRingSaveCopier完整指南 【免费下载链接】EldenRingSaveCopier 项目地址: https://gitcode.com/gh_mirrors/el/EldenRingSaveCopier 在艾尔登法环的广阔世界中&#xff0c;数百小时的游戏进度和精心培养的角色一旦丢失就是…

      洛雪音乐桌面版:从新手到高手的进阶指南

      洛雪音乐桌面版&#xff1a;从新手到高手的进阶指南 【免费下载链接】lx-music-desktop 一个基于 electron 的音乐软件 项目地址: https://gitcode.com/GitHub_Trending/lx/lx-music-desktop 还在为找不到好用的音乐播放器而烦恼吗&#xff1f;洛雪音乐桌面版或许能给你…

      Python通达信数据获取:金融分析的智能化革命

      Python通达信数据获取&#xff1a;金融分析的智能化革命 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 颠覆传统&#xff1a;为什么你需要重新思考数据获取方式&#xff1f; 在量化投资和金融分…

      springcloud springboot nacos版本对应

      组件版本关系 Spring Cloud Alibaba Version Sentinel Version Nacos Version RocketMQ Version Dubbo Version Seata Version 2.2.6.RELEASE 1.8.1 1.4.2 4.4.0 2.7.8 1.3.0 2021.1 or 2.2.5.RELEASE or 2.1.4.RELEASE or 2.0.4.RELEASE 1.8.0 1.4.1 4.4.0 2.7.8 1.3.0 2.2.3.…

      PDF-Extract-Kit教育场景应用:试卷题目自动识别教程

      PDF-Extract-Kit教育场景应用&#xff1a;试卷题目自动识别教程 1. 引言 1.1 教育数字化转型中的痛点 在当前教育信息化快速发展的背景下&#xff0c;教师和教研人员每天需要处理大量纸质或PDF格式的试卷、习题集和教学资料。传统的人工录入方式不仅效率低下&#xff0c;而且…

      TuneFree 免费音乐播放器:解锁网易云音乐所有付费资源的终极指南

      TuneFree 免费音乐播放器&#xff1a;解锁网易云音乐所有付费资源的终极指南 【免费下载链接】TuneFree 一款基于Splayer进行二次开发的音乐播放器&#xff0c;可解析并播放网易云音乐中所有的付费资源。 项目地址: https://gitcode.com/gh_mirrors/tu/TuneFree TuneFre…

      YimMenu完全掌握指南:从入门到精通的GTA5辅助工具使用教程

      YimMenu完全掌握指南&#xff1a;从入门到精通的GTA5辅助工具使用教程 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/…

      PDF-Extract-Kit实战:专利文档自动分析系统

      PDF-Extract-Kit实战&#xff1a;专利文档自动分析系统 1. 引言&#xff1a;构建智能PDF解析系统的工程实践 在科研与知识产权领域&#xff0c;专利文档的结构复杂、信息密度高&#xff0c;包含大量技术图表、数学公式和专业术语。传统的人工提取方式效率低下且易出错。为此&…

      5步轻松搞定CH341SER驱动:Linux串口驱动快速配置指南

      5步轻松搞定CH341SER驱动&#xff1a;Linux串口驱动快速配置指南 【免费下载链接】CH341SER CH341SER driver with fixed bug 项目地址: https://gitcode.com/gh_mirrors/ch/CH341SER 还在为Arduino开发板在Linux系统上无法识别而烦恼吗&#xff1f;今天手把手教你用最简…