2024.5.6 关于 SpringCloud 的基本认知

目录

引言

微服务框架所包含的技术栈

面试题

微服务架构演变

单体架构

分布式架构

微服务架构

微服务技术对比

认识 SpringCloud

SpringBoot 版本兼容关系

服务拆分和远程调用

服务拆分注意事项

远程调用

引入问题


引言

  • 微服务是一种框架风格,按照业务板块来划分应用代码,使单个应用的职责更清晰,相互之间可以做到独立升级迭代

微服务框架所包含的技术栈


面试题
  • 微服务中常用的组件有哪些?

回答:

  1. 首先微服务是有多个的,微服务之间进行相互调用便需要用到 OpenFeign 组件
  2. 其次使用 Nacos 组件作为注册中心,使得每个服务均可注册自己的服务,从而有效地对这些服务进行管理
  3. 随着服务数量的增加,不可避免地会产生加载不均的问题,此时我们便需要用到 LoadBalancer 组件来实现负载均衡,确保每个服务能被公平且合理地调用
  4. 至此微服务集群便形成了,如果对外提供服务,并非随便就可以访问的,所以在微服务群前面便就需要使用 Geteway 网关作为入口
  5. 访问流量激增,引起服务器雪崩这显然是不被允许的,此处我们便可使用 Sentinel 组件进行限流、熔断降级保护
  6. 除此之外,分布式系统一般都会引发分布式事务问题,此时便需要用到 Seata 组件提供高性能和简单易用的事务服务

微服务架构演变

单体架构

  • 将业务的所有功能集中在一个项目中开发,打成一个包部署
  • 适合小型项目

总结:

  • 优 ——> 架构简单、部署成本低
  • 缺 ——> 耦合度高

分布式架构

  • 根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为一个服务
  • 适合大型互联网项目

总结:

  • 优 ——> 降低服务耦合度、利于服务升级拓展

分布式框架需要考虑的问题:

  • 服务拆分的粒度如何?
  • 服务集群地址如何维护?
  • 服务之间如何实现远程调用?
  • 服务健康状态如何感知?

微服务架构

  • 微服务是一种经过良好架构设计的分布式架构方案

特征:

  • 面向服务 ——> 微服务对外暴露业务接口
  • 隔离性强 ——> 服务调用做好隔离、容错、降级,避免出现级联问题
  • 单一职责 ——> 微服务拆分粒度更小,每一个服务均对应唯一的业务能力,避免重复业务开发
  • 自治 ——> 团队独立、技术独立、数据独立、部署独立

总结:

  • 优点 ——> 拆分粒度更小、服务更独立、耦合度更低
  • 缺点 ——> 框架非常复杂、运维、监控、部署难度提高

微服务技术对比

  • 国内最知名微服务技术框架的就是 SpringCloud 和 阿里巴巴的 Dubbo

DubboSpringCloudSpringCloudAlibaba
注册中心zookeeper、RedisEureka、ConsulNacos、Eureka
服务器远程调用Dubbo协议Feign(http协议)Dubbo、Feign
配置中心SpringCloudConfigSpringCloudConfig、Nacos
服务网关SpringCloudGateway、ZuulSpringCloudGateway、Zuul
服务监管和保护dubbo-admin,功能弱HystrixSentinel

认识 SpringCloud

  • SpringCloud 集成了各种微服务功能组件
  • SpringCloud 给予 SpringBoot 实现了各种组件的自动装配,达到了开箱即用体验的效果


SpringBoot 版本兼容关系

服务拆分和远程调用

服务拆分注意事项

  1. 不同微服务,不要重复开发相同业务
  2. 微服务数据独立,不要访问其他微服务的数据库
  3. 微服务可以将自己的业务暴露为接口,供其他微服务调用

实例理解

  • 此处我们将该服务拆分成了 订单模块 和 用户模块
  • 每个微服务均有属于自己的数据库
  • 由于在不同的数据库中,因此只能通过订单 id 查询订单数据,或者通过用户 id 查询用户数据,无法交叉访问

问题:

  • 如何在根据订单 id 查询订单的时,将该订单所属用户的用户信息一并返回呢?
  • 即如何在 订单模块 中远程调用 用户模块 中的接口?


远程调用

  • 注册 RestTemplate
  • 在 order-service 的 OrderApplication 中(SpringBoot 启动类)注册 RestTemplate
package cn.itcast.order;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;//@MapperScan 注解的作用相当于在指定包下的所有 mapper 接口上都加上了 @mapper 注解
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}/*** 将 RestTemplate 对象注入到 spring 容器中* @return*/@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}
  • 远程调用 RestTemplate
  • 在 order-service 中,通过 RestTemplate 的 getForObject 方法构造 get 请求并发送
  • user-service 收到请求并返回对应数据,最后 getForObject 方法收到数据并反序列化为指定类型
package cn.itcast.order.service;import cn.itcast.order.mapper.OrderMapper;
import cn.itcast.order.pojo.Order;
import cn.itcast.order.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;public Order queryOrderById(Long orderId) {
//        1、查询订单Order order = orderMapper.findById(orderId);
//        2、利用 RestTemplate 发起 http 请求,查询用户
//          a) url 路径String url = "http://localhost:8081/user/" + order.getUserId();
//          b) 发起 http 请求,实现远程调用
//      get请求:getForObject
//      post请求:postForObject
//      第一个参数是 url, 第二个参数是请求后响应的参数类型(自动的反序列化)User user = restTemplate.getForObject(url, User.class);
//        3、封装 User 到 Orderorder.setUser(user);
//        4、返回return order;}
}

运行结果:


引入问题

  • 此处利用 RestTemplate 发送的 http 请求时,无疑是将 url 给直接写死了
  • 如果为了应对更多并发,我们的 user-service 可能会被部署为多实例,形成一个集群
  • 此时如果还是采取硬编码的形式来写的话,我们又该写那个 user-service 的代码呢?
  • 如果永远写的都是 8081 端口,那另外两个 user-service 存在的意义是什么呢?

解决方案:

  • 使用 Eureka 来解决上述问题

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

解决离线服务器无法加载HuggingFaceEmbeddings向量化模型的问题

由于服务器是离线的,因此我先在本地到huggingface官网下载模型text2vec,然后上传到服务器上运行,报错: (MaxRetryError(HTTPSConnectionPool(host\huggingface.co\, port443): Max retries exceeded with url: /api/models/senten…

Windows 11 Manager (Win11系统优化大师) 中文破姐版 v1.4.3

01 软件介绍 ​Windows 11 Manager v1.4.3是一款综合性的系统优化工具,专为Win11设计。该工具包含超过40种功能,旨在全方位提升操作系统的性能。通过这些工具,用户可以对Windows 11进行深度优化和微调,清除不必要的文件&#xff…

Nginx 从入门到实践(3)——负载均衡、反向代理、动静分离

Nginx代理服务 Nginx代理服务 Nginx代理服务Nginx负载均衡反向代理反向代理的用途 Nginx配置攻略Nginx动静分离使用 Nginx 实现四层代理配置基本介绍使用 Nginx 实现四层代理配置 Nginx负载均衡 负载均衡(Load Balance)是由多台服务器以对称的方式组成一…

uniapp开发微信小程序,选择地理位置uni.chooseLocation

<view click"toCommunity">点击选择位置</view>toCommunity() {const that thisuni.getSetting({success: (res) > {const status res.authSetting// 如果当前设置是&#xff1a;不允许&#xff0c;则需要弹框提醒客户&#xff0c;需要前往设置页面…

【Ubuntu永久授权串口设备读取权限‘/dev/ttyUSB0‘】

Ubuntu永久授权串口设备读取权限 1 问题描述2 解决方案2.1 查看ttyUSB0权限&#xff0c;拥有者是root&#xff0c;所属用户组为dialout2.2 查看dialout用户组成员&#xff0c;如图所示&#xff0c;普通用户y不在dialout组中2.3 将普通用户y加入dialout组中2.4 再次查看dialout用…

Baidu Comate 编程插件:提升开发效率的利器

文章目录 引言简介目的 Baidu Comate插件概述定义与功能市场现状竞品分析 安装与配置VsCode 安装&#xff1a;注意事项 版本选择 核心特性详解功能介绍代码生成实时续写错误纠正 使用体验体验地址 引言 简介 基于文心大模型&#xff0c;结合百度积累多年的编程现场大数据和外…

C++运算符重载(操作符重载)

运算符重载 1. 运算符重载基础1.1 运算符重载语法1.2 运算符重载细节补充1.3 更多的运算符重载 2. 重载单目运算符3. 如何直接输入输出对象类型——重载运算符 << 和 >>3.1 单个对象实现 cou <<3.2 多个对象实现 cout<<3.3 右移运算符 输入 cin >&g…

nginx_01

1.安装 yum install epel-release -y # 安装yum的扩展包 yum install nginx -y systemctl start nginx.service #启动nginx systemctl enable nginx.service # netstat -lntup # 查看端口占用情况 # 可以看到nginx默认占用了80端口 2.nginx配置 # 注意配置文件的语法格式…

Django项目之电商购物商城 -- 修改/删除收货地址/设置默认地址

Django项目之电商购物商城 – 修改/删除收货地址/设置默认地址 修改和删除收货地址依旧实在user应用下进行 , 其思路和新增收货地址非常相似 依旧是更具前端的数据来写 在这里修改和删除地址的URL是相同的 , 所以我们只要设置一个模型类就可以实现这两个功能 一 . 修改地址…

了解 条码工具 Dynamsoft 在条码读取器中的形态运算

在图像处理中&#xff0c;术语形态学是指分析形状以填充小孔、去除噪声、提取轮廓等的一组操作。形态学操作很像空间卷积中的过滤过程。有两个部分在起作用&#xff1a;结构元素和预定义的计算规则。 点击下载Dynamsoft最新版https://www.evget.com/product/3691/download 结…

每天五分钟计算机视觉:使用极大值抑制来寻找最优的目标检测对象

本文重点 在目标检测领域,当模型预测出多个候选框(bounding boxes)时,我们需要一种方法来确定哪些候选框最有可能表示真实的目标。由于模型的不完美性和图像中目标的重叠性,往往会有多个候选框对应于同一个目标。此时,极大值抑制(Non-Maximum Suppression,NMS)技术就…

关于docker network网络

首先,我们来看看Docker默认的网络模式,即docker0网桥。 每当你安装Docker时,它会创建一个名为docker0的虚拟网桥,并设置一个IP地址范围供它进行端口映射等工作。所有Docker容器在创建时,都会自动连接到这个docker0网桥,并分配一个虚拟IP地址。这样,容器与主机之间,以及容器与容…

【JavaEE精炼宝库】多线程1(认识线程 | 创建线程 | Thread 类)

目录 一、认识线程 1.1 线程的概念&#xff1a; 1.2 为什么需要线程&#xff1a; 1.3 面试题.谈谈进程和线程的区别&#xff1a; 1.4 Java的线程和操作系统线程的关系&#xff1a; 二、创建线程 2.1 创建线程的5种写法&#xff1a; 2.1.1 写法1.继承 Thread 类&#xf…

简单的表单初始密码验证的实现

目录 简单示例&#xff1a;表单初始密码验证 1.1准备工作(图1&#xff09; 1.2 index部分 1.3 css部分 1.3.1先把css部分链接到index.html中&#xff0c;注意链接的地址。 1.3.2添加样式 1.4 JS部分 1.4.1 先把js部分链接到index.html中&am…

大华智能物联综合管理平台 fastjson远程代码执行漏洞复现

0x01 产品简介 大华ICC智能物联综合管理平台对技术组件进行模块化和松耦合,将解决方案分层分级,提高面向智慧物联的数据接入与生态合作能力。 0x02 漏洞概述 由于大华智能物联综合管理平台使用了存在漏洞的FastJson组件,未经身份验证的攻击者可利用 /evo-runs/v1.0/auths/…

块元素、内联元素、行内块元素

一、介绍&#xff1a; CSS元素划分成块元素、行内元素&#xff08;内联元素&#xff09;、行内块元素等多种常用类型。也就是说&#xff1a;在CSS中&#xff0c;元素根据其在页面上的布局方式被分为不同的显示类型。 背景&#xff1a;HTML负责定义网页的结构和内容&#xff0c…

如何利用AI实现文档处理自动化

文件处理在许多企业及员工看来是一项必不可少、却又耗时费力的工作。每天&#xff0c;他们往往需要花费无数个小时去对文件进行分类、归档、以及搜索。不过&#xff0c;如今人工智能&#xff08;AI&#xff09;正在以自动化的方式改变着这些琐碎的工作。 通过利用人工智能&…

H5 云商城 file.php 文件上传致RCE漏洞复现

0x01 产品简介 H5 云商城是一个基于 H5 技术的电子商务平台,旨在为用户提供方便快捷的在线购物体验。多平台适配:H5 云商城采用 H5 技术开发,具有良好的跨平台适配性。无论是在电脑、手机还是平板等设备上,用户都可以通过网页浏览器访问和使用云商城,无需安装额外的应用程…

在做题中学习(56):二维前缀和模板

【模板】二维前缀和_牛客题霸_牛客网 (nowcoder.com) 理解题意&#xff1a; 要求的是(x1,y1) - (x2,y2)这段区间的和。 解法&#xff1a;二维前缀和 1. 和一维前缀和一样&#xff0c;需要有一个同等规模的dp数组&#xff0c;用来保存一段连续区域的和。 在二维dp中&#xff0…

uni-app(三):离线打包与插件引用(Android)

离线打包与插件引用 1.下载Android离线SDK2.使用Android Studio打开离线打包项目并更新Gradle3.解决报错4.构建5.配置AppKeya.查看证书b.申请AppKeyc.配置AppKey 6.生成本地打包App资源7.拷贝App资源到Android项目中8.修改 appid9.修改Android项目配置文件10.下载证书并配置11.…