SpringCloud学习八:zuul网关
发布日期:2021-05-06 22:11:19 浏览次数:26 分类:原创文章

本文共 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

上一篇:springcloud学习:rpc和http的区别,各自的优缺点
下一篇:SpringCloud学习七:config 配置中心

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2025年03月20日 10时23分52秒