微服务笔记 2025/2/15

微服务是一种软件架构风格,它是以专注于单一职责的很多小型项目为基础,组合出复杂的大型应用。

微服务是一种架构。

微服务是一种架构。

微服务是一种架构。

以前自己做项目最常用的架构是单体架构。单体项目不适合开发大型项目。

学习微服务技术来解决服务拆分碰到的问题。

使用微服务技术(工具)把单体项目拆成微服务项目。

上图是一些微服务技术,解决相应问题。

什么是单体架构

将业务的所有功能集中在一个项目中开发,打成一个包部署。

优点:架构简单、部署成本低。

缺点:团队协作成本高、系统发布效率低、系统可用性差。

总结:单体架构适合开发功能相对简单,规模较小的项目。

微服务架构

微服务架构,是服务化思想指导下的一套最佳实践架构方案。服务化,就是把单体架构中的功能模块拆分为多个独立项目。

SpringCloud

SpringCloud是目前国内使用最广泛的微服务框架。SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验。(但对于Springboot的版本也有要求)

(题外话:Springboot最擅长自动装配和依赖管理)

拆分原则

目标:高内聚、低耦合

拆分方式:横向拆分(抽取公共服务,提高复用性)、纵向拆分(按照业务模块拆分)

拆分服务

工程结构有两种:独立project、Maven聚合

远程调用

一旦微服务进行了拆分,数据产生了隔离,服务也产生了隔离,没法像以前一样调用了,如果想要像以前一样查询,查别人的数据,就必须通过网络调用。

注册中心

为什么要有注册中心?8081不能写死,8082和8083服务也要访问。

1.服务调用者不知道服务提供者的地址,因为写代码的那一刻项目还没启动。

2.就算知道了地址,要访问哪个。

3.写好了代码却挂了,怎么知道新的服务的地址。

这就是服务远程调用时可能出现的问题,可以用注册中心来解决这个问题。设一个中介。

 Nacos——注册中心的技术

Nacos是目前国内企业中占比最多的注册中心组件。它是阿里巴巴的产品,目前已经加入SpringCloudAlibaba中。

服务注册

拆好的服务去实现服务的注册,引入依赖,配ip和端口,注册后可以通过Nacos看到注册好的服务。

服务发现

服务调用者去Nacos里拉取服务的信息。也要引入依赖,获取ip和端口才行,提供好了这个API。

最简单的负载均衡,随机负载均衡,Ramdom。

OpenFeign

OpenFeign是一个声明式的http客户端,用来发送http请求的。让刚刚的代码也就是下图的代码变得简单。

简化后(OpenFeign已经被SpringCloud自动装配)

连接池

日志

总结

服务拆分尝试(以支付微服务为例)

首先去支付部分的controller, 看里面的各种接口进到serviceImpl里,然后看是否用到其他微服务,用到了就把此接口拆出来,放到新的client里,加上FeignClient注解,由api统一向所有的发请求(包括拆出来的client),然后回到servicelmpl里修改那些调用的主体。把那些不变的复制粘贴过来。

网关

就是网络的关口,负责请求的路由,转发,身份验证。

在SpringCloud中网关的实现包括两种:Spring Cloud Gateway、Netfilx Zuul

网关路由

1.创建新模块

2.引入网关依赖:起步依赖(网关依赖、负载均衡依赖、Nacos依赖)

3.编写启动器:xxxApplication.java(记得带SpringbootApplication注解)

4.配置路由规则

【GeekHour】30分钟Nginx入门教程_哔哩哔哩_bilibili 

路由属性

网关路由对应的java类型是RouteDefinition,其中常见的属性:

id:路由唯一标识

url:路由目标地址

predicates:路由断言,判断请求是否符合当前路由(不仅可以指定路径,还能设置在某时之前之后的条件)

filters:路由过滤器,对请求或响应做特殊处理(可添加修改请求头、响应头、路径重写、去路径n段前缀)

网关登录校验

网关就像小区的开门大爷,是整个微服务的入口。

我们就不必在每个微服务里都校验一次,在网关里这个入口jwt校验一次就可以了。

这个校验一定要放在网关转发之前去做,就像看门大爷在找人前必须校验外来人员。

 基于路由断言RoutePredicateHandMapping去做路由匹配,然后到过滤器形成过滤器链...

综上,如何在网关转发之前做登录校验?在网关自定义一个过滤器,保证这个过滤器执行的顺序在NettyRoutingFilter之前,并且在它的pre逻辑去实现jwt的校验。(pre是转发之前,post是之后)

网关如何传递用户信息给微服务?不同的微服务tomcat都不一样,所以肯定没法用threadlocal(threadlocal在tomcat内部,线程之间去共享)。可以保存用户到请求头。

如何在微服务之间传递用户信息?也是保存用户要请求头。

自定义过滤器

网关过滤器由两种:GatewayFilter、GlobalFilter

GatewayFilter:路由过滤器,可以任意指定路由范围

GlobalFilter:全局过滤器,作用范围是所有路由

自定义过滤器仿写:微服务02-05.网关登录校验-自定义GlobalFilter_哔哩哔哩_bilibili

方法1.自定义过滤器GlobalFilter类直接实现GlobalFilter接口就行了,如果向控制自定义过滤器的执行顺序,加个order就可以了:利用exchang参数获取请求信息,然后写过滤器业务逻辑,然后放行(调用过滤器链chain的下一个过滤器)

方法2.利用gateway自定义过滤器,回头再写吧。

登录校验

自定义过滤器写好了,准备工作就完毕了,可以写登录校验了。(黑马商城是JWT实现的登录校验)

hmall.jks文件打开乱码,是保存jwt密钥的文件,所以看起来乱码。配置在hm的jwt里(yaml),有个类(jwtProperties.java)去加载配置里的属性,真正去读取文件生成密钥的在securityConfig.java里。还有一个jwtTool。

excludePaths不用登录校验的,放行的路径。也要有一个属性类去读取(回头再看吧)

如果不用登录拦截就直接放行chain链调用下一个,否则获取token再校验并解析token,可以的话就传递用户信息后放行。

网关传递用户

拦截器

步骤:

1.在网关的登录校验过滤器中,把获取到的用户写入请求头。(有API)

2.在hm-common中编写SpringMVC拦截器,获取登录用户。(因为每个微服务都有登录用户的需求)

OpenFeign传递用户

微服务之间也要传递用户。

openFeign中提供了一个拦截接口,所有由OpenFeign发起的请求都会先调用拦截器处理请求,其中的RequestTemplate类中提供了一些方法可以让我们修改请求头。

拦截器每个微服务都会用,公共的,所以放在hm-api里。

总结:

1.登录校验问题:

网关部分定义了一个过滤器,过滤器主要做两件事:请求来了之后先去做JWT登录校验,从而获取token中的用户信息,把用户信息保存到请求头,转发这个请求的时候自然就传到微服务了。这里用到的过滤器是GlobalFilter。

当请求到达微服务部分,我们需要在微服务里获取用户信息。该微服务里有好多业务都要去获取用户信息,不可能在每个微服务的每个业务里都写这个逻辑,为了简化这个操作,我们就在微服务里定义了一个拦截器,拦截器可以帮助我们把网关传过来的请求头中的用户信息给取出来,取完之后为了方便使用,保存信息到threadlocal里(因为这是微服务内部,可以线程来回调,就可以用threadlocal)。这样的拦截器是SpringMVC的拦截器,叫做HandlerInterceptor。

微服务之间的相互调用:有一些业务比较复杂,可能会出现微服务之间的相互调用,往往这些可以通过OpenFeign去实现,而这些微服务要怎么拿到用户信息呢(从微服务,而不是网关)?也保存到请求头,后续的微服务才能拿到用户信息。用到OpenFeign的拦截器,requestInterceptor。

配置管理

微服务太多,重复配置太多,如mysql

优点:配置共享;避免配置更新后的重启,实现配置热更新。

而之前我们用到提供注册中心服务的nacos,也可以提供配置管理服务。

配置共享

步骤:

1.添加共享配置到Nacos中,包括jdbc、MybatisPlus、日志、Swagger、OpenFeign等。

2.拉取共享配置:基于NacosConfig拉取共享配置代替微服务的本地配置。

引入依赖->新建bootstrap.yaml 

配置热更新

当我们修改配置文件中的配置中时,微服务无需重启即可使配置生效。

配置前提:

1.nacos中要有一个与微服务名有关的配置文件。

2.微服务中要以特定方式读取需要热更新的配置属性。

动态路由

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

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

相关文章

Android 端侧运行 LLM 框架 MNN 及其应用

MNN Chat Android App - 基于 MNN 引擎的智能聊天应用 一、MNN 框架简介与工作原理1.1 什么是 MNN?1.2 MNN 的工作原理 二、MNN Chat Android App2.1 MNN Chat 的功能2.2 MNN Chat 的优势2.3 MNN Chat Android App 的使用 三、总结 随着移动端人工智能需求的日益增长…

基于Python 宠物用品库存管理系统开发

Python 宠物用品库存管理系统开发 一、项目背景与需求分析 在宠物行业蓬勃发展的当下,宠物用品店的商品种类繁多,库存管理变得尤为重要。为了提高管理效率、减少人为错误,我们可以开发一个宠物用品库存管理系统。该系统需要具备商品信息管理…

Linux---共享内存

1.ipcs命令 IPC机制是一个让人烦恼的问题:编写错误的程序或因为某些原因而执行失败的程序将把它的IPC资源(如消息队列中的数据)遗留在系统里,并且这些资源在程序结束后很长时间让然在系统中游荡,这导致对程序的新调用…

数据结构与算法:二叉树

目录 树的概念 二叉树 二叉树性质 二叉树的遍历 前序遍历 中序遍历 后序遍历 层序遍历 二叉树节点个数 二叉树叶子节点个数 二叉树高度 二叉树第k层节点个数 二叉树查找值为x的节点 判断二叉树是否是完全二叉树 二叉树销毁 树的概念 树型结构是一类重要的非线性…

中科大计算机网络原理 1.5 Internt结构和ISP

一、互联网的层次化架构 ‌覆盖范围分层‌ ‌主干网(Tier-1级)‌ 国家级或行业级核心网络,承担跨区域数据传输和全球互联功能。例如中国的四大主干网(ChinaNET、CERNET等)以及跨国运营商(如AT&T、Deuts…

AI编程界的集大成者——通义灵码AI程序员

一、引言 随着软件行业的快速发展和技术的进步,人工智能(AI)正在成为软件开发领域的一个重要组成部分。近年来,越来越多的AI辅助工具被引入到开发流程中,旨在提高效率、减少错误并加速创新。在这样的背景下&#xff0…

GPT-4.5震撼登场,AI世界再掀波澜!(3)

GPT-4.5震撼登场,AI世界再掀波澜! GPT-4.5震撼登场,AI世界再掀波澜!(2) (一)伦理困境:如何抉择 GPT-4.5 的强大功能在为我们带来诸多便利的同时,也引发了一系列深刻的伦理问题,这些问题犹如高…

electron-builder打包时github包下载失败【解决办法】

各位朋友们,在使用electron开发时,选择了electron-builder作为编译打包工具时,是否经常遇到无法从github上下载依赖包问题,如下报错: Get "https://github.com/electron/electron/releases/download/v6.1.12/ele…

【Linux】命令行参数 | 环境变量(四)

目录 前言: 一、命令行参数: 1.main函数参数 2.为什么有它? 二、环境变量: 1.main函数第三个参数 2.查看shell本身环境变量 3.PATH环境变量 4.修改PATH环境变量配置文件 5.HOME环境变量 6.SHELL环境变量 7.PWD环境变…

计算机毕业设计Python+DeepSeek-R1大模型游戏推荐系统 Steam游戏推荐系统 游戏可视化 游戏数据分析(源码+文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

Python实现GO鹅优化算法优化BP神经网络回归模型项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 传统BP神经网络的局限性:BP(Back Propagation)神经网络作为一种…

1.忆往昔—Java发展史

在编程世界的远古时代,C语言和C统治着大地,但它们复杂且难以驾驭。1995年5月23日,Java 1.0正式发布,它像一把神奇的钥匙,打开了“一次编写,到处运行”的大门。 早在1991年Java就已经初见雏形,不…

Vue+Elementui 全局配置el-table表格列宽可拖拽

1、需求分析 如何让表格列宽可以拖动 elementui的el-table如果想要列宽可以拖动的话 有一个属性叫 border 在模板里添加这个属性即可实现 但是系统里面的表格我不可能一个一个去添加border太麻烦 如果能够全局配置岂不是非常省时间吗 我们在main.js里面通过全局混入的方式来…

“Web渗透测试实战指南|BWAPP靶场全关卡通关教程(含高中低/不可能级别)从SQL注入到XSS攻击手把手教学|网络安全工程师必备技能“ 内容较长点赞收藏哟

目录 Low级别 ---A1 - Injection{注入}-- HTML Injection - Reflected (GET) HTML Injection - Reflected (POST) HTML Injection - Reflected (URL) HTML Injection - Stored (Blog) iFrame Injection LDAP Connection Settings Mail Header Injection (SMTP) OS Co…

释放 Cursor 的全部潜能:快速生成智能 Cursor Rules

释放 Cursor 的全部潜能:使用 PromptCoder 从 package.json 快速生成智能 Cursor Rules 我们将深入探讨如何利用您项目中的 package.json 文件,轻松生成 Cursor Rules,并通过 PromptCoder 这个强大的工具,快速创建高质量的 curso…

DeepSeek开源周-汇总

当 ChatGPT、Claude 这些闭源大模型严防死守技术秘密时,DeepSeek 却反其道而行,选择了全面开源,为整个 AI 生态注入新的活力。 在过去短短一周内,DeepSeek 连续在 GitHub 开源了 8 个核心技术项目,完成了一次震撼业界…

02内存映射与bmp解码

一、mmap 内存映射 内存映射的作用是把硬件设备的地址,映射到应用层的内存空间,这样用户就可以跨越系统层访问linux的硬件设备。 1、man 2 mmap 查看映射函数接口 NAMEmmap, munmap - map or unmap files or devices into memory映射 解除…

I2C驱动(九) -- i2c_adapter控制器驱动框架编写

相关文章 I2C驱动(一) – I2C协议 I2C驱动(二) – SMBus协议 I2C驱动(三) – 驱动中的几个重要结构 I2C驱动(四) – I2C-Tools介绍 I2C驱动(五) – 通用驱动i2c-dev.c分析 I2C驱动(六) – I2C驱动程序模型 I2C驱动(七) – 编写I2C设备驱动之i2c_driver I2C驱动(八) – 编写I2C…

分布式系统核心基石:CAP定理、BASE理论与一致性算法深度解析

一、CAP定理:分布式系统的设计边界 1.1 核心定义与经典三角 CAP定理(Brewers Theorem)指出,在分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性&a…

3 算法1-4 过河卒

题目描述 棋盘上 A 点有一个过河卒,需要走到目标 B 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。 棋盘用坐标表示&#xff…