01.zuul是作為springcloud中的一個網(wǎng)關(guān)框架來使用的。
zuul API 網(wǎng)關(guān),為微服務(wù)應(yīng)用提供統(tǒng)一的對外訪問接口。
zuul 還提供過濾器,對所有微服務(wù)提供統(tǒng)一的請求校驗(yàn)。
在項(xiàng)目中的位置:
02.新建 sp11-zuul 項(xiàng)目
03.pom.xml
需要添加 sp01-commons 依賴
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.tedu</groupId>
<artifactId>sp11-zuul</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>sp11-zuul</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>cn.tedu</groupId>
<artifactId>sp01-commons</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
04.application.yml
zuul 路由配置可以省略,缺省以服務(wù) id 作為訪問路徑
spring:
application:
name: zuul
server:
port: 3001
eureka:
client:
service-url:
defaultZone: http://eureka1:2001/eureka, http://eureka2:2002/eureka
zuul:
routes:
item-service: /item-service/**
user-service: /user-service/**
order-service: /order-service/**
zuul上的routes都是從eureka中獲取的
05.主程序
添加 @EnableZuulProxy 和 @EnableDiscoveryClient 注解
package cn.tedu.sp11;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@EnableZuulProxy
@EnableDiscoveryClient
@SpringBootApplication
public class Sp11ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(Sp11ZuulApplication.class, args);
}
}
zuul + ribbon 負(fù)載均衡
01.pom.xml 添加 spring-retry 依賴
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
02.配置 zuul 開啟重試,并配置 ribbon 重試參數(shù)
需要開啟重試,默認(rèn)不開啟
spring:
application:
name: zuul
server:
port: 3001
eureka:
client:
service-url:
defaultZone: http://eureka1:2001/eureka, http://eureka2:2002/eureka
zuul:
retryable: true
routes:
item-service: /item-service/**
user-service: /user-service/**
order-service: /order-service/**
ribbon:
ConnectTimeout: 1000
ReadTimeout: 1000
MaxAutoRetriesNextServer: 1
MaxAutoRetries: 1
zuul + hystrix 降級
01.創(chuàng)建降級類
getRoute() 方法中指定應(yīng)用此降級類的服務(wù)id,星號或null值可以通配所有服務(wù)
02.ItemServiceFallback
package cn.tedu.sp11.fallback;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
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;
import cn.tedu.web.util.JsonResult;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component
public class ItemServiceFallback implements FallbackProvider {
@Override
public String getRoute() {
//當(dāng)執(zhí)行item-service失敗,
//應(yīng)用當(dāng)前這個降級類
return "item-service";
//星號和null都表示所有微服務(wù)失敗都應(yīng)用當(dāng)前降級類
//"*"; //null;
}
//該方法返回封裝降級響應(yīng)的對象
//ClientHttpResponse中封裝降級響應(yīng)
@Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
return response();
}
private ClientHttpResponse response() {
return new ClientHttpResponse() {
//下面三個方法都是協(xié)議號
@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.OK;
}
@Override
public int getRawStatusCode() throws IOException {
return HttpStatus.OK.value();
}
@Override
public String getStatusText() throws IOException {
return HttpStatus.OK.getReasonPhrase();
}
@Override
public void close() {
}
@Override
public InputStream getBody() throws IOException {
log.info("fallback body");
String s = JsonResult.err().msg("后臺服務(wù)錯誤").toString();
return new ByteArrayInputStream(s.getBytes("UTF-8"));
}
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
};
}
}
03.OrderServiceFallback
package cn.tedu.sp11.fallback;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
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;
import cn.tedu.web.util.JsonResult;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component
public class OrderServiceFallback implements FallbackProvider {
@Override
public String getRoute() {
return "order-service"; //"*"; //null;
}
@Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
return response();
}
private ClientHttpResponse response() {
return new ClientHttpResponse() {
@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.OK;
}
@Override
public int getRawStatusCode() throws IOException {
return HttpStatus.OK.value();
}
@Override
public String getStatusText() throws IOException {
return HttpStatus.OK.getReasonPhrase();
}
@Override
public void close() {
}
@Override
public InputStream getBody() throws IOException {
log.info("fallback body");
String s = JsonResult.err().msg("后臺服務(wù)錯誤").toString();
return new ByteArrayInputStream(s.getBytes("UTF-8"));
}
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
};
}
}
04.降低 hystrix 超時時間,以便測試降級
在aplication.yml中:
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 500
05.啟動服務(wù),測試降級
訪問:http://localhost:3001/item-service/35
zuul + hystrix 數(shù)據(jù)監(jiān)控
01.暴露 hystrix.stream 監(jiān)控端點(diǎn)
zuul 已經(jīng)包含 actuator 依賴
management:
endpoints:
web:
exposure:
include: hystrix.stream
啟動服務(wù),查看暴露的監(jiān)控端點(diǎn),這個項(xiàng)目的端口號是3001。
http://localhost:3001/actuator
http://localhost:3001/actuator/hystrix.stream
02.
啟動 sp08-hystrix-dashboard,填入 zuul 的監(jiān)控端點(diǎn)路徑,開啟監(jiān)控
http://localhost:4001/hystrix
填入監(jiān)控端點(diǎn):
http://localhost:3001/actuator/hystrix.stream
必須通過zuul網(wǎng)關(guān)訪問后臺服務(wù)才會產(chǎn)生監(jiān)控?cái)?shù)據(jù)
http://localhost:3001/item-service/35
zuul + turbine 聚合監(jiān)控
01.修改 turbine 項(xiàng)目,聚合 zuul 服務(wù)實(shí)例
spring:
application:
name: turbine
server:
port: 5001
eureka:
client:
service-url:
defaultZone: http://eureka1:2001/eureka, http://eureka2:2002/eureka
#app-config是說聚合監(jiān)控的服務(wù)的名稱,這里的名稱是在spring中的name屬性聲明的。
turbine:
app-config: order-service,zuul
cluster-name-expression: new String("default")
02.使用hystrix儀表盤, 對 turbine 監(jiān)控端點(diǎn)進(jìn)行監(jiān)控, 此端點(diǎn)聚合了訂單服務(wù)和zull網(wǎng)關(guān)服務(wù)的監(jiān)控?cái)?shù)據(jù)文章來源:http://www.zghlxwxcb.cn/news/detail-490514.html
http://localhost:5001/turbine.stream文章來源地址http://www.zghlxwxcb.cn/news/detail-490514.html
到了這里,關(guān)于微服務(wù) springcloud 08.zuul框架,API網(wǎng)關(guān),整合ribbon和hystrix框架的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!