一、认识微服务
1.单体架构
当高并发功能和重要功能都在同一个Tomcat服务器,当高并发的时候,重要的功能接口就会受到影响。
2.微服务
跨服务就需要一些技术栈
3.SpringCloud
二、微服务拆分
1.熟悉黑马商场
2.服务拆分原则
什么时候用微服务,就可以举例子比亚迪的网上购物收到投诉,就可以开发线上购物平台,这种有资金,目标明确,不存在试错。
例如跟商品的服务都只在一个微服务,内部关联,且更新时只会修改该微服务内部代码。核心业务不会调用其他微服务。
3.拆分服务
每个微服务是一个Module
拆分服务就是将各自服务所需的dto,vo,po,query实体,mapper,controller,service,配置类,启动项放到一个module或project中去。
4.远程调用
查询购物车时,需要查询商品的信息
通过网络调用,向商品微服务发送http请求,获取商品信息
在购物车service需要商品信息中:用RestTemplate发送请求
5.服务治理
使用RestTemplate存在很多问题,负载均衡你可能要访问不同的商品服务ip
①注册中心
服务启动的时候应该都向注册中心进行注册,告诉自己的ip和功能,还要与注册中心形成一个心跳,告诉自己的情况,如果宕机或者什么就会删除注册。调用者就可以通过负载均衡选择一个进行调用。
②nacos注册中心
在docker部署好后nacos
可以访问:
http://192.168.253.128:8848/nacos
输入nacos,密码nacos 即可进行管理服务
③服务注册
这样启动后就会注册
④服务发现
一二步与服务注册一致
nacos按服务名称进行管理,只需要传入名称就可以进行调用
6.OpenFeign
①快速入门
太复杂
这里个接口不用实现
②连接池
OpenFeign底层就是跟之前步骤类似发送请求,但它使用HttoURL性能不好,就可以更改请求方式
③最佳实践
可能别的服务也会使用相同的OpenFeign,避免重复编写以及便于维护
方案一:耦合度低,比较复杂
方案二:代码耦合度增加
聚合结构适合采用方案二
④日志
三、网关
路由是判断请求需要什么微服务,转发就是把请求给具体的微服务,身份校验检查访问的信息
网关不是SpringMVC框架下的
1.网关路由
①快速入门
网关也是一个微服务
要使用网关需要创建一个新服务并配置依赖:
②路由属性
路由断言:
fiflters:
对某一个服务请求头进行过滤
如果对所有服务请求过滤就放在外面
2.网关登录校验
所以我们如果要进行JWT令牌校验就需要在自定义一个Filter放入PRE中,并将用户信息放到请求头中
要想能够在各个微服务中拿到当前用户,首先得登录校验并将获得用户信息保存到请求头中,之后common包中的拦截器将请求头中的信息保存到ThreadLocal中,每个微服务都会依赖common包并加载其中的配置项,然后想要在微服务之间传递还需要将用户信息放到OpenFeign中的请求头中。
①自定义过滤器
在网关中定义filter类实现GlobalFilter和Ordered,后者是定义执行顺序的。NettyRoutingFilter设置的是最大的数代表最后执行。
对于指定路由过滤器GatewayFilter来说,需要时才看
②实现登录校验
jwt属性配置:auth中excludePaths就是不需要进行jwt验证的请求路径
自定义Filter类
这里antPathMatcher是来匹配路径的,因为配置中写的路径是包含通配符的
③网关传递用户
对上下文进行修改,对请求头进行修改
定义拦截器:拦截到请求后将用户信息传入UserContext这个静态类就是一个ThreadLocal
使拦截器生效的配置类:
但是要微服务都能用上还需要微服务启动类能够扫描到这个配置类
不同包扫描不到配置类想要生效,需要在META-INF中一个文件中去定义,这里spring.factories是老版本也可以使用
网关不是SpringMVC框架下的,但是网关服务也引入了common也就会加载这个配置类
加上这个注释,这个类只有SpringMVC具有所以才会生效
④OpenFeign传递用户
每个从网关到微服务,之所以能拿到用户信息,是因为网关传递了用户信息到请求头中,因为每个微服务可以理解为都会使用拦截器去获得这个用户信息。
但是微服务之间,也是发送请求来调用不同微服务的接口,这个请求没有携带用户信息的请求头,所以获取不到用户信息
api模块中,config包中添加:
并在使用OpenFeign的微服务启动类的OpenFeign注解中添加启动这个配置类选项
3.配置管理
nacos具备这个功能
①配置共享
我这里遇到了一个很蠢的问题,url它显示不完全,需要在后面加空格才行。
②配置热更新
推荐使用方式一来读取需要热更新的配置属性
首先定义一个配置类,来表示需要热更新的配置
prefix中表示的是ymal中的前缀
然后使用:
nacos中注册配置:bootstrap中spring.name
注意这里的名称必须是
这样配置后,无需重启服务,只需要将nacos中配置文件的值修改后就可生效
③动态路由
如果路由更改,重启网关会将所有服务失败
在Gateway模块添加一个类去监听路由
nacos添加路由信息: