springcloud腳手架搭建(四)---zuul閘道器搭建
1.引入pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId >com.gameley</groupId>
<artifactId>gateway-service</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>gateway-service</name>
<description>Demo project for Spring Boot</description>
<parent >
<groupId>com.gameley</groupId>
<artifactId>adplatform</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--<dependency>-->
<!--<groupId>org.springframework.cloud</groupId>-->
<!--<artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>-->
<!--</dependency>-->
<!--<dependency>-->
<!--<groupId>org.springframework.cloud</groupId>-->
<!--<artifactId>spring-cloud-starter-stream-rabbit</artifactId>-->
<!--</dependency>-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.6.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.33</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.14</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.gameley</groupId>
<artifactId>gameley-common</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!--<dependency>-->
<!--<groupId>org.springframework.cloud</groupId>-->
<!--<artifactId>spring-cloud-starter-zipkin</artifactId>-->
<!--<version>RELEASE</version>-->
<!--</dependency>-->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.配置zuul:
zuul:
routes:
api-a:
path: /user-api/**
serviceId: user-service
api-b:
path: /gameley-auth/**
serviceId: gameley-auth
prefix: /api #為zuul設定一個公共的字首
3.建立springboot啟動類
package com.gameley;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
@EnableFeignClients
public class GatewayServiceApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayServiceApplication.class, args);
}
/**
* 解決跨域問題
* @return
*/
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true); // 允許cookies跨域
config.addAllowedOrigin("*");// #允許向該伺服器提交請求的URI,*表示全部允許
config.addAllowedHeader("*");// #允許訪問的頭資訊,*表示全部
config.setMaxAge(18000L);// 預檢請求的快取時間(秒),即在這個時間段裡,對於相同的跨域請求不會再預檢了
config.addAllowedMethod("*");// 允許提交請求的方法,*表示全部允許,也可以單獨設定GET、PUT等
config.addAllowedMethod("HEAD");
config.addAllowedMethod("GET");// 允許Get的請求方法
config.addAllowedMethod("PUT");
config.addAllowedMethod("POST");
config.addAllowedMethod("DELETE");
config.addAllowedMethod("PATCH");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}
4.配置登入攔截器
package com.gameley.filter;
import com.alibaba.fastjson.JSON;
import com.gameley.bean.Audience;
import com.gameley.bean.JwtInfo;
import com.gameley.common.constant.RestCodeConstants;
import com.gameley.common.msg.auth.TokenErrorResponse;
import com.gameley.feign.ElementService;
import com.gameley.utils.JwtHelper;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
@EnableConfigurationProperties(Audience.class)
@Slf4j
@Component
public class loginfiler extends ZuulFilter {
@Autowired
ElementService iUserService;
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
@Value("${zuul.prefix}")
private String zuulPrefix;
@Value("${gate.ignore.startWith}")
private String startWith;
@Autowired
private Audience audience;
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
final String requesturi=request.getRequestURI().substring(zuulPrefix.length());
String token=request.getHeader("token");
String client=request.getHeader("client");
//不進行攔截的地址
if(isStartWith(requesturi)){
return null;
}
/**
* 未登入,踢出
*/
if(token==null||client==null){
ctx.setSendZuulResponse(false);// 過濾該請求,不對其進行路由
ctx.setResponseStatusCode(RestCodeConstants.TOKEN_ERROR_CODE);// 返回錯誤碼
ctx.setResponseBody("fail token");// 返回錯誤內容
ctx.set("isSuccess", false);
return null;
}
try {
JwtInfo jwtInfo=new JwtInfo();
jwtInfo.setToken(token);
jwtInfo.setClientId(audience.getClientId());
jwtInfo.setExpiresSecond(audience.getExpiresSecond());
jwtInfo.setName(audience.getName());
JwtHelper jwtHelper=new JwtHelper();
jwtHelper.setJwtInfo(jwtInfo);
Claims claims = jwtHelper.parseJWT(token, audience.getBase64Secret());
Claims clientClaims = jwtHelper.parseJWT(client, audience.getClient64Secret());
if(claims==null||clientClaims==null){
/**
* 暫不使用後臺自動重新整理,改為前端頁面定時自動拉取重新整理
*/
setFailedRequest("token過期", RestCodeConstants.TOKEN_ERROR_CODE);
return null;
// String refreshToken=jwtInfo.getToken();
// ctx.addZuulRequestHeader("token",refreshToken);
// ctx.addZuulResponseHeader("token",refreshToken);
}else {
ctx.addZuulRequestHeader("token",token);
}
} catch (Exception e) {
setFailedRequest(JSON.toJSONString(new TokenErrorResponse(e.getMessage())), RestCodeConstants.TOKEN_ERROR_CODE);
return null;
}
return null;
}
/**
* URI是否以什麼打頭
*
* @param requestUri
* @return
*/
private boolean isStartWith(String requestUri) {
boolean flag = false;
for (String s : startWith.split(",")) {
if (requestUri.startsWith(s)) {
return true;
}
}
return flag;
}
/**
* 閘道器拋異常
*
* @param body
* @param code
*/
private void setFailedRequest(String body, int code) {
log.debug("Reporting error ({}): {}", code, body);
RequestContext ctx = RequestContext.getCurrentContext();
ctx.setResponseStatusCode(code);
if (ctx.getResponseBody() == null) {
ctx.setResponseBody(body);
ctx.setSendZuulResponse(false);
}
}
}
相關推薦
springcloud腳手架搭建(四)---zuul閘道器搭建
1.引入pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:/
SpringCloud(九)zuul閘道器 路由與負載均衡
前言: 在前面的章節中,微服務架構中,每一個微服務都需要暴漏,不同的url,不同的埠,沒有一個統一的入口,這樣設計顯然不合理,閘道器的一個功能就是實現一個統一的入口,所有請求經過閘道器,然後閘道器統一代理到各個微服務,並且能實現負載均衡的功能。程式碼:工程構造如
第十二天:浪跡天涯網上商城(1.0版本)--spring cloud zuul閘道器搭建
1、需求我們都知道專案中的服務是越來越多的,如果沒有一個統一的閘道器來做分發,那麼就會將複雜度帶到客戶端,所以我們必須搭建閘道器。2、實現步驟1、建立一個專案langjitianya-gateway2、準備好pom.xml檔案3、準備好配置檔案4、準備好啟動類5、run 起來
SpringCloud(五)Zuul閘道器與分散式配置中心
在 Spring Cloud 微服務系統中,一種常見的負載均衡方式是,客戶端的請求首先經過負載均衡(Ngnix),再到達服務閘道器(Zuul 叢集),然後再到具體的服務。服務統一註冊到高可用的服務註冊中心叢集,服務的所有的配置檔案由配置服務管理,配置服務的配置檔案放在 GIT 倉庫,方便開發人員隨時改配置。
springcloud zuul搭建伺服器介面閘道器
加入依賴;<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</art
SpringCloud閘道器搭建
Zuul的主要功能是路由轉發和過濾器。路由功能是微服務的一部分,比如/api/info轉發到到info服務,/api/login轉發到到login服務。zuul預設和Ribbon結合實現了負載均衡的功能, 類似於nginx轉發。 pom <parent> <groupI
超簡單的SpringClound入門教程(四.路由閘道器zuul)
一個微服務的專案架構是要有要的基礎構件的,包括服務註冊與發現、服務消費、負載均衡、斷路器、智慧路由、配置管理等;這樣便能構件出一個簡單的微服務專案; 整理出一個簡單的微服務架構圖; 大家可以看在圖中Zuul就充當著路由轉發的角色 不止如此,Zuul還具備很多功能: Authenticat
zuul:(一)SpringCloud的閘道器介紹和zuul閘道器的使用
1)什麼是閘道器? API Gateway,是系統的唯一對外的入口,介於客戶端和伺服器端之間的中間層,處理非業務功能 提供路由請求、鑑權、監控、快取、限流等功能 統一接入 智慧路由
springcloud之Zuul閘道器服務
Zuul是Netflix開源的微服務閘道器,它的核心是一系列的過濾器,這些過濾器可以完成以下功能: 身份認證與安全:識別每個資源的驗證要求,並拒絕那些與要求不符的請求。 審查與監控:在邊緣位置追蹤有意義的資料和統計結果,從而帶來精確的生產檢視。 動態路由:動態的請求路由到不同的後端叢集。
SpringCloud微服務基礎5:Zuul閘道器
我們使用Spring Cloud Netflix中的Eureka實現了服務註冊中心以及服務註冊與發現;而服務間通過Ribbon或Feign實現服務的消費以及均衡負載;通過Spring Cloud Config實現了應用多環境的外部化配置以及
SpringCloud微服務Zuul閘道器【真】動態路由
SpringCloud微服務Zuul閘道器動態路由 新的改變 功能快捷鍵 合理的建立標題,有助於目錄的生成 如何改變文字的樣式 插入連結與圖片 如何插入一段漂亮的程式碼片 生成一個適合你的列表 建立一個表
springcloud(十一):服務閘道器Zuul高階篇
Zuul的核心 Filter是Zuul的核心,用來實現對外服務的控制。Filter的生命週期有4個,分別是“PRE”、“ROUTING”、“POST”、“ERROR”,整個生命週期可以用下圖來表示。 Zuul大部分功能都是通過過濾器來實現的,這些過濾器型別對應於請求的典型生命週期。 PRE: 這
企業級 SpringCloud (五)路由閘道器(zuul)
在微服務架構中,需要幾個基礎的服務治理元件,包括服務註冊與發現、服務消費、負載均衡、斷路器、智慧路由、配置管理等,由這幾個基礎元件相互協作,共同組建了一個簡單的微服務系統。一個簡答的微服務系統如下圖: 注意:A服務和B服務是可以相互呼叫的,作圖的時候忘記了。並且配置服務也是註冊到服務註冊中心的。
SpringCloud實戰6-Zuul閘道器服務
為什麼需要閘道器呢? 我們知道我們要進入一個服務本身,很明顯我們沒有特別好的辦法,直接輸入IP地址+埠號,我們知道這樣的做法很糟糕的,這樣的做法大有問題,首先暴露了我們實體機器的IP地址,別人一看你的IP地址就知道服務部署在哪裡,讓別人很方便的進行攻擊操作。 第二,我
SpringCloud Zuul閘道器整合Swagger
一、關於Swagger Swagger能成為最受歡迎的REST APIs文件生成工具之一,有以下幾個原因: Swagger 可以生成一個具有互動性的API控制檯,開發者可以用來快速學習和嘗試API。 Swagger 可以生成客戶端SDK程式碼用於各種不同的平臺上的實現。
spring cloud(四)-服務閘道器Zuul-過濾器
前言 一般許可權控制,登入控制可以加到閘道器過濾器中。 1、過濾器的實現 繼承ZuulFilter,重寫4個方法filterType、filterOrder、shouldFilter 、run。 fil
springCloud Zuul閘道器
1.springboot 僅2.0.x 支援,在此選擇 2.0.7 2.新建Module eureka-zuul-client 3.匯入依賴 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=
獨立使用zuul閘道器分發不同服務的請求、許可權控制,非SpringCloud
閘道器api Gateway的重要性不言而喻,閘道器負責統一接收所有請求,然後根據不同的規則進行轉發到不同的服務。使用閘道器能夠統一的管理請求日誌、進行許可權控制、過濾等,這樣就能避免在每個單體應用中做重複的工作。這一篇主要是講zuul的獨立使用,就是隻作為一個獨立的專案進行
Java B2B2C o2o多使用者商城 springcloud架構(十):服務閘道器zuul初級篇
為什麼需要API Gateway 1、簡化客戶端呼叫複雜度 在微服務架構模式下後端服務的例項數一般是動態的,對於客戶端而言很難發現動態改變的服務例項的訪問地址資訊。因此在基於微服務的專案中為了簡化前端的呼叫邏輯,通常會引入API Gateway作為輕量級閘道器,同時API Gateway中也
SpringCloud(5)路由閘道器Zuul
1.為什麼需要Zuul Zuul很容易實現 負載均衡、智慧路由 和 熔斷器,可以做身份認證和許可權認證,可以實現監控,在高流量狀態下,對服務進行降級。 2.路由閘道器 繼續前面文章的搭建,新建一個Spring Boot工程模組。取名為service-zuul. 1.匯入依賴 <?xml ver