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

}

猜你喜欢

转载自blog.csdn.net/qixiang_chen/article/details/88373102