當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring Cloud -Zuul
生活随笔
收集整理的這篇文章主要介紹了
Spring Cloud -Zuul
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
服務網關和zuul
一個角色來充當request的請求入口,處理非業(yè)務功能的場所(防刷,協(xié)議監(jiān)控)
要素:
常用的網關方案
Tyk
Spring Cloud Zuul
項目改造應該合理利用原有的優(yōu)勢
特點:
路由+過濾器=Zuul
核心是一系列的過濾器
四種過濾器
- 前置
- 路由
- 后置
- error
使用
導入依賴
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency>開啟注解@EnableZuulProxy
@EnableEurekaClient @EnableZuulProxyyml
spring:application:name: zuulcloud:config:discovery:service-id: CONFIGenabled: trueprofile: dev server:port: 8085 eureka:client:service-url:defaultZone: http://localhost:8761/eureka zuul:routes: # /myProduct/product/list -> /product/list # aaa: # path: /myProduct/** # serviceId: PRODUCT #簡潔寫法product: /myProduct/** # 排除某些路由 set的寫法ignored-patterns:- /**/myProduct/product/list#用來查看配置 management:security:enabled: false{{zuul}}/application/routes查看配置
cookie和動態(tài)路由
Cookie
默認是不開啟cookie的
全局開啟
zuul:sensitive-headers:開啟方式:
zuul:routes: # /myProduct/product/list -> /product/list # aaa: # path: /myProduct/** # serviceId: PRODUCT #簡潔寫法product: /myProduct/**sensitive-headers:
動態(tài)路由(cloud config +cloud bus)
@Component public class ZuulConfig {@Autowired@ConfigurationProperties("zuul")public ZuulProperties zuulProperties() {return new ZuulProperties();} }
特點
- 路由+過濾器=Zuul
- 核心是一系列的過濾器
典型應用場景
-
前置
- 鑒權
- 過濾
-
后置
- 統(tǒng)計
- 日志
Zuul的高可用
多個節(jié)點注冊到Eureka Server上
Nginx 和Zuul"混搭"
前置和后置過濾器
前置過濾
package com.zzjson.apigateway.filter;import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import org.apache.commons.lang.StringUtils; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_DECORATION_FILTER_ORDER; import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;/*** <p>****************************************************************************</p>* <p><b>Copyright ? 2010-2018 rollBall team All Rights Reserved<b></p>* <ul style="margin:15px;">* <li>Description : com.zzjson.apigateway.filter</li>* <li>Version : 1.0.0</li>* <li>Creation : 2018年10月19日</li>* <li>@author : zzy0_0</li>* </ul>* <p>****************************************************************************</p>*/ @Component public class TokenFilter extends ZuulFilter {@Overridepublic String filterType() {return PRE_TYPE;}@Overridepublic int filterOrder() {return PRE_DECORATION_FILTER_ORDER - 1;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() throws ZuulException {RequestContext requestContext = RequestContext.getCurrentContext();HttpServletRequest request = requestContext.getRequest();String token = request.getParameter("token");if (StringUtils.isEmpty(token)) {//不通過requestContext.setSendZuulResponse(false);requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());}return null;} }order 的值越小,優(yōu)先級越高
后置過濾
package com.zzjson.apigateway.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.HttpServletResponse;import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.POST_TYPE; import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.SEND_RESPONSE_FILTER_ORDER;/*** <p>****************************************************************************</p>* <p><b>Copyright ? 2010-2018 rollBall team All Rights Reserved<b></p>* <ul style="margin:15px;">* <li>Description : com.zzjson.apigateway.filter</li>* <li>Version : 1.0.0</li>* <li>Creation : 2018年10月19日</li>* <li>@author : zzy0_0</li>* </ul>* <p>****************************************************************************</p>*/ @Component public class AddResponseFilter extends ZuulFilter {@Overridepublic String filterType() {return POST_TYPE;}@Overridepublic int filterOrder() {return SEND_RESPONSE_FILTER_ORDER - 1;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() throws ZuulException {RequestContext requestContext = RequestContext.getCurrentContext();HttpServletResponse response = requestContext.getResponse();response.setHeader("surprise", "xx");return null;} }限流
限流保護,防止網絡攻擊
時機:請求被轉發(fā)之前調用
令牌桶限流
package com.zzjson.apigateway.filter;import com.google.common.util.concurrent.RateLimiter; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.exception.ZuulException; import com.zzjson.apigateway.exception.RateLimiterException; import org.springframework.stereotype.Component;import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE; import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.SERVLET_DETECTION_FILTER_ORDER;/*** <p>****************************************************************************</p>* <p><b>Copyright ? 2010-2018 rollBall team All Rights Reserved<b></p>* <ul style="margin:15px;">* <li>Description :限流攔截器</li>* <li>Version : 1.0.0</li>* <li>Creation : 2018年10月19日</li>* <li>@author : zzy0_0</li>* </ul>* <p>****************************************************************************</p>*/ @Component public class RateLimiterFilter extends ZuulFilter {private static final RateLimiter rateLimiter = RateLimiter.create(1);@Overridepublic String filterType() {return PRE_TYPE;}@Overridepublic int filterOrder() {return SERVLET_DETECTION_FILTER_ORDER - 1;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() throws ZuulException {//沒有取到令牌if (!rateLimiter.tryAcquire()) {throw new RateLimiterException();}return null;} }
權限校驗
區(qū)分買家和賣家(返回的時候設置)
-
買家:
- cookie設置 openid=abc
-
賣家:
- cookie 設置token=uuid ,redis 設置 key=uuid,value=xyz
實現(xiàn)方式
跨域解決
在被調用的類或者方法上加@CrossOrigin注解
Zuul里面增加CrosFilter過濾器
@Configuration public class CrosConfig {@Beanpublic CorsFilter corsFilter() {final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();final CorsConfiguration config = new CorsConfiguration();//是否支持cookie跨域config.setAllowCredentials(true);//是否支持原始域 http://www.baidu.comconfig.setAllowedOrigins(Collections.singletonList("*"));config.setAllowedHeaders(Collections.singletonList("*"));config.setAllowedMethods(Collections.singletonList("*"));//設置緩存時間config.setMaxAge(300L);source.registerCorsConfiguration("/**", config);return new CorsFilter(source);}}代碼地址: https://gitee.com/zzy0_0/api-gateway
總結
以上是生活随笔為你收集整理的Spring Cloud -Zuul的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Rsync+inotify搭建使用
- 下一篇: vue.js响应式原理解析与实现