1. 程式人生 > >Spring cloud實戰-Zuul如何動態負載和服務發現擴容

Spring cloud實戰-Zuul如何動態負載和服務發現擴容

Zuul、Fegin、Rebbion、Eureka一條龍

很多人都自然而然把zuul當成nginx那樣來在配置寫死節點配置來。實際上zuul和eureka的是可以完美配合,完全可以基於服務名的註冊和發現,來動態的實現服務的動態負載動態註冊,從而達到不需要重啟zuul即可達到動態擴容的。下文將介紹靜態配置路由表和從Eureka發現服務的兩種方式來加強Zuul的使用。

專案地址:

GateWay搭建

img

Maven依賴

<dpendency>
    <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId
>
<artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session</artifactId> <version>1.2.2.RELEASE</version> </dependency> <dependency
>
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </dependency>

基於Eureka的application.yml(關鍵)

spring:
    application:
        name: ace-gate
    thymeleaf:
        mode: LEGACYHTML5
        cache: false
    redis:
        database: 1
        host: 127.0.0.1
        pool:
            max-active: 20
server:
    port: 8765 #啟動埠

#開啟動態閘道器服務發現
ribbon:
  eureka:
    enabled: true 

#配置zuul路由表,靜態路由
#zuul:
#  #prefix: /techouse #為zuul設定一個公共的字首
#  #ignoredServices: '*'
#  routes:
#    ace-admin: #隨便定義,當不存在serviceId時,預設該值為serviceId(就是註冊服務的名稱,屬性spring.application.name)
#      path: /test/** #匹配/test/** 均路由到cloud-client

#基於靜態路由節點的ribbon負載均衡配置
#ace-admin:
#  ribbon:
#    listOfServers: 127.0.0.1:8767 

eureka:
    instance:
        statusPageUrlPath: ${management.context-path}/info
        healthCheckUrlPath: ${management.context-path}/health
    client:
        serviceUrl:
            defaultZone: http://localhost:8761/eureka/
security:
    user:
        name: admin
        password: admin
        role: USER
#避免第一次呼叫失敗
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 5000

#請求和響應GZIP壓縮支援
feign:
  compression:
    request:
      enabled: true
      mime-types: text/xml,application/xml,application/json
      min-request-size: 2048
    response:
      enabled: true

啟用Zuul、Fegin、Eureka註解

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients
@EnableZuulProxy
@EnableRedisHttpSession(redisFlushMode = RedisFlushMode.IMMEDIATE)
public class GateBootstrap {
    public static void main(String[] args) {
        SpringApplication.run(GateBootstrap.class, args);
    }
}

Zuul filter攔截示例程式碼

@Component
public class SessionAccessFilter extends ZuulFilter {
  private final Logger log = LoggerFactory.getLogger(SessionAccessFilter.class);

  @Autowired
  private SessionRepository<?> repository;
  @Autowired
  private IUserService userService;

  @Override
  public String filterType() {
    return "pre";
  }

  @Override
  public int filterOrder() {
    return 1;
  }

  @Override
  public boolean shouldFilter() {
    return true;
  }

  @Override
  public Object run() {
    RequestContext ctx = RequestContext.getCurrentContext();
    HttpSession httpSession = ctx.getRequest().getSession();
    if (不符合許可權){
      setFailedRequest("<h1>Forbidden!</h1>",403);
    }
    return null;
  }

  /**
   * 路由重定向
   *
   * @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);
      throw new RuntimeException("Code: " + code + ", " + body); //optional
    }
  }
}

訪問閘道器地址示例

[ip]:[zuul port]/[Eureak 註冊服務]/[資源路徑]

Zuul相容動態註冊和靜態路由表

核心思路

基於Eureka上註冊另一個zuul,通過主的zuul gate way來分流到另外一個zuul,從而相容靜態路由的情況。
img

相關推薦

Spring cloud實戰-Zuul如何動態負載服務發現擴容

Zuul、Fegin、Rebbion、Eureka一條龍 很多人都自然而然把zuul當成nginx那樣來在配置寫死節點配置來。實際上zuul和eureka的是可以完美配合,完全可以基於服務名的註冊和發現,來動態的實現服務的動態負載和動態註冊,從而達到不需要重啟

Spring Cloud實戰Zuul統一異常處理

Spring Cloud實戰Zuul統一異常處理   Spring Cloud Zuul中自己實現的一些核心過濾器,以及這些過濾器在請求生命週期中的不同作用。我們會發現在這些核心過濾器中並沒有實現error階段的過濾器。那麼這些過濾器可以用來做什麼呢?接下來,本文將介紹如何利用er

Spring Cloud 2-Zuul 閘道器服務(六)

Spring Cloud  Zuul    1.pom.xml 2.application.yml Application.java &nb

Spring Cloud】第一篇 Service Discovery | 服務發現

Eureka 提供服務的註冊,服務可以通過註冊到Eureka然後被其他應用呼叫。 看到Spring Cloud 的文件裡面是先講的是Spring Cloud Config ,為了方便,或者說參考其他大佬的教程,我也會把Config放到後面寫。 word &

乾貨實操:微服務Spring Cloud 系列(二) Eureka服務發現服務註冊(strand alone)

此篇主要實操Eureka 服務端的服務註冊,以及服務發現,並需要認證才能訪問控制中心。 分五個部分說明: 一.  認識 Eureka  二.  Eureka  服務端開發 三.  Eureka 客戶端開發 四.  多客戶端情況檢視 五.  下節預告(多個服務提供後,怎麼

服務治理:Spring Cloud Eureka(三)之服務發現與消費

        Ribbon是基於HTTP和TCP的客戶端負載均衡器,可以在通過客戶端配置的ribbonServerList服務端列表去輪詢訪問達到均衡負載的作用。當其與Ribbon聯合使用時,其ribbonServerList會被DiscoveryEnalbedNIWServerList重寫,擴充套件成從E

Spring Cloud Alibaba基礎教程:Nacos服務發現與配置管理

隨著微服務概念的流行,越來越多的公司採用Spring Cloud全家桶構建微服務系統,實現業務的快速迭代。Spring Cloud提供了快速構建分散式微服務常用元件,包括Spring Cloud Eureka、Spring Cloud Ribbon、Spring Cloud Hystrix、Spring Cl

服務Spring Cloud實戰—Eureka Server的簡介高可用性—叢集

Eureka簡介 什麼是Eureka? Eureka是Netflix開源的服務發現元件,本身是一個基於REST的服務。它包含Server和Client兩部分。Spring Cloud將它整合在子專案Spring Cloud Netflix中,從而實現服務的註冊與發現 (注:Eurek

spring cloud使用zuul實現反向代理負載均衡

談到spring cloud,就要提及到其核心元件:zuul元件,這個元件其實功能很多,比如反向代理,負載均衡還有許可權控制等功能,這篇部落格主要寫的是zuul的反向代理和負載均衡。首先是進行eureka的實現,程式碼如下:首先是pom.xml,新增依賴:<dependency>

Spring Cloud實戰小貼士 Zuul處理Cookie重定向

由於我們在之前所有的入門教程中,對於HTTP請求都採用了簡單的介面實現。而實際使用過程中,我們的HTTP請求要複雜的多,比如當我們將Spring Cloud Zuul作為API閘道器接入網站類應用時,往往都會碰到下面這兩個非常常見的問題: 會話無法保持 重定向後的HOST錯誤

Spring Cloud Netflix》 -- 服務註冊服務發現-Eureka的常用配置

cti project ica 地址 cat 清理 class ict course 一、版本的說明 Angel版本對應Spring Boot 1.2.x,可以使用Spring Boot 1.3.x; Brixton版本對應Spring Boot 1.3.x,可以使用Spr

Spring Cloud Netflix》-- 服務註冊服務發現-Eureka的服務認證集群

cluster word self. app server 同步 not eat wal 一、 Eureka的服務認證 1、 服務端添加依賴 <dependency> <groupId>org.springframework.boot&

spring-cloud-starter-hystrix(斷路器)服務不通或者調用失敗後的錯誤處理回調

系統 comm cli 處理 參考 quest 微服務架構 ron 100% 雪崩效應 在微服務架構中通常會有多個服務層調用,大量的微服務通過網絡進行通信,從而支撐起整個系統。各個微服務之間也難免存在大量的依賴關系。然而任何服務都不是100%可用的,網絡往往也是脆弱的,所

Spring cloud實戰微服——服務提供者

turn nbsp private config amd .class res 請求 sim 目錄講解:   一、服務提供者與服務消費者的概念   二、編寫一個服務提供者的測試類(code)   1.1、 使用微服務構建的是分布式系統,微服務之間通過網絡進行通信。

幹貨分享微服務spring-cloud(6.Api網關服務zuul

依賴 正常 技術 網關 art ans audio style 熔斷器 Spring cloud zuul對Netflix zuul進行了封裝實現新建spring boot項目demo-springcloud-api-gateway,創建啟動類ZuulApplication

0201-開始使用Spring Cloud實戰服務準備工作

scala 技術 href spring tool 使用 pro too 服務 1、Spring Cloud是什麽   基於spring boot,之上快速構建分布式系統的工具集 2、關於Spring Cloud的版本   大部分spring軟件的版本是以:主版本.次

spring cloud實戰與思考(二) 微服務之間通過fiegn上傳多個文件1

jar 多文件 上傳文件 ret nmap spa 不同 port 問題 需求場景: 微服務之間調用接口一次性上傳多個文件。 上傳文件的同時附帶其他參數。 多個文件能有效的區分開,以便進行不同處理。   Spring cloud的微服務之間接口調用使用Feign。原裝的

spring cloud實戰與思考(三) 微服務之間通過fiegn上傳一組文件(下)

ets inf str ceo iter protected let pan ins 需求場景:   用戶調用微服務1的接口上傳一組圖片和對應的描述信息。微服務1處理後,再將這組圖片上傳給微服務2進行處理。各個微服務能區分開不同的圖片進行不同處理。   上一篇博客已經討

Spring Cloud 進階之路 -- 訊息匯流排 Spring Cloud Bus 配置手動重新整理動態自動重新整理

Spring Cloud Bus 配置步驟: 1、Spring Cloud Config 專案引入依賴,新增配置,配置暴露 endpoints 2、啟動Config 專案,註冊到Eureka,自動新增RabbitMQ佇列 3、客戶端的order應用引入依賴及配置,啟動Con

服務spring cloud實戰-脫離Eureka使用Ribbon

脫離Eureka使用Ribbon 1.複製專案microservice-consumer-movie-ribbon,將ArtifactId修改為microservice-consumer-movie-without-eureka。 2.為了讓測試更有說服力,乾脆讓專案去掉Eureka