自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

原创 SpringCloud系列教程(十四):Sentinel持久化

Sentinel之前已经搭建和应用成功了,但是它有一个很大的缺点就是官方没有提供持久化的方案,从项目源码上看感觉这款工具也没有完成的太好,所以需要我们去对它进行二次开发。要补充的功能大概如下:1、将Sentinel接入nacos中,sentinel从nacos上进行参数读写。2、使用sentinel的客户端开启nacos,可以读取nacos上关于sentinel的配置参数。

2025-03-15 22:08:05 1339

原创 SpringCloud系列教程(十三):Sentinel流量控制

熔断就是在服务出现亚健康情况时,减少流量进入,从而尽可能的让客户的使用不受影响,如果服务彻底失效,那么流量就完全不再分配给故障节点,但是有时候过一段时间故障节点会自己恢复,所以我们还要能过一段时间把恢复正常的节点纳入进来。1、搭建Sentinel非常简单,下载jar文件,直接运行就可以了,Sentinel不用搞什么集群模式,因为它不参与业务功能,即使宕机了也不影响业务的正常运转,具体说其实就是一个配置管理中心。7、熔断,就是对服务亚健康状态时的减少流量,如果宕机,就彻底不分配流量。

2025-03-06 21:06:22 488

原创 SpringCloud系列教程(十二):网关配置动态路由

1、将原来写在application.yml中的路由配置信息迁移到nacos上,dataId定义为gateway-routes,这里要注意,原来在项目中yml文件解析的时候,会被SpringCloud层层解析后生成RouteDefinition,在这期间SpringCloud会去解析比如Path=/api/*这种形式,但是现在我们要自己解析,就要改成符合RouteDefinition的完全形式,这是一个小难点。如果debug能发现监听器被调用了,日志也会打印,再调用接口就已经404了。

2025-03-04 22:14:03 721

原创 SpringCloud系列教程(十一):token验证

之前我们完成了gateway传递token到微服务中,但是这还不够,因为有时候我们微服务是一个调用链路,每个微服务的请求可以来自于网关也可以来自于其他微服务,我们只完成了gateway传递token,还没有完成微服务之间使用openfeign发送请求时的token传递。修改主启动类,把common里的config类扫描进去。可见返回结果页正确解析到了userId,这样我们就基本完成了token在微服务体系中的传递功能,当然在日常工作中还会有其他的做法,万变不离其宗,大家就按照咱们练习的样子去改造就可以了。

2025-03-02 00:12:11 377

原创 SpringCloud系列教程(十):token验证

6、这样任何需要用common的module只要把它当做依赖引入项目里就可以了,我们把跟common重复的那些类文件删掉,这里注意,我们在nacos-client-demo项目里使用的JwtConfig文件本来是自动注入的,但是由于提取到了common中,就不会自动注入了,所以我们在nacos-client-demo的启动类上添加扫描的包名,从而把common中的也扫进去,gateway-demo不需要加,因为它不需要,所以common中的拦截器和config就被自动忽略。

2025-03-01 23:14:05 484

原创 SpringCloud系列教程(九):token验证

我们在写网关代码的时候,一定要注意,网关服务尽量简单高效,否则将拖垮整个微服务集群,如果要写逻辑,就要详细测试每一行代码的运行效率,尽量保持在1-2ms内,压力大时,增加网关服务的数量,注意服务间尽量能做到无状态。如果是login接口,那么直接放行,其余的接口,需要从header中获取token并且解析出userId打印日志,没有token则返回401。网关代码里的逻辑一般都是对http的验证,不同的服务会有不同的验证规则,我们就以token为例,完成一个网关服务的token验证的demo。

2025-02-28 23:27:18 369

原创 SpringCloud系列教程(八):服务网关Gateway

继承GlobalFilter这个接口就会重写一下它的filter方法,这个方法有两个参数,第一个参数就是http调用对象,从里面我们可以获取到所有的http信息,用来进行我们的逻辑判断,第二个参数是filter链,表示当前filter只是gateway中所有filter链路的一个节点而已,当我们写完逻辑后,要把当前filter扔回链路中,否则请求就中断了。另外我们还缺少一个很重要的配置就是路由过滤器filter,它是用来对网关获取到的http请求做一些操作的,比如判断请求时间,判断请求路径等。

2025-02-27 21:57:41 1162

原创 SpringCloud系列教程(七):服务网关Gateway

之前我们已经完成了微服务模块的调用,如果我们的项目有一个web页面,那么我们就要有一个统一的地址提供给前端,要不然一个个微服务的地址不仅很乱,而且也不安全,所以我们要把其中一个服务做成整体微服务的入口,这个服务就是Gateway。随着现在项目的架构结构越来越复杂,Gateway也承担起来很多工作,比如对http请求的验证,在网关层做校验就非常的方便,同时我们也要注意,网关层的响应一定要足够的快,否则它会拖垮整个微服务集群。2、修改application.yml,给项目url统一加一层context。

2025-02-26 03:15:00 387

原创 SpringCloud系列教程(六):Http客户端利器OpenFeign

openfeign的基本功能都已经介绍过了,更换了http框架之后更是如虎添翼,但是同时openfeign也存在着一些缺点,这一节重点介绍两个,一是日志默认是不打印的,二是需要添超时时间配置。我们也许从网上能搜到很多关于openfeign的配置,不过我查了许久发现大多数都已经不支持了,所以通过我的摸索,我总结出了这样一个方式去实现日志打印和设置超时时间。

2025-02-25 00:15:00 355

原创 SpringCloud系列教程(五):Http客户端利器OpenFeign

上一节我们完成了openfeign的初步接口调用,感觉这真的是一个非常强大的客户端工具,但是呢,先不要太骄傲哦,任何一个工具的使用都是要有漫长的过程积累的,需要长时间的打磨才能获得最好的使用效果。1、我们打一个断点,查看一下client对象,发现是一个代理类,它的真身是FeignInvocationHandler,是位于feign-core这个jar下的ReflectiveFeign这个类下的一个内部类,它有一个invoke方法是真正执行逻辑。5、修改pom文件,添加Feign对okhttp的依赖。

2025-02-24 01:30:00 563

原创 SpringCloud系列教程(四):Http客户端利器OpenFeign

上一节介绍Nacos的时候,我们通过nacos-client-demo这个项目里的两个接口互相调用,验证了通过使用Nacos注册中心的注册发现功能,在不指定ip和端口号的情况下,仅通过服务名称来进行服务的调用,这就是微服务的一个主要功能。通过@GetMapping("/call")把方法指向了调用/call这个接口,我们发现这个注解太像接口上的注解了,所以Feign最大的功能就是把调用接口和实现接口的代码搞成一模一样的,这样我们写代码就太方便了。6、写一个测试接口,调用一下试试吧。

2025-02-23 20:31:07 483

原创 SpringCloud系列教程(三):注册中心Nacos

1、创建命名空间sit,表示这里面的配置应于sit环境。2、在sit这个命名空间下添加配置参数。3、修改代码中的application.yaml。spring:cloud:nacos:# nacos的地址,集群形式添加多个地址# nacos的账号# nacos的密码discovery:config:config:import:# 指定是使用user为dataId4、修改代码ApiController,读取配置数据。//实现nacos配置自动更新。

2025-02-22 00:51:58 394

原创 SpringCloud系列教程(二):注册中心Nacos

在新版的Nacos里,数据交互的方式加入了grpc,所以在每个Nacos服务节点都会开启grpc的端口号,Nacos客户端就是通过grpc和Nacos集群交互数据的,所以我们还要在nginx里开启对grpc的负载均衡支持。Nacos不仅有注册发现的作用,而且它还具备配置中心的功能,在微服务的概念里,注册中心和配置中心是两个重要的组成部分,Nacos自己就把这两部分都同时完成了,非常的节省公司资源,之前我们曾经使用过Eureka做为注册中心,Apollo作为配置中心,用起来也很不错,不过就要维护两套工具了。

2025-02-21 18:28:25 941

原创 SpringCloud系列教程(一):注册中心Nacos

目前开源的注册中心框架有很多,国内比较常见的有:Eureka:Netflix公司出品,目前被集成在SpringCloud当中,一般用于]ava应用。Nacos:Alibaba公司出品,目前被集成在SpringCloudAlibaba中,一般用于Java应用。Consul:HashiCorp公司出品,目前集成在SPringCloud中,不限制微服务语言。

2025-02-20 16:44:42 730

原创 SpringBoot+MyBatis-Plus使用教程(十)

10、至此,我们已经把分页查询的封装都做完了,代码结构也基本清晰了,但是我们还能进一步的进行封装,比如我们这些dto,vo,po之间转来转去的看起来就很麻烦,所以我们可以再封装一下,把这些转换放到类里,这样UserServiceImpl中就会很清爽。2、修改一下UserController中的批量查询接口,之前没有添加分页,每次查询都把整个表的数据都查出来了,这是非常不专业的,所以我们改造一下,让它能分页查询,每次只返回10条数据。6、创建一个PageDTO类,作为微服务之间传递参数的一个分页查询模板类。

2025-02-18 23:07:00 347

原创 SpringBoot+MyBatis-Plus使用教程(九)

在平时的业务开发中,通常我们会遇到两个场景,一个就是用户状态,比如银行卡长期不用就会被设置成休眠状态,另外一个场景就是会存一个json格式的字符串。说到这里,可能有同学就会疑惑了,因为按照面试八股文来说,数据库设计的第一范式就是要求我们字段不能再分解,我们应该做关联表设计,不过为啥这是八股文,就是因为理论再好不适合业务也不行啊。7、查询接口不怎么需要改了,添加用户的时候需要改改,要不然都是null,这样查出来的结果都可以很好的返给前端了,这个功能我觉得就是给前端人员准备的。

2025-02-18 15:37:50 312

原创 SpringBoot+MyBatis-Plus使用教程(八)

但是在实际生产中,我们为了完成一个复杂功能,经常需要同时从多个表里查询数据,这时候我们的Service层就不会像规划的那样清晰了,要不把综合查询方法写在一个主要的Service中,要不就单独开辟一套流程模板。按照DDD的思想,这两种其实都不是太好,领域界限不够清晰了,从技术层面上讲,springboot中的多个Service也出现了互相引用导致的循环注入问题,就是几个Service中都有对象的@Autowired。1、创建一个新的类Project,对应新表。

2025-02-13 00:06:53 306

原创 SpringBoot+MyBatis-Plus使用教程(七)

预编译就是对sql的语句的一次装载,只要sql不变,那么就能一直使用这条sql,这也是能解决sql注入问题的关键,因为当你写好sql并预编译后,如果sql注入了就等于改变了sql就会再次触发预编译。实际工作中,可以多测试一下,看看一批是多少合适,另外这里还有一个难点问题,咱们demo中的user表主键id是自增的,而实际工作中,可能会用到自定义id的情况,经常使用雪花算法来生成id,但是这时候就会遇到id冲突的情况,所以id的生成也是一个很麻烦的事情,要多结合实际情况来避免出现逐渐冲突。

2025-02-10 00:00:25 189

原创 SpringBoot+MyBatis-Plus使用教程(六)

继续IService的内容,之前我们了解了Wrapper可以使用Lambda的方式,同样在IService里也可以使用Lambda的方式,纵观各个编程语言,这种流式的写法都十分的推崇,在Lambda的底层使用了并发编程,效率会更高,我猜这种写法是来受大数据里的MapReduce影响的。我们写api接口的时候,尽量还是传参用对象,为什么呢,因为这样可以提供一定的安全性,一定程度上防止接口被非法调用,方法和方法之间也尽量使用对象,这是java推荐多使用封装的原因。

2025-02-09 22:24:36 174

原创 SpringBoot+MyBatis-Plus使用教程(五)

3、如果@Transactional方法里数据库操作正好在当前类的另外一个方法里,也不生效,因为调用当前类的方法是直接用了this,绕过了AOP。(感觉这个解释真八股啊。MyBatis-Plus操作基本就给大家介绍几个就行,大概用法都差不多,一个跑通了,其他的也就都一样,但是在完成业务功能的时候,多去思考如何更好的把IService中的方法混合使用,除了CRUDB(增查改删批)之外,还有一个重要的课题就是事务,面试的时候事务经常会被问到,多准备准备八股文,这一节用两种方式去使用事务。

2025-02-05 22:46:04 248

原创 SpringBoot+MyBatis-Plus使用教程(四)

IService是MyBatis-Plus在mapper基础上继续做的封装,看这个名字就不难想到,这里面的方法更接近于实际业务功能使用,比如按照id查找对象,批量插入,批量更新,分页等,所以我们实际工作中,多数都是跟这个interface打交道,而不会直接从api直接调用mapper。但是提醒大家的是,这种封装架构方式是java的特点,很多同学还会使用Golang语言,Golang语言就特别追求直来直去,恨不得api里面直接调用数据库,这也是Golang的特点。

2025-02-05 22:17:15 766

原创 SpringBoot+MyBatis-Plus使用教程(三)

这时候就能调用UserMapper中的updateUsernameByIds这个方法了,updateUsernameByIds会去user.xml中找到自己的sql语句(应为我们写了id="updateUsernameByIds"),这时候#{name} ${ew.customSqlSegment}这两个就会被替换成真正的sql语句。@Param(Constants.WRAPPER)是固定写法,就是对应xml文件中的那个ew,所以也就解释了${ew.customSqlSegment}为什么是固定写法了。

2025-02-03 17:13:46 590

原创 SpringBoot+MyBatis-Plus使用教程(二)

Lambda的好处是不用再去写表中的列名,只要我们写好po,LambdaQueryWrapper会通过反射的方式去解析po类中的写好的注解,比如@TableField("username"),这样它就自动获取到列名,如果有一天列名改了,那么只要操作po类即可,这也是解耦合的设计。如果是我来完成这样一个功能,我应该是拼一个很长的sql,为了能很好的适配这些条件,我会在拼完所有的条件之后,前面加一个"where 1=1 and ",然后再往前加select或者update。

2025-02-03 16:07:59 610

原创 SpringBoot+MyBatis-Plus使用教程(一)

MyBatis-Plus是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。​

2025-02-02 23:34:48 817

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除