一、springcloud整合zuul网关
1.1、开启eureka
1.2、导入基础jar包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<!-- eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
1.3、yml配置文件添加配置
#eureka等配置省略.....
#zuul
#跳转到service-member服务
zuul.routes.api-a.path=/api-member/**
zuul.routes.api-a.service-id=service-member
#跳转到service-order服务
zuul.routes.api-b.path=/api-order/**
zuul.routes.api-b.service-id=service-order
1.4、主配置类
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
1.5、使用网关ip就能同时访问order、member接口 ,测试是否正常
二、配置拦截请求参数
2.1、创建拦截类TokenFilter.java
2.2、在TokenFilter.java类中继承ZuulFilter类
注意1:添加@Component注解
注意2:每个方法的作用,先看他们的注释
package com.example.filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
@Component
public class TokenFilter extends ZuulFilter {
/**
* 过滤器的类型,它决定过滤器在请求的哪个生命周期中执行,
* pre:请求被路由之前做一些前置工作 ,比如请求和校验
* routing : 在路由请求时被调用,路由请求转发,即是将请求转发到具体的服务实例上去.
* post : 在routing 和 error过滤器之后被调用..所以post类型的过滤器可以对请求结果进行一些加工
* error :处理请求发生错误时调用
*/
@Override
public String filterType() {
System.out.println("filterType");
return "pre";
}
/**
*过滤器的执行顺序.
*在一个阶段有多个过滤器时,需要用此指定过滤顺序
* 数值越小优先级越高
*/
@Override
public int filterOrder() {
System.out.println("filterOrder");
return 0;
}
/**
* 判断过滤器是否执行,直接返回true,代表对所有请求过滤
* 此方法指定过滤范围
* @return
*/
@Override
public boolean shouldFilter() {
System.out.println("shouldFilter");
return true;
}
/**
* 过滤的具体逻辑
* @return
*/
@Override
public Object run() throws ZuulException {
// 1.获取上下文
RequestContext currentContext = RequestContext.getCurrentContext();
// 2.获取 Request
HttpServletRequest request = currentContext.getRequest();
// 3.获取token 的时候一般从请求头中获取
// ajax请求头的用法:https://www.jianshu.com/p/552824d08c3a
String token = request.getParameter("token");
if (StringUtils.isEmpty(token)) {
// 不会继续执行... 不会去调用服务接口,网关服务直接响应给客户端
System.out.println("没有token,请求失败!!!");
currentContext.setSendZuulResponse(false);
currentContext.setResponseBody("token is null");
currentContext.setResponseStatusCode(401);
return null;
// 返回一个错误提示
}
// 正常执行调用其他服务接口...
System.out.println("正常执行网关~~~");
return null;
}
}
2.3、正式环境中应该从http请求头中获取token参数
ajax请求头的用法:https://www.jianshu.com/p/552824d08c3a
2.4、测试结果
三、Zuul网关负载均衡效果
zuul网关默认开启ribbon负载均衡
四、搭建动态Zuul网关路由转发
4.1、为什么要搭建动态网关
答:不能频繁修改yml配置配置,或重启服务
4.2、结合配置中心
注意:bootstrap.properties文件的权限更高,应该把相应配置放到bootstrap.properties配置文件中
4.2.1、启动eureka、member、order等项目
4.2.2、启动config-server,连接上Git(码云),不会配的请看SpringCloud学习七:config 配置中心第三点创建config-server项目
4.2.3、现在zuul服务相对于config-server来说是客户端(zuul服务是客户端),那么就在zuul服务中加入config-client服务的配置,详见SpringCloud学习七:config 配置中心第四点创建config-client服务
4.2.4、zuul服务配置完config-client的服务后(也就是config-client服务),在主配置文件中添加以下方法
注:ZuulProperties方法解析:应该是对请求头、响应头等进行处理(默认不会传递"Cookie", "Set-Cookie", "Authorization"到下游服务,也就是如果不进行配置,在服务中是获取不到"Cookie", "Set-Cookie", "Authorization"这些的。其他的比如动态路由也可以自定义配置一个zuulProperties(不是当前这个ZuulProperties))
@RefreshScope
@ConfigurationProperties("zuul")
public ZuulProperties zuulProperties(){
return new ZuulProperties();
}
4.3、运行http://127.0.0.1:8080/actuator/refresh接口获取config-service服务的配置参数
ok 搞定
https://blog.csdn.net/qq_41402200/article/details/94333830 学习
https://www.jianshu.com/p/6ed93de6f42a 为什么客户端是app就需要使用nginx
1