一、认识微服务
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添加路由信息:



















