【进阶】微服务

微服务架构

服务架构演变过程

单体应用架构

所有的功能都在一个项目中(现在使用的就是单体架构)

集群架构

把一个单体项目部署多个,使用Nginx进行负载均衡,根据负载均衡策略调用后端服务

不好的地方:有的服务访问量大,有的服务访问量小,这样不管访问量大小,都会进行多次部署。

垂直架构

将不同功能模块进行拆分,服务之间可以相互调用,还可以根据访问量大小进行选择性的多次部署。

不好的地方:服务之间的管理调用比较麻烦

微服务架构

微服务就提供了一套完成的,对多个服务进行管理的解决方案

服务治理(管理这么多服务)

服务调用

服务网关(对外提供一个统一的入口)

链路追踪

常见的微服务解决方案

原生的SpringCloud

本次使用springCloud alibaba 是阿里巴巴开源的一套微服务解决方案

微服务案例

以电商为例

订单服务

商品服务

用户服务

以下订单为例,在订单服务中欧调用商品服务,用户服务

简单演示服务调用

restTemplate.getForObject(url,类.class);

服务管理

服务注册中心,将微服务中的多个服务管理起来

常见的注册中心

Zookeeper

Eureka

Nacos:是springcloud alibaba中使用的

nacos是一个注册中心,用来管理服务,

安装

启动,

在项目中配置一个服务名,

再配置一个注册中的地址

服务调用

版本1: restTemplate.getForObject("http://127.0.0.1:8094/product/get/"+pid, Product.class);//弊端ip,端口写死的, 如果有多个服务使用不方便 , 没有用到注册中心

版本2: 使用naocs提供的客户端DiscoveryClient,动态从注册中心 通过服务名 获取服务,使用到了注册中心

List<ServiceInstance> instances = discoveryClient.getInstances("service-product");ServiceInstance productService = instances.get(new Random().nextInt(instances.size()));//从商品服务中随机获取一个服务String productUrl = productService.getHost()+":"+productService.getPort();//动态获取服务ip和服务端口Product product = restTemplate.getForObject("http://"+productUrl+"/product/get/"+pid,Product.class);

版本3: 使用Ribbon组件实现负载均衡功能

 restTemplate.getForObject("http://服务名/product/get/"+pid,Product.class);ribbon:ConnectTimeout: 2000 # 请求连接的超时时间ReadTimeout: 5000 # 请求处理的超时时间service-product: # 调用的提供者的名称ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule 负载均衡策略

版本4: 使用Feign组件,可以将访问地址与接口绑定, 这样我们就可以像调用本地服务一样,取调用别的服务

版本4: 使用Feign组件,可以将访问地址与接口绑定, 这样我们就可以像调用本地服务一样,取调用别的服务

@FeignClient(value = "service-product")  //服务名
public interface ProductService {
​@GetMapping(path = "/product/get/{id}")//接口地址Product findProductById(@PathVariable("id")int id);
}
​
@Autowired
ProductService productService;
​
Product product = productService.findProductById(pid);

服务容错

高并发场景下,如果访问量过大, 不加以控制,大量的请求堆积,会击垮整个服务.

需要在某些场景下,为了保证服务不宕机.

使用jmeter测试工具, 模拟多线程 向后端服务发起请求

要对请求进行限制

使用Sentinel组件对请求进行各种控制

1.在项目中做一些配置

2.启动sentinel可视化客户端 在客户端中配置流控规则

java -Dserver.port=9999 -Dcsp.sentinel.dashboard.server=localhost:9999 -jar sentinel-dashboard-1.8.5.jar

网关

网关是为众多的微服务提供一个统一的访问入口.

所有请求先进入到网关,可以在网关中进行一些全局处理,例如权限验证,token验证,限流.

网关搭建

    
  <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><scope>test</scope><!--打包运行时,就会剔除掉jar--></dependency>
​<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId><scope>test</scope></dependency>
​<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version><scope>test</scope></dependency>

在网关中做两件事情:

1.搭建全局过滤器

2.在网关中进行限流

消息队列

消息队列(Message Queue) 缩写为MQ

消息队列一般也称为消息队列中间件

中间件: 例如tomcat,redis都可以称为中间件, 是可以实现两个不同内容之间进行交互的软件

消息队列的使用场景

异步解耦

将一些不需要即时响应的操作放到消息队列中,

例如在项目中发送短信验证码,邮箱验证码,

可以在点击发送后,先将要发送的内容放入到消息队列中,然后给用户做出响应,

之后发送邮件或者发送短信的服务从消息队列中取出要发送的信息逐一处理即可.

实现了从同步发送消息 变为 异步发送消息

以RocketMQ为例

安装(略)

测试

NameServer(邮局) 消息队列的协调者,消息队列的总服务

Broker(邮递员) 负责发送,存储,投递消息

Producer(寄件人) 消息的生产者

Consumer(收件人) 消息的消费者

Topic(地区) 用来区分不同类型的消息,可以给不同的消息定义主题,用来区分不同类型消息

Message Queue(邮件) 发送的消息内容

分布式锁

在微服务系统中,一个项目可以有多个服务(进程),

此时java中的锁例如synchronized锁就会失效。

使用分布锁来对多个进程中操作进行控制

如何实现分布式锁:

基于redis实现分布式锁,在redis中可以存储一个变量,用来当做锁标志,因为redis是共享的.

例如,redis中存在共享变量,说明有用户正在操作,持有锁, 用完之后删除变量,就是释放了锁.

redis中的有一个setnx命令,在向redis中设置值的时候,会自动判断redis中是否存在指定的key,

如果redis中不存在,就设置成功(相当于获取锁成功)

如果redis中存在,就设置失败(相当于获取锁失败)


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

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

相关文章

浏览器开发者工具(F12)查看请求的响应体内容显示”无法加载响应数据: No resource with given identifier found“

背景 复习在 SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架中&#xff0c;点击登录请求后返回 JSON 格式的数据&#xff0c;出现只有登录失败的请求才有响应值&#xff0c;比如&#xff1a; {success: false, message: “没有此用户”, code: 400} 而成功的请求…

Mybatisplus自定义sql

文章目录 引言流程 引言 mybatisplus最擅长的将where里面的语句给简便化&#xff0c;而不用我们自己写标签来实现条件查询 但是很多公司规范我们将sql写在mapper层中&#xff0c;不能写在service中 而且一些语句查询的不同select count(*) xxx from xxx 也难以用mp来实现 如何…

级联选择器多选动态加载

一.级联展示 注&#xff1a;因为级联选择器这里是动态加载&#xff0c;因此如果上来选中一级就需要加载出后面三级的全部数据&#xff0c;依然会很卡&#xff0c;因此&#xff0c;和产品协商把一二级多选框去掉了&#xff0c;这样也避免了你选择一级不能实现子级被全部选中的问…

MySQL-事务隔离级别

事务有四大特性&#xff08;ACID&#xff09;&#xff1a;原子性&#xff0c;一致性&#xff0c;隔离性和持久性。隔离性一般在事务并发的时候需要保证事务的隔离性&#xff0c;事务并发会出现很多问题&#xff0c;包括脏写&#xff0c;脏读&#xff0c;不可重复读&#xff0c;…

【带你 langchain 双排系列教程】2. langchain 提示词工程应用实践

一、简介 提示词工程在利用 LangChain 与大型语言模型交互中起着关键作用&#xff0c;通过精心设计提示词&#xff0c;可以引导模型生成更准确、更符合预期的输出&#xff0c;从而提升应用的效果和用户体验。 二、基本提示词调用 可以使用 LangChain 提供的 PromptTemplate 来…

git删除本地分支

一、命令方式 1、查看本地分支 git branch 2、切换到一个不删除的分支 git checkout branch_name 3、强制删除分支 git branch -D local_branch_name 二、工具方式 1、选择"Browse references"&#xff0c;右键"Delete branch"

[Computer Vision]实验四:相机标定

目录 一、实验内容 二、实验过程及结果 2.1 实验代码 2.2 实验结果及分析 一、实验内容 了解针孔照相机的相关知识&#xff0c;实现相机标定。&#xff08;可使用提供的棋盘格或自行打印&#xff09; 可视化棋盘格关键点、匹配点数&#xff08;可加ransac&#xff09;输出…

C++笔记之标准库中用于处理迭代器的`std::advance`和`std::distance`

C++笔记之标准库中用于处理迭代器的std::advance和std::distance code review! 文章目录 C++笔记之标准库中用于处理迭代器的`std::advance`和`std::distance`一.`std::advance`函数原型参数说明使用场景示例代码示例 1:移动 `std::vector` 的随机访问迭代器示例 2:移动 `st…

【C++】36.C++IO流

文章目录 1. C语言的输入与输出2. 流是什么3. CIO流3.1 C标准IO流3.2 C文件IO流 4. stringstream的简单介绍 1. C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放在变量中。pri…

【抽象代数】1.2. 半群与群

群的定义 群非空集合二元运算性质 定义1. 设 为一个非空集合&#xff0c;上有二元运算&#xff0c;满足结合律&#xff0c;则称或为一个半群。 定义2. 设 为半群&#xff0c;若元素 满足 &#xff0c;则称 为 的左幺元&#xff08;右幺元&#xff1a;&#xff09;&#…

基于ollama+deepseek R1 1.5B本地部署语音交互助手(原创、附代码)

目录 现有的一些功能记录一些过程中遇到的问题安装llama_cpp 1、安装ollama和部署deepseek R12、使用本地部署的deepseek R1模型3、语音识别4、代码实现运行演示 现有的一些功能 1、正常与人沟通&#xff0c;但受限于电脑性能&#xff0c;还存在一定延迟&#xff1b; 2、可以根…

惠普HP Color LaserJet CP1215彩色激光打印机套色不准及套色错位的解决方法

一台惠普HP Color LaserJet CP1215彩色激光打印机出现故障&#xff0c;转印带断裂&#xff0c;于是更换了转印地&#xff0c;当更换完成测试的时候发现这台惠普HP Color LaserJet CP1215彩色激光打印机打印的颜色比较淡且颜色有错位的问题&#xff0c;继续检查机器之后&#xf…

开放签电子签章工具版 2.0 正式发布,构建全场景电子签约能力、满足复杂的签章管理场景

根据近半年开源用户和市场需求反馈&#xff0c;开放签团队推出电子签章工具版2.0版本&#xff0c;主要解决复杂的签约流程集成和电子印章授权管理场景。以API接口对外提供服务和配置一套可视化后台管理系统&#xff0c;可与业务系统无缝集成&#xff0c;用户使用起来毫无“违和…

docker 安装 Rabbitmq 详解

在平常的开发工作中&#xff0c;我们经常会使用到 rabbitmq&#xff0c;rabbitmq 主要可以进行应用解耦、异步通信、流量削峰、负载均衡、消息持久化、死信队列等。比如商城系统&#xff0c;下单后&#xff0c;通过消息队列通知库存系统、积分系统、物流系统等。发送短信时通过…

零基础学yolo系列

1.目标检测算法分类 基于深度学习的主流目标检测算法根据有无候选框生成阶段&#xff0c;分为双阶段目标检 测算法和单阶段目标检测算法两类 双阶段检测模型 将检测问题划分为两个阶段&#xff0c;首先产生候选区域&#xff0c;然后对候选区域分类并对目标位置进行精修&#x…

本智慧监考系统

本智慧监考系统共分为4个部分&#xff0c;分别为&#xff1a;展示层、业务层、算法层和数据库。 本系统的展示层基于Vue.js框架和Ant Design Vue UI框架编写。用户通过浏览器访问前端界面来实现与系统的交互。 业务层是基于SpringBoot框架编写的Java后台服务器。该层负责本系…

从开发到部署:EasyRTC嵌入式视频通话SDK如何简化实时音视频通信的集成与应用

嵌入式设备和视频综合管理平台均支持B/S架构。在B/S架构下&#xff0c;传统的视频观看方式依赖于微软的OCX控件&#xff0c;然而OCX控件的使用正面临越来越多的挑战&#xff1a; 首先&#xff0c;用户需要安装浏览器插件、调整浏览器安全级别&#xff0c;并允许ActiveX控件弹出…

如何查看 Linux 服务器的 MAC 地址:深入解析与实践指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

RabbitMQ 3.12.2:单节点与集群部署实战指南

前言&#xff1a;在当今的分布式系统架构中&#xff0c;消息队列已经成为不可或缺的组件之一。它不仅能够实现服务之间的解耦&#xff0c;还能有效提升系统的可扩展性和可靠性。RabbitMQ 作为一款功能强大且广泛使用的开源消息中间件&#xff0c;凭借其高可用性、灵活的路由策略…

Ubuntu22.04配置cuda/cudnn/pytorch

Ubuntu22.04配置cuda/cudnn/pytorch 安装cuda官网下载.run文件并且安装/etc/profile中配置cuda环境变量 cudnn安装官网找cuda版本对应的cudnn版本下载复制相应文件到系统文件中 安装pytorch官网找cuda对应版本的pytorchpython代码测试pytorch-GPU版本安装情况 安装cuda 官网下…