SpringCloud学习八:zuul网关

 

 

 

一、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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值