Spring Cloud Zuul 路由规则
Zuul统一代理所有Spring Cloud微服务,如何访问到具体的Spring Cloud的服务,需要设置路由规则。如下几种定义路由规则:
一、默认路由规则
如果不定义路由规则使用默认路由规则。
使用服务名作为路由名称,比如访问SERVICE-ORDER服务,需要这样访问
http://zuul-proxy:port/service-order
二、自定义微服务访问URL
需要在zuul-proxy的配置文件中添加如下定义
比如:定义SERVICE-ORDER服务的URL
zuul.routes.service-order=/order/**
在客户端访问SERVICE-ORDER服务使用如下URL
http://zuul-proxy:port/order
三、定义微服务名与对应URL
需要在zuul-proxy的配置文件中添加如下定义
比如:定义SERVICE-ORDER服务的URL
zuul.routes.api1.path=/order/**
zuul.routes.api1.serviceId=service-order
zuul.routes.api2.path=/store/**
zuul.routes.api2.serviceId=service-store
四、指定微服务与具体访问地址
需要在zuul-proxy的配置文件中添加如下定义
比如:定义SERVICE-ORDER服务的URL
zuul.routes.apiA.path=/orderA/**
zuul.routes.apiA.url=http://localhost:8120/hello1
使用具体的微服务地址,无法使用Ribbon的负载均衡、服务降级、熔断功能,必须如下单独配置
五、具体服务地址负载均衡配置
需要在zuul-proxy的配置文件中添加如下定义
比如:定义SERVICE-ORDER服务的URL
zuul.routes.service-order=/order/**
zuul.routes.service-order.serviceId=order
ribbon.eureka.enabled=false
order.ribbon.listOfServers=http://localhost:8120,http://localhost:8130
六、Zuul忽略微服务配置
需要在zuul-proxy的配置文件中添加如下定义
zuul.ignored-services=service-order,service-store
七、路由前缀
通过zuul.prefix参数统一配置前缀,Zuul在转发请求时自动去掉此前缀,如果需要转发时
带上此前缀,可以通过配置参数zuul.stripPrefix=false实现
zuul.prefix=/api
zuul.routes.service-order=/order/**
#zuul.routes.service-order.stripPrefix=false
八、路由顺序配置
配置路由顺序必须使用YAML配置文件
zuul:
routes:
service-order:
path: /order/**
legacy:
path: /order-old/**
Zuul容错设计
Zuul提供了ZuulFallbackProvider接口,通过实现此结果可以为某个微服务实现容错功能
如下例程:
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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.gf</groupId>
<artifactId>eureka-zuul</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-zuul Maven Webapp</name>
<url>http://maven.apache.org</url>
<!--
SpringCloud是基于SpringBoot框架的,必须引入SpringBoot的依赖
-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
</dependencies>
<!--
Spring Cloud的命名没有按照版本方式管理,是采用命名方式,
版本名称采用伦敦地铁站的名称命名,根据字母表的顺序对应版本时间顺序,
比如最早的Release版本号为Angel,第二个Release版本为Brixton
-->
<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>
<!--
根据SpringCloud约定打成可以独立执行Jar包,使用Maven命令
mvn package spring-boot:repackage
-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.properties
server.port=9300
spring.application.name=zuul-proxy
eureka.client.service-url.defaultZone=http://localhost:8110/eureka
eureka.client.register-with-eureka=true
eureka.client.registry-fetch-interval-seconds=10
eureka.client.fetch-registry=true
zuul.prefix=/api
zuul.routes.service-order=/order/**
#zuul.routes.service-order.stripPrefix=false
ZuulServer.java
package com.gf.eureka_zuul;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@EnableZuulProxy
@EnableHystrixDashboard
@SpringBootApplication
public class ZuulServer
{
public static void main( String[] args )
{
SpringApplication.run(ZuulServer.class, args);
}
}
订单微服务容错处理
package com.gf.eureka_zuul;
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 OrderServiceFallbackProvider implements ZuulFallbackProvider
{
public String getRoute(){
return "service-order";
}
public ClientHttpResponse fallbackResponse(){
return new ClientHttpResponse(){
public HttpStatus getStatusCode() throws IOException
{
return HttpStatus.OK;
}
public InputStream getBody() throws IOException {
return new ByteArrayInputStream("Service-Order".getBytes());
}
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
return headers;
}
public void close() {
// TODO Auto-generated method stub
}
public int getRawStatusCode() throws IOException {
return 200;
}
public String getStatusText() throws IOException {
return "OK";
}
};
}
}