1.創(chuàng)建service-api工程,選擇需要的依賴?eureka Discovery 晌柬,feign, zuul:
2.編寫application.yml配置文件:
這個配置文件非常重要郭脂。我們基本上可以在配置文件里面實現(xiàn)路由轉發(fā)功能年碘。
注意,我們路由端口從1010 開始展鸡。
3.添加注解
?打開我們本次工程的啟動類屿衅,添加如下注解
@EnableEurekaClient 注冊服務
@EnableZuulProxy 開啟zuul代理轉發(fā)功能,使其成為一個zull 路由服務
4.啟動這個工程莹弊,打開瀏覽器涤久,訪問我們注冊中心:http://localhost:8700/
結果如下圖:
可以發(fā)現(xiàn)我們的service-api已經上線,那我們怎么通過這個路由轉發(fā)器去訪問其代理的服務呢忍弛?
這就要回到我們剛才寫的配置文件里响迂。
我們可以看出來,我們隨便在routes下定義了一個user-api 代表這是一個轉發(fā)器细疚,他的轉發(fā)規(guī)則是什么呢蔗彤?
Path :通過path路徑去代理這個service-id,所以我們只需要通過訪問這個路徑疯兼,就可以訪問的所代理的service-id上面了然遏。
Service-id:具體的服務application.name
由此一推,我們的訪問規(guī)則應該是這樣:
localhost:1010/api-user/info
三段:api服務的/ip:port/?? 轉發(fā)的規(guī)則/api-user/? ???user-service上的提供者/info/
輸入瀏覽器:localhost:1010/api-user/info镇防,
可以發(fā)現(xiàn)啦鸣,我們已經成功的實現(xiàn)了服務轉發(fā):
5.Zuul的服務過濾功能
? ? 創(chuàng)建一個攔截器類,實現(xiàn)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() {//攔截優(yōu)先級設置
? ? ? ? return 0;
? ? }
@Override
? ? public boolean shouldFilter() {//是否開啟過濾或攔截,改為true
? ? ? ? return true;
? ? }
@Override
? ? public Objectrun() {
RequestContext ctx=RequestContext.getCurrentContext();//得到request上下文對象,里面包含了此次訪問的所有環(huán)境啦扬、參數(shù)支持中狂,相當于一個工廠
? ? ? ? HttpServletRequest request=ctx.getRequest();//獲取request
? ? ? ? Object accessToken=request.getParameter("token");//獲取token參數(shù),一般跨網段的項目中扑毡,我們經常采用token共享的方式來實現(xiàn)單點登錄功能
? ? ? ? if(null==accessToken){
System.out.println("token is null");
? ? ? ? ? ? ctx.setSendZuulResponse(false);
? ? ? ? ? ? ctx.setResponseStatusCode(401);
? ? ? ? ? ? try{
ctx.getResponse().getWriter().write("token is empty"); //當?shù)卿洷粩r截時返回頁面的消息
? ? ? ? ? ? }catch (Exception ex){
ex.printStackTrace();
? ? ? ? ? ? }
return null;
? ? ? ? }
System.out.println("登陸成功胃榕!");
return null;
? ? }
}
6. 重啟項目,刷新瀏覽器地址瞄摊,因為這個項目我并沒有實現(xiàn)登錄功能勋又,token根本沒有值苦掘,所以也就被攔截了: