六、使用Zuul实现路由转发和服务过滤

1.创建service-api工程,选择需要的依赖 eureka Discovery ,feign, zuul:

2.编写application.yml配置文件:

这个配置文件非常重要。我们基本上可以在配置文件里面实现路由转发功能。

注意,我们路由端口从1010 开始。

3.添加注解

 打开我们本次工程的启动类,添加如下注解

@EnableEurekaClient 注册服务

@EnableZuulProxy 开启zuul代理转发功能,使其成为一个zull 路由服务

4.启动这个工程,打开浏览器,访问我们注册中心:http://localhost:8700/

结果如下图:

可以发现我们的service-api已经上线,那我们怎么通过这个路由转发器去访问其代理的服务呢?

这就要回到我们刚才写的配置文件里。

我们可以看出来,我们随便在routes下定义了一个user-api 代表这是一个转发器,他的转发规则是什么呢?

Path :通过path路径去代理这个service-id,所以我们只需要通过访问这个路径,就可以访问的所代理的service-id上面了。

Service-id:具体的服务application.name

由此一推,我们的访问规则应该是这样:

localhost:1010/api-user/info

三段:api服务的/ip:port/   转发的规则/api-user/     user-service上的提供者/info/

输入浏览器:localhost:1010/api-user/info,

可以发现,我们已经成功的实现了服务转发:

5.Zuul的服务过滤功能

    创建一个拦截器类,实现ZuulFilter抽象类,重写里面的方法,并纳入spring容器:

package com.yzy.springcloud.serviceapi.filter;

import com.netflix.zuul.ZuulFilter;

import com.netflix.zuul.context.RequestContext;

import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@Component

public class LoginFilterextends ZuulFilter {

@Override

    public StringfilterType() {//拦截类型设置

        return "pre"; //标准拦截

    }

@Override

    public int filterOrder() {//拦截优先级设置

        return 0;

    }

@Override

    public boolean shouldFilter() {//是否开启过滤或拦截,改为true

        return true;

    }

@Override

    public Objectrun() {

RequestContext ctx=RequestContext.getCurrentContext();//得到request上下文对象,里面包含了此次访问的所有环境、参数支持,相当于一个工厂

        HttpServletRequest request=ctx.getRequest();//获取request

        Object accessToken=request.getParameter("token");//获取token参数,一般跨网段的项目中,我们经常采用token共享的方式来实现单点登录功能

        if(null==accessToken){

System.out.println("token is null");

            ctx.setSendZuulResponse(false);

            ctx.setResponseStatusCode(401);

            try{

ctx.getResponse().getWriter().write("token is empty"); //当登录被拦截时返回页面的消息

            }catch (Exception ex){

ex.printStackTrace();

            }

return null;

        }

System.out.println("登陆成功!");

return null;

    }

}

6. 重启项目,刷新浏览器地址,因为这个项目我并没有实现登录功能,token根本没有值,所以也就被拦截了:

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容