1.使用openFeign的itemClient接口去做远程调用其他微服务中的接口。但我们直接使用了itemClient接口,而不是该接口的实现类,说明我们是使用该接口的代理对象帮我们做远程调用的。这个代理对象是invocationHandler来生成的。
2.openFeign底层发起远程调用其他微服务的接口时,会一个一个的建立http连接,增加时间成本,因此有连接池技术来降低连接成本,用连接池进行优化性能(OKHttp等连接池)。
3.服务拆分成微服务之后,ip端口很多且有变化的风险,请求方不知道请求哪个;并且在需要密钥token(用户的身份校验)的情况下,不可能把密钥分发给每个微服务都来对用户身份进行校验。所以出现了网关来解决这些问题。
4.网关:就是网络的关口,负责请求的转发、路由、身份校验。
5.SpringCloud为我们封装好了实现网关功能的组件,不用我们实现网关的功能(身份校验,服务拉取,路由转发,负载均衡等),便于我们直接使用即可。SpringCloud中网关的实现包括两种:SpringCloud Gateway(用这个),Netfilx Zuul。
6.网关的请求转发:微服务向注册中心注册自己的信息,网关服务从注册中心拉取所有微服务的信息,当请求来临时,根据拉取的信息去分发请求到指定的微服务。
7.在application.yml文件中配置路由规则(网关端口,网关name,nacos地址,路由id,路由uri,路由匹配规则等信息)
8.路由属性:
网关路由对应的Java类型是RouteDefinition,其中常见的属性:
id:路由唯一标识
uri:路由目标地址
predicates:路由断言,判断请求是否符合当前路由
filters:路由过滤器,对请求或响应做特殊处理。
9.路由断言(predicates,开发人员可以根据它来匹配请求,如果请求和断言匹配才进行路由)分类:
10.路由过滤器(对访问网关的前端请求做相应的加工处理):
11. 网关的登录校验:
如何做:配置网关过滤器,实现登录校验,网关传递用户,将用户身份认证得到的token放置到路由转发请求的请求头中(其他微服务提供服务时也需要验证用户身份)
配置网关过滤器(一般使用GlobalFilter过滤器来实现):
12.通过网关实现登录校验:在网关中基于过滤器实现登录校验功能。
红框处进行token的校验,来验证用户身份信息。
13.网关将在GlobalFilter网关过滤器中拿到的用户信息传递给后续的微服务
在网关中利用Jwt工具类解析请求头中的token,然后将解析出来的token传递给下游的微服务,进行后续的业务处理。(上述过程交给公共微服务模块中的SpringMVC的拦截器来获取上游网关传来的解析token信息)
14.在微服务之间传递用户信息(微服务项目中的很多业务需要多个微服务共同合作完成,而这个过程中也需要传递登录用户信息)。
例如:
上述所说的在微服务之间传递用户信息可以利用openFeign来实现:openFeign中提供了一个拦截器接口,所有由openFeign发起的请求都会先调用拦截器处理请求。
这个接口为:
public interface RequestInterceptor {
void apply(RequestTemplate template);
}
其中的RequestTemplatel类中提供了一些方法可以让我们修改请求头。
15.上述在微服务场景下,利用网关实现登录校验的整体流程总结: