微服务笔记 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.微服务中要以特定方式读取需要热更新的配置属性。

动态路由

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

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

相关文章

7-1JVMCG垃圾回收

一、GC的作用与原理 ​核心功能​ 自动识别并回收堆内存中不再被引用的对象,释放内存空间。 避免手动管理内存的复杂性(如C/C中的delete/free操作),降低内存泄漏风险。 ​判断对象可回收的方法​ ​可达性分析算法:…

yunedit-post ,api测试比postman更好

postman应该是大家最熟悉的api测试软件了,但是由于它是外国软件,使用它的高端功能注册和缴费都比较麻烦。生成在线文档分享也经常无法访问被拦截掉。 这里可以推荐一下yunedit-post,该有的功能都有。 https://www.yunedit.com/postdetail …

010 rocketmq批量消息

文章目录 批量消息BatchProducer.javaBatchConsumer.java 批量消息 批量发送可以提⾼发送性能,但有⼀定的限制: topic 相同 waitStoreMsgOK 相同 (⾸先我们建设消息的iswaitstoremsgoktrue(默认为true), 如果没有异常,我们将始终收到"O…

6.6.6 嵌入式SQL

文章目录 2个核心问题识别SQL语句主语言和SQL通信完整导图 2个核心问题 SQL语句嵌入高级语言需要解决的2个核心问题是:如何识别嵌入语句?如何让主语言(比如C,C语言)和SQL通信? 识别SQL语句 为了识别主语言中嵌入的SQL…

Windows安装sql server2017

看了下官网的文档,似乎只有ubuntu18.04可以安装,其他debian系的都不行,还有通过docker的方式安装的。 双击进入下载的ISO,点击执行可执行文件,并选择“是” 不要勾选 警告而已,不必理会 至少勾选这两…

RuoYi框架介绍,以及如何基于Python使用RuoYi框架

若依框架(RuoYi)是一款基于Spring Boot和Vue.js的开源快速开发平台,广泛应用于企业级应用开发。它提供了丰富的功能模块和代码生成工具,帮助开发者快速搭建后台管理系统。 主要特点 前后端分离:前端采用Vue.js&#x…

从零搭建Tomcat:深入理解Java Web服务器的工作原理

Tomcat是Java生态中最常用的Web服务器之一,广泛应用于Java Web应用的部署和运行。本文将带你从零开始搭建一个简易的Tomcat服务器,深入理解其工作原理,并通过代码实现一个基本的Servlet容器。 1. Tomcat的基本概念 Tomcat是一个开源的Servl…

京东云DeepSeek-R1模型一键部署教程,基于智算GCS【成本2元】

使用京东云智算一键部署DeepSeek-R1模型,京东云智算服务AI平台GCS支持DeepSeek-R1模型预装环境,支持1.5B、7B、32B及70B参数模型环境,用户可在GCS中快速启动,使用ChatbotUI或者Open-WebUI作为用户界面,进行测试并接入业…

Jenkins 自动打包项目镜像部署到服务器 ---(前端项目)

Jenkins 新增前端项目Job 指定运行的节点 选择部署运行的节点标签,dev标签对应开发环境 节点的远程命令执行配置 jenkins完整流程 配置源码 拉取 Credentials添加 触发远程构建 配置后可以支持远程触发jenkins构建(比如自建的CICD自动化发布平台&…

7.2 - 定时器之计算脉冲宽度实验

文章目录 1 实验任务2 系统框图3 软件设计 1 实验任务 本实验任务是通过CPU私有定时器来计算按键按下的时间长短。 2 系统框图 参见7.1。 3 软件设计 注意事项: 定时器是递减计数的,需要考虑StartCount<EndCount的情况。 /***********…

双机热备旁挂组网实验

1拓扑图 2.要求 1 、 SW3 的流量 正常情况下: SW1_VRF-->FW1--->SW1_Public--->R5 故障情况下: SW2_VRF-->FW2--->SW2_Public--->R6 2 、 SW4 的流量 正常情况下: SW2_VRF-->FW2--->SW2_Public--->R6 故障情…

2025春新生培训数据结构(树,图)

教学目标: 1,清楚什么是树和图,了解基本概念,并且理解其应用场景 2,掌握一种建图(树)方法 3,掌握图的dfs和树的前中后序遍历 例题与习题 2025NENU新生培训(树&#…

HTML 日常开发常用标签

文章目录 HTML 日常开发常用标签1、基本结构标签2、内容标签3、多媒体标签4、表单标签5、列表和定义标签6、表格标签7、链接和图像8、元数据9、语义化标签(HTML5新增)10、框架和内联11、交互12、过时或不推荐使用的标签 HTML 日常开发常用标签 1、基本结…

7.1.1 计算机网络的组成

文章目录 物理组成功能组成工作方式完整导图 物理组成 计算机网络是将分布在不同地域的计算机组织成系统,便于相互之间资源共享、传递信息。 计算机网络的物理组成包括硬件和软件。硬件中包含主机、前端处理器、连接设备、通信线路。软件中包含协议和应用软件。 功…

【AI论文】MedVLM-R1:通过强化学习激励视觉语言模型(VLMs)的医疗推理能力

摘要:推理是推进医学影像分析的关键前沿领域,其中透明度和可信度对于赢得临床医生信任和获得监管批准起着核心作用。尽管医学视觉语言模型(VLMs)在放射学任务中展现出巨大潜力,但大多数现有VLM仅给出最终答案&#xff…

国产RISCV64 也能跑AI

Banana Pi BPI-F3 进控时空 K1开发板 AI人工智能AI 部署工具使用手册_bianbu software-CSDN博客 文章置顶了 有兴趣的可以一起留言探索,非常有意思: 我最近接触到了进迭时空研发的 Spacengine™,这是一套能在进迭时空 RISC-V 系列芯片上部署…

APISIX Dashboard上的配置操作

文章目录 登录配置路由配置消费者创建后端服务项目配置上游再创建一个路由测试 登录 http://192.168.10.101:9000/user/login?redirect%2Fdashboard 根据docker 容器里的指定端口: 配置路由 通过apisix 的API管理接口来创建(此路由,直接…

【WPF】绑定报错:双向绑定需要 Path 或 XPath

背景 最开始使用的是 TextBlock: <ItemsControl ItemsSource"{Binding CameraList}"><ItemsControl.ItemsPanel><ItemsPanelTemplate><StackPanel Orientation"Horizontal"/></ItemsPanelTemplate></ItemsControl.Item…

Kotlin协变与逆变区别

在Kotlin中&#xff0c;协变和逆变是泛型编程中的两个重要概念&#xff0c;它们允许我们在类型系统中更加灵活地处理类型关系。 1.协变&#xff1a;协变允许我们使用比原始类型更具体的类型。在kotlin中&#xff0c;通过在类型参数上加out关键字来表示协变,生产者&#xff0c;例…

如何调试Linux内核?

通过创建一个最小的根文件系统&#xff0c;并使用QEMU和GDB进行调试。 1.准备工作环境 确保系统上安装了所有必要的工具和依赖项。 sudo apt-get update //更新一下软件包 sudo apt-get install build-essential git libncurses-dev bison flex libssl-dev qemu-system-x…