續 Eureka+Hystrix+Zuul(Zuul API網關)


概述:

服務的合並,轉發,驗證,異構協議。將上百個請求融為一個發送到后台,返回大的JSON返回處理;

作用:這減少了客戶端與應用程序間的交互次數,還簡化了客戶端代碼。

Zuul可以通過加載動態過濾機制,從而實現以下各項功能:

l  驗證與安全保障: 識別面向各類資源的驗證要求並拒絕那些與要求不符的請求。

l  審查與監控: 在邊緣位置追蹤有意義數據及統計結果,從而為我們帶來准確的生產狀態結論。

l  動態路由: 以動態方式根據需要將請求路由至不同后端集群處。

l  壓力測試: 逐漸增加指向集群的負載流量,從而計算性能水平。

l  負載分配: 為每一種負載類型分配對應容量,並棄用超出限定值的請求。

l  靜態響應處理: 在邊緣位置直接建立部分響應,從而避免其流入內部集群。

l  多區域彈性: 跨越AWS區域進行請求路由,旨在實現ELB使用多樣化並保證邊緣位置與使用者盡可能接近。

除此之外,Netflix公司還利用Zuul的功能通過金絲雀版本實現精確路由與壓力測試。

 

具體實現:Eureka整合Zuul,並實現斷路器

1.pom.xml

<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>client.Zuul</groupId>
    <artifactId>client-Zuul</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <!-- Hystrix,Feign是基於Hystrix的 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

2.啟動項 ZuulRunApp

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@SpringBootApplication
@EnableZuulProxy
public class ZuulRunApp {

	public static void main(String[] args) {
		SpringApplication.run(ZuulRunApp.class, args);
	}

}

  application.yml

server:
  port: 8050
spring:
  application:
    name: client-Zuul
eureka:
  client:
    serviceUrl:
      defaultZone: http://user:password123@localhost:8761/eureka
zuul:
  routes:
    app-a:
      path: /user/**
      serviceId: consumer-Hystrix

ZuulFallBack.java

package cn.hz.fallback;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;

@Component
public class ZuulFallBack implements ZuulFallbackProvider{

	@Override
	public String getRoute() {
		//為了通用,寫了個*
		return "*";
	}

	@Override
	public ClientHttpResponse fallbackResponse() {
		return new ClientHttpResponse() {
			
			@Override
			public HttpHeaders getHeaders() {
				HttpHeaders headers = new HttpHeaders();
				headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
				return headers;
			}
			
			@Override
			public InputStream getBody() throws IOException {
				String msg = "This is responseContext!";
				return new ByteArrayInputStream(msg.getBytes());
			}
			
			@Override
			public String getStatusText() throws IOException {
				return HttpStatus.BAD_REQUEST.getReasonPhrase();
			}
			
			@Override
			public HttpStatus getStatusCode() throws IOException {
				return HttpStatus.BAD_REQUEST;
			}
			
			@Override
			public int getRawStatusCode() throws IOException {
				return HttpStatus.BAD_REQUEST.value();
			}
			
			@Override
			public void close() {
				
			}
		};
	}

}

  執行:

依次啟動:eurekaserver,  provider , consumer , Zuul

確保訪問正常后,關閉provider;

執行結果:http://localhost:8050/user/hello/82

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM