日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Cloud -Zuul

發布時間:2025/4/5 javascript 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Cloud -Zuul 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

服務網關和zuul

一個角色來充當request的請求入口,處理非業務功能的場所(防刷,協議監控)

要素:

  • 穩定性,高可用
  • 性能、并發性
  • 安全性
  • 擴展性
  • 常用的網關方案

  • Nginx+Lua(性能極高,事件驅動型,優化設計,擴展性,耦合低)
  • Kong
  • Tyk

  • 全RestFul Api
  • go開發
  • 性能高
  • Spring Cloud Zuul

  • netflix 開發
  • java技術棧
  • 一代zuul不能和nginx比性能
  • 項目改造應該合理利用原有的優勢

    特點:

    路由+過濾器=Zuul

    核心是一系列的過濾器

    四種過濾器

    • 前置
    • 路由
    • 后置
    • error

    使用

    導入依賴

    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency>

    開啟注解@EnableZuulProxy

    @EnableEurekaClient @EnableZuulProxy

    yml

    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和動態路由

    Cookie

    默認是不開啟cookie的

    全局開啟

    zuul:sensitive-headers:

    開啟方式:

    zuul:routes: # /myProduct/product/list -> /product/list # aaa: # path: /myProduct/** # serviceId: PRODUCT #簡潔寫法product: /myProduct/**sensitive-headers:

    動態路由(cloud config +cloud bus)

    @Component public class ZuulConfig {@Autowired@ConfigurationProperties("zuul")public ZuulProperties zuulProperties() {return new ZuulProperties();} }

    特點

    • 路由+過濾器=Zuul
    • 核心是一系列的過濾器

    典型應用場景

    • 前置

      • 鑒權
      • 過濾
    • 后置

      • 統計
      • 日志

    Zuul的高可用

    多個節點注冊到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 的值越小,優先級越高

    后置過濾

    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;} }

    限流

    限流保護,防止網絡攻擊

    時機:請求被轉發之前調用

    令牌桶限流

    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;} }

    權限校驗

  • /order/create 只能買家訪問
  • /order/finish 只能賣家
  • /product/list 都可以訪問
  • 區分買家和賣家(返回的時候設置)

    • 買家:

      • cookie設置 openid=abc
    • 賣家:

      • cookie 設置token=uuid ,redis 設置 key=uuid,value=xyz

    實現方式

  • Zuul:在前置過濾器中實現相關的邏輯
  • 分布式Session Vs OAuth2
  • 跨域解決

  • 在被調用的類或者方法上加@CrossOrigin注解

  • 允許cookie跨域
  • 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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。