
本文共 3614 字,大约阅读时间需要 12 分钟。
一、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;@Componentpublic 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请求头的用法:
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(码云),不会配的请看
4.2.3、现在zuul服务相对于config-server来说是客户端(zuul服务是客户端),那么就在zuul服务中加入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、运行接口获取config-service服务的配置参数
ok 搞定
学习
为什么客户端是app就需要使用nginx
1