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根本没有值,所以也就被拦截了: