Skip to content

微服务构架分布式事务seata+ oauth2 jwt+gateway+nacos+micro service oauth2 jwt rsa,scope的使用;分布式锁,更简洁的jwt 客户端认证方式,鉴权 限流 负载均衡、请求监视、retry ;feign robin;文件分片续传;读写分离;

License

Notifications You must be signed in to change notification settings

li-bx/gateway-load-balance-oauth2-jwt-microservice-current-limiting-mybatisplus

Repository files navigation

介绍 微服务架构 多企业 多应用 基础平台 微服务分布式事务

1、统一认证,OATH2.0,4种模式.;jwt rsa ;更简洁的jwt client方式;
2、微服务分布式锁、分布式事物、rsa动态密钥、nacos 服务发现、redis缓存、rabitmq数据分发、 mongodb日志;
3、网关gateway,集中鉴权、限流、负载均衡、请求监视、retry,性能日志,uri扫描、权限配置,功能菜单配置;url鉴权服务剥离,敏感数据传输加密;
4、子服务基础模板,更具独立性易用性,只专注于业务实现。通过设计便于业务数据读写分离;
5、各个子系统模块以需部署,调整部署的实例数。
6、数据库主从、连接池、缓存;
7、文件分片上传和分片下载;
8、服务监视&心跳,运维监视;

软件架构

1632637500(1)

基础数据模型

image

基础url

image image image

安装

安装数据库:脚本user-center.sql 和 patrol.sql
自行安装nacos,网上很多。新建空project,导入各个module,如下:共6个 image global libraries里添加上libs目录下的common-0.0.1-SNAPSHOT.jar, 这是已经package的common项目 image 分别配置上正确的 cloud discovery 地址: image 注意配置中心,可以把active:online,改成本地的。注意file-extension: yaml 要和nacos配置对应。 image 启动五个应用 image image 小技巧: 显示rundashboard,方便管理启动多个应用。 idea目录下找到workspace.xml, 增加配置: image 也可以package后,启动都给微服务进行测试:例如命令: java -jar microservice-0.0.1-SNAPSHOT.jar --server.port=8085 指定不同的port,启动多个

脚本使用说明

postman 导入gateway&oauth2&microservice-testing.postman_collection.json image 注意:授权码模式的两个url需要放到浏览器中访问。根据postman中的请求列表,开始你的访问吧

ui

请根据api说明,自主选择开发。

系统若干技术问题:

1、mvn问题,gateway和spring boot 的版本注意匹配问题。 oauth和spring boot版本匹配问题;不匹配可能会有异常发生。 cloud最好选择dependencyManagement方式,避免自己指定version时发送不兼容。

2、gateway只引用了security-jwt;没有引用oauth2-autoconfigure; 引入会异常,只借用了解析jwt的JwtHelper class而已,也是看源码揣摩的,开始是自己写jwt工具比较麻烦。

3、auserver里面使用自定义jwt和自定义登录以及授权页面时,scope失效,不能正常传递;这里重写了DefaultOAuth2RequestFactory ,处理授权时scope没有正确处理的问题。

4、重写MyBCryptPasswordEncoder,处理前端传递密码解密,安全问题。

注意里面的这些todo,实际应用都需要自己修改的地方: image token验证后,uri的访问验证,采用了访问auservice方式。注意这里使用了RestTemplate直接访问的;

6、hystrix 熔断 timeout和readtimeout,注意区别;熔断未超时,读取超时,会采用retry策略重试。

7、网关里面ribbon的策略配置有效,其它如timeout,MaxAutoRetries配置无效,这些配置在gateway里利用metadata和filter实现,

image 8、gateway filter设置顺序,我设置的是:限流Bucket4jGlobalGatewayFilter-》TimeCostGlobalGatewayFilter-》CheckAuthGlobalGatewayFilter(认证和鉴权) DealGatewayFilter用来测试

9、反漏洞限流模式很好的处理突变量访问问题,处理限流、熔断来保证系统可用性;一般系统更多的性能问题还是卡在自身的数据处理上,逻辑不合理造成耗时,数据结构不合理、数据库相关处理,数据量、索引,查询sql效率等。
10、数据返回,做成了一个common基础包,供各个服务项目引用,比较统一,注意启动scan配置@SpringBootApplication(scanBasePackages={"com.hd.microservice","com.hd.common.conf"}),加上common.conf包的扫描。
11、log写入mongo db,一定记得去掉spring-boot-devtools, 由于classloader不同造成UnsynchronizedAppenderBase获取 applicationContext失败,进而无法写入mongodb。
12、auservice增加swagger2,注意 beforeBodyWrite的返回值处理,不能全部返回RetResult类型,会造成swagger页面访问失败 image 13、增加uri 扫描类ApiUtils,备以后将uri及对象permission 字符串写入数据库,用来进行uri授权。 注意里面:需要扫描的controller都要使用@RequestMapping注解, method使用:PostMapping 、 GetMapping 、PutMapping 、DeleteMapping ,不能使用RequestMapping注解, 否则ApiUtils扫描会出错;保持一个method只有一个uri路径;扫描到结果如图:

image
14、MyUserDetailService使用了HttpServletRequest的注入,注意这里是代理模式,每个请求过来,注入的都是该请求对应的request;利用历史请求DefaultSavedRequest获取企业code,实现sas模式。
image 15、auserve拦截异常的坑,RestControllerAdvice里面如果捕获了InsufficientAuthenticationException,请不要返回错误,继续抛出异常,交由oauth处理,否则请求授权码模式到不了登录页面
image 16、json Long型转化,记得添加@JSONField(serializeUsing = LongToStringSerializer.class); 否则js端会值会异常 ,mybatis的 worker-id: datacenter-id: 配置注意不要重复,避免分布式id产生重复
image 17、favicon.ico 记得增加如下配置
image 18、启动tokeninfo认证时,swagger的请求需要排除
image 19、关于超时
尽量不要使用synchronized,防止大并发是阻塞线程;使用分布式锁时注意:timeout的设置,大于执行块可能需要的最大时间,否则锁失效造成异常
20、自定义统用分页查询 ,继承SuperQueryController后,可根据情况在查询前调用adaptiveQueryColumn来调整前端和后端的数据库字段差异
image 注意get 请求是一定要把参数encode下:query: { "pageNum": 2,"pageSize": 2,queryData:[{column:"name",value:"xx",type:"like" },{column:"note",value:"nnn",type:"ne"}],orderby:[{key:"id",value:"asc"},{key:"name",value:"desc"}]} 21、增加动态rsa非对称加密和定时跟新密钥文件
22、缓存增加设置不同分类的过期时间
23、权限过滤,url使用AntPathMatcher进行匹配检索
24、增加文档断点上传和下载
image 25、服务监视 image image 定时心跳的方式 image

26、gateway 使用 feign的异常解决。 NotReactiveWebApplicationCondition这个conditional造成HttpMessageConvertersAutoConfiguration没有注入。 image gate way 调用 feign失败,HttpMessageConvertersAutoConfiguration的NotReactiveWebApplicationCondition条件造成没有自动注入
增加配置:
@Configuration public class FeignConfig { @Bean @ConditionalOnMissingBean public HttpMessageConverters messageConverters(ObjectProvider<HttpMessageConverter<?>> converters) { return new HttpMessageConverters(converters.orderedStream().collect(Collectors.toList())); } }
27、关于modules下spring 的配置,这里配置只是为了在idea里面查看方便,并没有分配多个application context容器。 image
28、分布式事物seata AT模式 配置
pom,注意版本: com.alibaba.cloud spring-cloud-alibaba-seata io.seata seata-spring-boot-starter 2.2.0.RELEASE io.seata seata-spring-boot-starter com.alibaba druid 1.4.2
yml: 注意:tx-service-group: usercenter_tx_group 和nacos配置中心保持一致,另外seata不要出现registry等节点配置,会造成分布式事物失效 seata: enabled: true application-id: ${spring.application.name} tx-service-group: usercenter_tx_group #此处配置自定义的seata事务分组名称 config: type: nacos nacos: serverAddr: 127.0.0.1:8848 group: SEATA_GROUP 关于seata1.4.2和oauth2集成错误:ClientDetailsService java.lang.UnsupportedOperationException错误,是由于GlobalTransactionScanner检查ClientDetailsService是否需要代理增强时造成的@Lazy造成监察时还没初始化。解决方法1降低seata版本到1.4.0;解决方法2:暴力覆盖bean ClientDetailsService. image seata: 对应几乎没有并发量的接口使用seata比较合适,省力。对有并发需求的接口,不要启用全局事务;因为启用事务后,seata的事务管理模式造成效率低下,实测200ms的请求,启动事务后,变成5-10倍的耗时。所以对于并发接口还是根据业务情形自行进行数据一致性管理。
29、gateway 动态路由配置类Redisroutedefinitionwriter ,注意retry的配置
1635503631(1)
30、动态rsa密钥加密敏感数据,密码等。 注意rsa每次密文生成都不会一样,这是正确的,因为Cipher.getInstance("RSA");默认使用的BouncyCastle 填充造成。如果想每次密文一样,可以使用cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());设置;
31、请求转发,真实ip的获取配置:
nginx:
image
网关和服务:
image
32、远程调试--- 方便在线分析问题
启动:java -jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 micromonitorservice-0.0.1-SNAPSHOT.jar --server.port=20088 idea配置:Edit configurations,点击+号,创建一个Remote应用,写入ip和port即可
33、gateway通过x-real-ip解决日志中源ip转发后变化的问题
ServerHttpRequest request = exchange.getRequest().mutate().header("X-Real-IP",ip).build(); ServerWebExchange buildExchange = exchange.mutate().request(request).build();

About

微服务构架分布式事务seata+ oauth2 jwt+gateway+nacos+micro service oauth2 jwt rsa,scope的使用;分布式锁,更简洁的jwt 客户端认证方式,鉴权 限流 负载均衡、请求监视、retry ;feign robin;文件分片续传;读写分离;

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages