首页/新闻资讯/正文详情

微服务网关和Jwt令牌 入门学习!

发布时间:2026/11/6 6:14:10 来源:云帆数科 栏目:资讯中心
微服务网关和Jwt令牌 入门学习!
微服务网关和Jwt令牌常见面试题为什么需要网关对于微服架构的项目不同的微服务会有不同的网络地址外部客户端可能需要调用多个服务的接口才能完成一个业务需求如果让客户端直接与各个微服务通信会有以下的问题客户端会多次请求不同的微服务增加了客户端的复杂性存在跨域请求在一定场景下处理相对复杂认证复杂每个服务都需要独立认证难以重构随着项目的迭代可能需要重新划分微服务。例如可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信那么重构将会很难实施某些微服务可能使用了防火墙 / 浏览器不友好的协议直接访问会有一定的困难以上这些问题可以借助网关解决。网关的优点• 安全 只有网关系统对外进行暴露微服务可以隐藏在内网通过防火墙保护。• 易于监控。可以在网关收集监控数据并将其推送到外部系统进行分析• 易于认证。可以在网关上进行认证然后再将请求转发到后端的微服务而无须在每个微服务中进行认证。• 减少了客户端与各个微服务之间的交互次数• 易于统一授权。用户权限——网关管理假设一个项目存在很多的角色 不同的角色有不同的权限功能就可以通过网关来进行管理不同的角色给与不同的网关, 网关里管理能够操作的模块…总结微服务网关就是一个系统通过暴露该微服务网关系统方便我们进行相关的鉴权安全控制日志统一处理易于监控的相关功能。JWT讲解什么是JWTJSON Web TokenJWT是一个非常轻巧的规范。(网络应用环境间传递声明而执行的一种基于JSON的开放标准)这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。说起JWT我们应该来谈一谈token的鉴权机制传统的session认证的区别传统的session认证我们知道http协议本身是一种无状态的协议这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证那么下一次请求时用户还要再一次进行用户认证才行因为根据http协议我们并不能知道是哪个用户发出的请求所以为了让我们的应用能识别是哪个用户发出的请求我们只能在服务器存储(Session)一份用户登录的信息这份信息会在响应时传递给浏览器告诉其保存为cookie,以便下次请求时发送给我们的应用;这样我们的应用就能识别请求来自哪个用户了Session 问题Session的数据是保存在 服务器中的…而随着认证用户的增多服务端的开销会明显增大。而且当我们使用了微服务架构...一个功能就是一个模块一个模块就是一个独立的服务器.Session就不能实现在多个模块之间共享数据了token的鉴权机制token的鉴权机制类似于http协议也是无状态的它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了这就为应用的扩展提供了便利。流程上是这样的• 用户使用用户名密码来请求服务器• 服务器通过验证发送给用户一个token• 客户端存储token并在每次请求时附送上这个token值• 服务端验证token值并返回数据你第一次登录成功服务器给你生成一个令牌/身份证(Token)下次在来请求带着令牌来如果没有或错误不允许登录并根据令牌得知你是那个用户这个token必须要在每次请求时传递给服务端它应该保存在请求头里另外服务端要支持CORS(跨来源资源共享)策略一般我们在服务端这么做就可以了因为 Jwt 可以搭配 Secret密钥, 来进行解密, 不同微服模块就可以通过解码来获得对应的用户信息(存储信息)JWT的构成一个JWT实际上就是一个字符串逗号分隔它由三部分组成:头部载荷签证。头部Header头部用于描述关于该JWT的最基本的信息例如其类型以及签名所用的算法等。一般被表示成一个JSON对象。一般默认为一般不需要用户自定义,程序默认{typ:JWT,alg:HS256}//头部指明了签名算法是HS256算法;之后会进行BASE64编码http://base64.xpcha.com/编码后的字符串如下eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9 #这就是通常JWT的头部.存放着签名的算法信息载荷payload载荷就是存放有效信息的地方。(用户名/密码/…. 重要信息的地方,进行加密)一般由开发者编写一般包括以下部分或存储一些重要的信息用户信息..iss: jwt签发者 sub: jwt所面向的用户 aud: 接收jwt的一方 exp: jwt的过期时间这个过期时间必须要大于签发时间 nbf: 定义在什么时间之前该jwt都是不可用的. iat: jwt的签发时间 jti: jwt的唯一身份标识主要用来作为一次性token,从而回避重放攻击。比如下面这个 Payload使用了 sub 还有两个开发者自定义的字段这里就像一个存储重要信息的仓库.{sub:1234567890,name:John Doe,admin:true}//sub 通常表示用户id//name 用户名//admin 是否管理员base64加密得到Jwt的第二部分eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9签证signaturejwt的第三部分是一个签证信息这个签证信息由三部分组成第一部分hader头部的加密eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9第二部分palyload的加密 eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9第三部分Secret 这个相当于是一个密码这个密码秘密地存储在服务端。先是用 Base64 编码的 header.payload(headerpayload)再用加密算法加密一下加密的时候要放进去一个 Secret//(headerpayload)加密信息合并var encodedString base64UrlEncode(header) “.” base64UrlEncode(payload);// HMACSHA256加密算法加密(haeder中指定的加密算法), 并加密过程附带一个 Secret密钥HMACSHA256(encodedString, ‘secret’);处理完成以后看起来像这样TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ这就是 signature;此时已经有了三段密文了, 最后在将三段密文合并在一起,三者之间通过.点来间隔区分…就形成了 JWTeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ注意secret是保存在服务器端的jwt的签发生成也是在服务器端的secret就是用来进行jwt的签发和jwt的验证所以它就是你服务端的私钥在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。Jwt的验证流程① 在头部信息中声明加密算法和常量 然后把header使用json转化为字符串② 在载荷中声明用户信息同时还有一些其他的内容再次使用json 把载荷部分进行转化转化为字符串③ 使用在header中声明的加密算法和每个项目随机生成的secret来进行加密把第一步分字符串和第二部分的字符串进行加密 生成新的字符串。词字符串是独一无二的。④ 解密的时候只要客户端带着JWT来发起请求服务端就直接使用secret进行解密。JWT Demo测试上面的模块其实无伤大雅…最关键的就是pom依赖和TestJWT.Java引入 jjwt 依赖pom.xmldependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt/artifactIdversion0.9.0/version/dependency创建测试DemoTestJWT.Javapackagecom.wsm.jwt;importio.jsonwebtoken.Claims;importio.jsonwebtoken.JwtBuilder;importio.jsonwebtoken.Jwts;importio.jsonwebtoken.SignatureAlgorithm;importjava.util.Date;//JWT 测试类publicclassTestJWT{publicstaticvoidmain(String[]args){//打印: 创建的JWTStringjwtcreateToken();System.out.println(jwt);System.out.println(---------------------------------------------------------------------------------------);//打印: JWT的解析数据System.out.println(getToken(jwt));}//创建 JWTpublicstaticStringcreateToken(){JwtBuilderjwtJwts.builder().setId(110)//设置唯一编号.setSubject({id:1,name:张三})//设置主题,可以是JSON数据(一般是要存储的用户信息).setIssuedAt(newDate())//设置签发日期.signWith(SignatureAlgorithm.HS256,xzzb);//设置签名 使用HS256算法并设置SecretKey(字符串)Stringcompactjwt.compact();//生成 JWT;returncompact;}//解析 JWTpublicstaticStringgetToken(Stringtoken){//调用 Jwts.parser(); 方法完成解析;ClaimsxzzbJwts.parser().setSigningKey(xzzb)//明确Secret 解析私钥;.parseClaimsJws(token)//要解析的Token;.getBody();//JSON 格式;returnxzzb.toString();//返回}}测试运行 main类中存在两个方法createToken()getToken()创建/解决JWT多次运行发现每次运行的Token 都不一样因为生成Jwt 里面加了时间但, 发现了我们可以, 根据Secret密钥和JWT Token又一次获得数据…扩JWT 可以定义自定义claims我们刚才的例子只是存储了id和subject两个信息如果你想存储更多的信息例如角色可以定义自定义claims。通过JwtBuilder jwtBuilder Jwts.builder();jwtBuilder.addClaims(Map);//可以存储自定义Map 类型数据存储编码JWT 网关模拟用户登录基于上面。JWT Demo我们可以实现自定义jwt 的 Token 并对其进行解码思路分析1.用户通过访问微服务网关调用微服务同时携带头文件信息: (Token)2.在微服务网关这里进行拦截拦截后获取用户要访问的路径3.识别用户访问的路径是否需要登录有些操作不用登录也可以访问, 京东的查看商品... 这种请求一般直接放行如果需要识别用户的身份是否能访问该路径[这里可以基于数据库设计一套权限]如果需要权限访问用户已经登录则放行。如果需要权限访问且用户未登录则提示用户需要登录。5.用户通过网关访问用户微服务进行登录验证6.验证通过后用户微服务会颁发一个令牌给网关网关会将用户信息封装到头文件中并响应用户7.用户下次访问携带头文件中的令牌信息即可识别是否登录生成令牌工具类为了方便操作这里提供了一个便于快速生成 JWT的工具类JwtUtil.Java一般定义在公共的 api模块中, 注意需要引入pom.xml依赖哦服务模块引用 api 模块JwtUtil.Javaimportio.jsonwebtoken.Claims;importio.jsonwebtoken.JwtBuilder;importio.jsonwebtoken.Jwts;importio.jsonwebtoken.SignatureAlgorithm;importjavax.crypto.SecretKey;importjavax.crypto.spec.SecretKeySpec;importjava.util.Base64;importjava.util.Date;publicclassJwtUtil{//有效期为publicstaticfinalLongJWT_TTL3600000L;// 60 * 60 *1000 一个小时//Jwt令牌信息publicstaticfinalStringJWT_KEYxzzb;/** * 生成加密 secretKey * * return */publicstaticSecretKeygeneralKey(){byte[]encodedKeyBase64.getEncoder().encode(JwtUtil.JWT_KEY.getBytes());SecretKeykeynewSecretKeySpec(encodedKey,0,encodedKey.length,AES);returnkey;}/** * * param id jwt 唯一id * param subject 设置主题,可以是JSON数据(一般是要存储的用户信息) * param ttlMillis 设置过期时间....毫秒 * return */publicstaticStringcreateJWT(Stringid,Stringsubject,LongttlMillis){//指定算法SignatureAlgorithmsignatureAlgorithmSignatureAlgorithm.HS256;//当前系统时间longnowMillisSystem.currentTimeMillis();//令牌签发时间DatenownewDate(nowMillis);//如果令牌有效期为null则默认设置有效期1小时if(ttlMillisnull){ttlMillisJwtUtil.JWT_TTL;}//令牌过期时间设置longexpMillisnowMillisttlMillis;DateexpDatenewDate(expMillis);//生成秘钥SecretKeysecretKeygeneralKey();//封装Jwt令牌信息JwtBuilderbuilderJwts.builder().setId(id)//唯一的ID.setSubject(subject)// 主题 可以是JSON数据.setIssuer(admin)// 签发者.setIssuedAt(now)// 签发时间.signWith(signatureAlgorithm,secretKey)// 签名算法以及密匙.setExpiration(expDate);// 设置过期时间returnbuilder.compact();}/** * 解析令牌数据 * * param jwt * return * throws Exception */publicstaticClaimsparseJWT(Stringjwt)throwsException{SecretKeysecretKeygeneralKey();returnJwts.parser().setSigningKey(secretKey).parseClaimsJws(jwt).getBody();}}其中包含三个方法生成密钥Secret生成jwt解析jwt用户微服务模块 common_userService这里就是主要完成登录的操作了这次没有用户类就直接使用 map了...的小案例了如果是接着上面项目做的建议把Token限流给关了用户sericeUserService.Java/** * param name 用户名 * param pwd 密码 * return */publicHashMapString,ObjectuserLogin(Stringname,Stringpwd){//登录if(name.equals(admin)pwd.equals(123)){HashMapString,ObjectusernewHashMap();user.put(id,1);user.put(username,name);user.put(passwd,pwd);returnuser;}returnnull;}controllerUserController.Java//执行登录方法PostMapping(/login)publicHashMapString,Objectlogin(Stringname,Stringpwd){HashMapString,ObjectuseruserService.userLogin(name,pwd);if(user!null){StringjwtJwtUtil.createJWT(UUID.randomUUID().toString(),JSON.toJSONString(user),null);HashMapString,ObjectresultnewHashMap();result.put(code,1001);result.put(token,jwt);returnresult;}returnnull;}网关微服模块 gateway_server修改TokenFitter.Javaimportcom.wsm.jwt.JwtUtil;importio.jsonwebtoken.Claims;importlombok.extern.slf4j.Slf4j;importorg.springframework.cloud.gateway.filter.GatewayFilterChain;importorg.springframework.cloud.gateway.filter.GlobalFilter;importorg.springframework.core.Ordered;importorg.springframework.http.HttpStatus;importorg.springframework.http.server.reactive.ServerHttpRequest;importorg.springframework.http.server.reactive.ServerHttpResponse;importorg.springframework.stereotype.Component;importorg.apache.commons.lang.StringUtils;importorg.springframework.web.server.ServerWebExchange;importreactor.core.publisher.Mono;//Gate way实现过滤器:ComponentSlf4jpublicclassTokenFitterimplementsGlobalFilter,Ordered{//自定义过滤器类 实现GlobalFilter Ordered接口并实现两个方法;OverridepublicMonoVoidfilter(ServerWebExchangeexchange,GatewayFilterChainchain){//获取request responseServerHttpRequestrequestexchange.getRequest();ServerHttpResponseresponseexchange.getResponse();//获取请求url 打印Stringpathrequest.getURI().getPath();System.out.println(path);//判断请求... 对于请求 /user/login /api/address/get 这请求网关可以直接放行...//对于一些操作本身就是不登录也可也访问... 登录请求当然直接放行,本身就是登录才有Token 不登录那里来Token 放行!if(path.startsWith(/user/login)||path.startsWith(/api/address/get)){System.out.println(Token登录 网关同行);returnchain.filter(exchange);}//获取请求中的Token 从请求头中获取TokenStringtokenrequest.getHeaders().getFirst(token);//不存在 则从请求中查找, 有没有Tokenif(StringUtils.isEmpty(token)){tokenrequest.getQueryParams().getFirst(token);}//还不存在则,拦截器拦截if(StringUtils.isEmpty(token)){response.setStatusCode(HttpStatus.UNAUTHORIZED);returnresponse.setComplete();}try{//验证Token 是否存在/合法...ClaimsclaimsJwtUtil.parseJWT(token);//不合法出现异常,也直接请求拦截}catch(Exceptione){response.setStatusCode(HttpStatus.UNAUTHORIZED);returnresponse.setComplete();}//以上都成立, 放行returnchain.filter(exchange);}//过滤顺序级别OverridepublicintgetOrder(){return0;}}结合网关的过滤器进行 微服网关 Token的操作执行…测试Base64为了确保http 数据传递安全, 对数据进行加密传递的一种编码/解码技术BASE64 存在解码所有并不安全所以后面又存在一个 加盐的操作 二次加密/多次加密连续多次加密欧克, 终于写完了。。。 上面一系列的操作都来源一个项目SpringCloudBJ

相关推荐

工业相机SDK开发必知:图像格式解析与转换指南
工业相机SDK开发必知:图像格式解析与转换指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 6:13:10

STM32CubeMX 6.14安装避坑指南:JDK 17与路径规范
STM32CubeMX 6.14安装避坑指南:JDK 17与路径规范

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 6:13:10

I2C多主机仲裁与时钟延展:从原理到调试的完整指南
I2C多主机仲裁与时钟延展:从原理到调试的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 6:13:10

项目周期管理:工作日计数与日期戳编号系统设计
项目周期管理:工作日计数与日期戳编号系统设计

1. 项目背景解析"Day27-20260123"这个看似简单的编号背后,实际上隐藏着一个完整的项目周期管理方法论。作为一名长期跟踪技术项目管理的从业者,我见过太多团队在项目记录和版本控制上栽跟头。这个编号系统完美融合了时间标记和序列管理&#x… · 2026/11/6 7:03:25

Decoder结构详解:掩码自注意力、交叉注意力与KV Cache
Decoder结构详解:掩码自注意力、交叉注意力与KV Cache

1. 从“复制粘贴”的误解说起:Decoder 到底在解什么写这个系列写到第五篇,前面把词嵌入、位置编码、多头注意力、Encoder 结构都拆完了,很多人到这里会有个错觉:Decoder 不就是把 Encoder 复制六层,中间再加一层注意力… · 2026/11/6 7:03:25

从零实现TCP服务器:网络编程核心原理与实践
从零实现TCP服务器:网络编程核心原理与实践

1. 手写TCP服务器的核心价值与适用场景在当今这个充斥着各种高级框架和现成组件的时代,为什么我们还需要从零开始手写TCP服务器?作为一名经历过多个网络项目的老兵,我可以明确告诉你:理解TCP服务器的底层实现,是成为真… · 2026/11/6 7:03:25

企业级网卡绑定技术详解与最佳实践
企业级网卡绑定技术详解与最佳实践

1. 网卡绑定技术概述在现代企业网络架构中,网卡绑定(NIC Teaming)是一项基础但至关重要的技术。简单来说,它就像给服务器装上了多条网络"腿",让数据流量可以分散在不同物理线路上传输。我在实际运维中发现&a… · 2026/11/6 7:03:25

RedisJSON模块编译安装与生产部署指南
RedisJSON模块编译安装与生产部署指南

1. RedisJSON 模块概述RedisJSON 是 Redis 官方维护的一个高性能 JSON 数据处理模块,它允许 Redis 原生支持 JSON 格式数据的存储和操作。作为 Redis Stack 的重要组成部分,这个模块通过扩展 Redis 命令集的方式,为开发者提供了完整的 JSON 操… · 2026/11/6 7:03:25

Kubernetes集群成本与适用性深度解析
Kubernetes集群成本与适用性深度解析

1. Kubernetes集群的成本真相:从技术炫技到商业考量第一次接触Kubernetes时,大多数团队都会被其强大的容器编排能力所吸引。但很少有人真正计算过,维护一个生产级Kubernetes集群需要投入多少隐性成本。让我们拆解一个典型的中小型企业集群配置… · 2026/11/6 7:02:25

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07

三菱PLC数据采集到数据库的时序设计:Python+MC协议实战
三菱PLC数据采集到数据库的时序设计:Python+MC协议实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:02:11

ASIC主模式RTL设计:状态机与三态驱动的流片级实现
ASIC主模式RTL设计:状态机与三态驱动的流片级实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:02:11

STM32嵌入式C++开发:GDB调试与Renode仿真实战指南
STM32嵌入式C++开发:GDB调试与Renode仿真实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:02:11

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码