本篇內(nèi)容主要講解“怎么使用Spring Cloud的Zuul網(wǎng)關(guān)和JWT身份驗(yàn)證”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“怎么使用Spring Cloud的Zuul網(wǎng)關(guān)和JWT身份驗(yàn)證”吧!
為寧城等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及寧城網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、寧城網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
Zuul,是spring cloud 全家桶中的網(wǎng)關(guān)
網(wǎng)關(guān):程序統(tǒng)一入口。主要功能:服務(wù)分發(fā)(動(dòng)態(tài)路由),服務(wù)鑒權(quán) 等。
需求
//已有訪問(wèn)路徑 http://localhost:8080/user //通過(guò)網(wǎng)關(guān)希望訪問(wèn)路徑 http://localhost:10010/userservice/user
步驟0:創(chuàng)建 zuul_demo
步驟一:修改pom文件,添加 zuul 、測(cè)試 依賴
步驟二:創(chuàng)建啟動(dòng)類,添加 開啟網(wǎng)關(guān)代理 注解 @EnableZuulProxy
步驟三:創(chuàng)建yml文件,配置端口、服務(wù)名、對(duì)應(yīng)關(guān)系(訪問(wèn)路徑 / 服務(wù)地址)
步驟0:創(chuàng)建 zuul_demo
步驟一:修改pom文件,添加 zuul 、測(cè)試 依賴
org.springframework.cloud spring-cloud-starter-netflix-zuul org.springframework.boot spring-boot-starter-test
步驟二:創(chuàng)建啟動(dòng)類,添加 開啟網(wǎng)關(guān)代理 注解 @EnableZuulProxy
package com.czxy; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; @SpringBootApplication @EnableZuulProxy //開啟網(wǎng)關(guān)代理 public class Zuul2Application { public static void main(String[] args) { SpringApplication.run(Zuul2Application.class,args); } }
步驟三:創(chuàng)建yml文件,配置端口、服務(wù)名、對(duì)應(yīng)關(guān)系(訪問(wèn)路徑 / 服務(wù)地址)
server: port: 10010 spring: application: name: zuuldemo2 #網(wǎng)關(guān)配置:訪問(wèn)路徑 和 服務(wù)路徑 對(duì)應(yīng)關(guān)系 zuul: routes: userservice: path: /userservice/** #訪問(wèn)路徑 url: http://localhost:8080 #服務(wù)路徑
步驟一:搭建eureka客戶端(pom依賴、啟動(dòng)類注解、yml注冊(cè)地址)
pom依賴
org.springframework.cloud spring-cloud-starter-netflix-eureka-client
啟動(dòng)類
package com.czxy; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; @SpringBootApplication @EnableZuulProxy //開啟網(wǎng)關(guān)代理 @EnableEurekaClient //開啟eureka客服端 public class Zuul2Application { public static void main(String[] args) { SpringApplication.run(Zuul2Application.class,args); } }
yml文件
#注冊(cè)地址 eureka: client: service-url: defaultZone: http://localhost:10086/eureka
步驟二:yml文件對(duì)應(yīng)關(guān)系 (訪問(wèn)路徑 和 服務(wù)名)
#網(wǎng)關(guān)配置:訪問(wèn)路徑 和 服務(wù)路徑 對(duì)應(yīng)關(guān)系 zuul: routes: userservice: path: /userservice/** #訪問(wèn)路徑 #url: http://localhost:8080 #服務(wù)路徑 serviceId: userservice #服務(wù)名稱時(shí)
路由名稱 和 服務(wù)名 通常采用一樣的命名,zuul允許簡(jiǎn)化
zuul: routes: userservice: /userservice/**
默認(rèn)情況下,一切服務(wù)的映射路徑就是服務(wù)名本身。
##默認(rèn)配置 zuul: routes: adminservice: /adminservice/**
步驟0:創(chuàng)建項(xiàng)目 zuul_demo
步驟一:修改pom文件,添加 zuul依賴、eureka 客戶端依賴
org.springframework.cloud spring-cloud-starter-netflix-zuul org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.boot spring-boot-starter-test
步驟二:創(chuàng)建啟動(dòng)類,添加2添加 開啟網(wǎng)關(guān)代理、開啟eureka客戶端
開啟網(wǎng)關(guān)代理 @EnableZuulProxy
開啟eureka客戶端 @EnableEurekaClient
package com.czxy; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; @SpringBootApplication @EnableZuulProxy //開啟網(wǎng)關(guān)代理 @EnableEurekaClient //開啟eureka客服端 public class Zuul2Application { public static void main(String[] args) { SpringApplication.run(Zuul2Application.class,args); } }
步驟三:創(chuàng)建yml文件,配置端口號(hào)、服務(wù)名、注冊(cè)地址
server: port: 10010 spring: application: name: zuuldemo2 #注冊(cè)地址 eureka: client: service-url: defaultZone: http://localhost:10086/eureka
路由前綴:用于維護(hù) 版本號(hào) 或 項(xiàng)目名
修改yml文件,進(jìn)行配置
zuul: prefix: /api
訪問(wèn)
編寫過(guò)濾器,繼承父類:ZuulFilter
常見(jiàn)方法:
filterType() 過(guò)濾器類型,取值:"pre"
filterOrder() 過(guò)濾器順序,取值:1
shouldFilter() 是否執(zhí)行,取值:true
run() 執(zhí)行業(yè)務(wù)邏輯
只要將過(guò)濾器的實(shí)現(xiàn),添加到spring容器中,zuul將自動(dòng)啟用過(guò)濾器。
過(guò)濾器父類:ZuulFilter
工具類(請(qǐng)求上下文對(duì)象):RequestContext
特殊請(qǐng)求頭:Authorization(下圖是postman軟件)
package com.czxy.filter; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; @Component public class LoginFilter extends ZuulFilter { @Override public String filterType() { return "pre"; //1 過(guò)濾器類型 } @Override public int filterOrder() { return 1; //2 過(guò)濾器排序 } @Override public boolean shouldFilter() { return true; //3 是否執(zhí)行 } @Override public Object run() throws ZuulException { // 獲得一個(gè)特殊請(qǐng)求頭,判斷是否有值:有 返回 null(放行) , 沒(méi)有 響應(yīng)狀態(tài)碼401 //1 獲得工具類(請(qǐng)求上下文對(duì)象) RequestContext requestContext = RequestContext.getCurrentContext(); //2 通過(guò)工具類獲得request對(duì)象 HttpServletRequest request = requestContext.getRequest(); //3 通過(guò)request對(duì)象獲得特殊請(qǐng)求頭 String auth = request.getHeader("authorization"); //4 判斷 if(auth == null){ //沒(méi)有 requestContext.setSendZuulResponse(false); //關(guān)閉響應(yīng) requestContext.setResponseStatusCode(401); } //放行 return null; } }
eureka :注冊(cè)中心
服務(wù)端:提供注冊(cè)
客戶端:進(jìn)行注冊(cè)
ribbon:負(fù)載均衡(集群)
Hystrix:熔斷器,執(zhí)行備選方案
Feign:遠(yuǎn)程調(diào)用
Zuul:網(wǎng)關(guān),統(tǒng)一入口。
服務(wù)與服務(wù)之間共享數(shù)據(jù),采用JWT先生成數(shù)據(jù),在另一個(gè)服務(wù)中解析數(shù)據(jù),為了保證數(shù)據(jù)安全性,使用RAS對(duì)數(shù)據(jù)進(jìn)行加密。
RAS 非對(duì)稱加密算法
同時(shí)生產(chǎn)一對(duì)秘鑰:公鑰和私鑰。
公鑰秘鑰:用于加密
私鑰秘鑰:用于解密
特點(diǎn)
編寫測(cè)試類使用工具生成公鑰,私鑰
//生成公鑰和私鑰 RasUtils.generateKey(公鑰位置,私鑰位置,密碼); RasUtils.generateKey(pubKeyPath,priKeyPath,"234"); //獲得公鑰 RasUtils.getPublicKey(pubKeyPath); //獲得私鑰 RasUtils.getPrivateKey(priKeyPath);
JWT 基于JSON的認(rèn)證規(guī)范。(Json Web Token)
使用JWT目的:生成數(shù)據(jù)、解析數(shù)據(jù)
使用JWT
步驟一:添加依賴(含之前的)
0.9.0 2.9.7 1.16.20 1.9.3 org.springframework.cloud spring-cloud-starter-netflix-zuul org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.boot spring-boot-starter-test commons-beanutils commons-beanutils ${beanutils.version} io.jsonwebtoken jjwt ${jwt.jjwt.version} joda-time joda-time ${jwt.joda.version} org.projectlombok lombok ${lombok.version} provided
步驟二:導(dǎo)入工具
步驟三:使用
//生成數(shù)據(jù), UserInfo --> String(加密) //JwtUtils.generateToken(數(shù)據(jù),過(guò)期時(shí)間(分鐘), 私鑰) String token = JwtUtils.generateToken(userInfo,30, RasUtils.getPrivateKey(priKeyPath)); //解析數(shù)據(jù), String(加密) --> UserInfo // JwtUtils.getObjectFromToken(加密數(shù)據(jù), 公鑰, 封裝對(duì)象.class); UserInfo userInfo = JwtUtils.getObjectFromToken(token, RasUtils.getPublicKey(pubKeyPath), UserInfo.class);
到此,相信大家對(duì)“怎么使用Spring Cloud的Zuul網(wǎng)關(guān)和JWT身份驗(yàn)證”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!