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);}@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}
#修改order-service服务中的OrderService类中的queryOrderById方法
@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate 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:8848discovery: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:8848discovery:cluster-name: HZnamespace: 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/diannao/72016.shtml

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

相关文章

goLand导入git项目并打包发布linux

作为项目管理&#xff0c;拥有半吊子开发能力&#xff0c;居然有一天需要修改维护go项目。。。从菜鸟教程学习开始~苦 goland导入git项目 本地启动 导入之后会自动更新相关依赖。 本人导入之后立马修改了依赖位置&#xff0c;且修改为一项目一位置&#xff0c;互不干涉。 在代…

通义灵码插件安装入门教学 - IDEA(安装篇)

在开发过程中&#xff0c;使用合适的工具和插件可以极大地提高我们的工作效率。今天&#xff0c;我们将详细介绍如何在 IntelliJ IDEA 中安装并配置通义灵码插件&#xff0c;这是一款旨在提升开发者效率的实用工具。无论你是新手还是有经验的开发者&#xff0c;本文都将为你提供…

【设计模式精讲】开源实战之剖析Spring框架:Spring中工厂模式的应用

文章目录 第七章 开源实战7.1 剖析Spring框架中用到的经典设计模式7.1.1 Spring中工厂模式的应用7.1.1.1 Spring中的Bean组件7.1.1.2 Spring中的BeanFactory7.1.1.3 Spring中的FactoryBean 个人主页&#xff1a;道友老李 欢迎加入社区&#xff1a;道友老李的学习社区 第七章 开…

[数据结构]用栈实现队列

思路分析 代码实现&#xff1a; typedef int STDataType; typedef struct Stack {int* a;int top;//下标int capacity; }ST; //栈的初始化 void STInit(ST* ps); //栈的插入 void STPush(ST* ps, STDataType x); //栈的删除 void STPop(ST* ps); // int STSize(ST* ps); //判断…

C++ 17 允许在 for 循环,if 语句,switch 语句中初始化变量

看到 c 有这个特性&#xff0c;python 和 java 似乎都没有&#xff0c;根据 AI 的回答进行了一些整理总结。 文章目录 **1. 在 for 循环中初始化变量****特点****多个变量初始化** **2. 在 if 语句中初始化变量&#xff08;C17 及以上&#xff09;****示例****特点** **3. 在 s…

【云原生之kubernetes实战】在k8s环境中高效部署Vikunja任务管理工具(含数据库配置)

【【云原生之kubernetes实战】在k8s环境中高效部署Vikunja任务管理工具(含数据库配置) 前言一、Vikunja介绍1.1 Vikunja简介1.2 Vikunja主要特点1.3 使用场景二、相关知识介绍2.1 本次实践存储介绍2.2 k8s存储介绍三、本次实践介绍3.1 本次实践简介3.2 本次环境规划3.3 部署前…

分享一个常用的命名规则和Spring的命名风格

目录 Spring 命名风格规范总结表 常用代码命名单词&#xff08;通用且专业&#xff09; 命名技巧 一、返回布尔值的方法 二、条件执行方法 三、异步处理方法 四、回调方法 五、集合操作方法 六、状态校验方法 七、对象生命周期方法 八、数据操作方法 Spring 命名风格规…

【Golang学习之旅】Go-zero + Gen:如何使用 Gen 提升 Go 开发效率

文章目录 前言一、Go-zero简介二、Gen工具简介2.1 Gen的功能与特点2.2 Gen的工作原理 三、Go-zero Gen&#xff1a;结合的优势3.1为什么选择Go-zero与Gen3.2 Gen的代码生成与Go-zero的结合点 四、实际案例&#xff1a;Go-zero Gen的应用4.1 构建一个用户管理系统4.2 定义Gen配…

软件工程----统一过程模型RUP

统一过程RUP是一种以用例驱动、以体系结构为核心、迭代和增量的软件开发过程&#xff0c;由UML方法和工具支持&#xff0c;广泛应用于各类面向对象项目。 RUP本身支持可裁剪性&#xff0c;可应付给类领域软件和不同的项目规模 RUP蕴含了大量优秀的实践方法&#xff0c;如&…

48V电气架构全面科普和解析:下一代智能电动汽车核心驱动

48V电气架构&#xff1a;下一代智能电动汽车核心驱动 随着全球汽车产业迈入电动化、智能化的新时代&#xff0c;传统12V电气系统逐渐暴露出其无法满足现代高功率需求的不足。在此背景下&#xff0c;48V电气架构应运而生&#xff0c;成为现代电动汽车&#xff08;EV&#xff09…

图数据库 | 24、如何进行正确性验证?

图数据库计算和查询结果的正确性&#xff0c;这个重要性当然是不言而喻的&#xff01; 老夫之前也写文章讲过&#xff0c;今天再手书一篇&#xff0c;旨在向大家系统地介绍一下图数据库查询与计算到底如何进行正确性验证&#xff01;&#xff01;&#xff01; 图数据库中的操…

Rust ~ Vec<u8>和[u8]

Vec<u8> 和 &[u8] 是两种不同的数据类型&#xff0c;它们都与字节序列相关&#xff0c;但在所有权、内存管理、使用场景等方面存在明显区别 类型本质 Vec<u8>&#xff1a;Rust 中的动态数组类型&#xff0c;即向量&#xff08;vector&#xff09;。它是一个拥…

MYSQL学习笔记(十):约束介绍(如:非空、唯一、主键、外键、级联、默认、检查约束)

前言&#xff1a; 学习和使用数据库可以说是程序员必须具备能力&#xff0c;这里将更新关于MYSQL的使用讲解&#xff0c;大概应该会更新30篇&#xff0c;涵盖入门、进阶、高级(一些原理分析);这一篇讲解“约束”&#xff0c;如&#xff1a;非空、唯一、主键、外键、级联、默认…

树莓百度百科更新!宜宾园区业务再添新篇

树莓集团宜宾园区业务不断拓展&#xff0c;主要体现在以下几个方面&#xff1a; 产业布局 -聚焦数字经济核心领域&#xff1a;涵盖软件开发、人工智能、大数据等&#xff0c;吸引众多上下游企业入驻&#xff0c;形成从芯片研发、软件开发到系统集成的完整产业链条。 -推进“双…

Halcon 学习之路 set_grayval 算子

gen_imag_const 创建灰度图像 gen_image_const(Image&#xff0c;Type&#xff0c;Width&#xff0c;Height) 算子gen_image_const创建指定大小的图像&#xff0c;图像的宽度和高度由Width和Height决定 Type 像素类型 byte :每像素1字节&#xff0c;无符号&#xff08;0-255&…

03_pyqt5 + vlc 实现视频播放器

1.功能需求如图 按钮: 播放/暂停, 前进/后退, 视频上一个/下一个, 打开视频进度条: 视频进度条显示, 进度条拖拽, 音量控制按键控制: 1,2,3,4缩放画面大小, 2.方案选择 开发语言: python UI界面: pyqt5 qt_designed 设计ui布局 视频编码: python-vlc 方案说明: 视频解码可…

使用vscode导出Markdown的PDF无法显示数学公式的问题

我的硬件环境是M2的MacBook air&#xff0c;在vscode中使用了Markdown PDF来导出md文件对应的PDF。但不管导出html还是PDF文件&#xff0c;数学公式都是显示的源代码。 我看了许多教程&#xff0c;给的是这个方法&#xff1a;在md文件对应的html文件中加上以下代码&#xff1a…

Java 网络编程(二)—— TCP流套接字编程

TCP 和 UDP 的区别 在传输层&#xff0c;TCP 协议是有连接的&#xff0c;可靠传输&#xff0c;面向字节流&#xff0c;全双工 而UDP 协议是无连接的&#xff0c;不可靠传输&#xff0c;面向数据报&#xff0c;全双工 有连接和无连接的区别是在进行网络通信的时候&#xff0c;…

MySQL 事务笔记

MySQL 事务笔记 目录 事务简介事务操作事务四大特性并发事务问题事务隔离级别总结 事务简介 事务&#xff08;Transaction&#xff09;是数据库操作的逻辑单元&#xff0c;由一组不可分割的SQL操作组成。主要用于保证&#xff1a; 多个操作的原子性&#xff08;要么全部成功…

GPT1 与 GPT2 的异同

1.什么是GPT1&#xff1a; GPT1介绍了一种通过生成式预训练&#xff08;Generative Pre-Training&#xff09;来提升语言理解能力的方法。这种方法首先在一个大型的未标注文本语料库上进行语言模型的预训练&#xff0c;然后针对具体的任务进行判别式微调&#xff08;discrimin…