Spring cloud四(Zuul api网关)

本文介绍SpringCloud中的Zuul网关如何作为统一入口管理微服务,包括Zuul的基本概念、代码实现及如何创建微服务EurekaClient1和ZuulApplication实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring Cloud—Zuul api网关


一.Zuul API简介

在构建微服务时,我们会面临为客户端应用程序提供唯一的网关的问题,即服务被拆分为小型微服务应用程序,这些应用程序对用户不可见,否则可能会导致大量的开发/维护工作。还有一些情况,如:整个生态系统网络流量可能会通过一个可能影响群集性能的单点。而Zuul就是为解决这一问题,Zuul为所有的请求提供统一的网关。

二.代码示例

为演示断路器,我们将创建一个微服务EurekaClient1一个Zuul网关服务代理ZuulApplication。

1.创建EurekaClient1

1)创建“Spring stater Project”项目,代码如下:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class EurekaClient1Application {

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

2)服务器配置:在src\main\resources目录下的application.properties中添加端口号:

server.port = 8090

3)创建Demo1Controller.java,代码如下:

import java.util.ArrayList;
import java.util.List;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class Demo1Controller {
	@RequestMapping(value = "/getdata", method = RequestMethod.GET)
    public List<String> getData() {

		List<String> list = new ArrayList<String>();
		list.add("data1");
		list.add("data2");
		return list; 	
    }
}

4)运行项目,在浏览器中输入地址:http://localhost:8090/getdata,可以看到访问成功。

2.创建ZuulApplication

1).创建"Spring stater Project”项目ZuulApplication,在pom.xml文件引入spring-cloud-starter-zuul代码如下:

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>

   <groupId>com.example</groupId>
   <artifactId>demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>ZuulApplication</name>
   <description>Demo project for Spring Boot</description>

   <parent>
   	<groupId>org.springframework.boot</groupId>
   	<artifactId>spring-boot-starter-parent</artifactId>
   	<version>1.5.4.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>
   	<spring-cloud.version>Dalston.SR2</spring-cloud.version>
   </properties>

   <dependencies>
   	 
   	<dependency>
   		<groupId>org.springframework.cloud</groupId>
   		<artifactId>spring-cloud-starter-zuul</artifactId>
   	</dependency>
   	  
   	<dependency>
   		<groupId>org.springframework.boot</groupId>
   		<artifactId>spring-boot-starter-test</artifactId>
   		<scope>test</scope>
   	</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>
   		<plugin>
   			<groupId>org.apache.maven.plugins</groupId>
   			<artifactId>maven-compiler-plugin</artifactId>
   			<version>3.3</version>
   			<configuration>
   				<source>1.8</source>
   				<target>1.8</target>
   			</configuration>
   		</plugin>
   	</plugins>
   </build>
</project>

2)在ZuulApplication中加入注解@EnableZuulProxy,代码如下:

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

@EnableZuulProxy
@SpringBootApplication
public class ZuulApplication {

   public static void main(String[] args) {
   	SpringApplication.run(ZuulApplication.class, args);
   }
   
   @Bean
   public PreFilter preFilter() {
       return new PreFilter();
   }
   @Bean
   public PostFilter postFilter() {
       return new PostFilter();
   }
   @Bean
   public ErrorFilter errorFilter() {
       return new ErrorFilter();
   }
   @Bean
   public RouteFilter routeFilter() {
       return new RouteFilter();
   }
}

3)添加Zuul过滤器PreFilter:

import javax.servlet.http.HttpServletRequest;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;

public class PreFilter extends ZuulFilter {

 @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();
   HttpServletRequest request = ctx.getRequest();

   System.out.println("Request Method : " + request.getMethod() + " Request URL : " + request.getRequestURL().toString());
   return null;
 }
}
import com.netflix.zuul.ZuulFilter;

public class PostFilter extends ZuulFilter {

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

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

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

 @Override
 public Object run() {
  System.out.println("Inside Response Filter");

   return null;
 }
}
import com.netflix.zuul.ZuulFilter;

public class RouteFilter extends ZuulFilter {

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

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

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

 @Override
 public Object run() {
  System.out.println("Inside Route Filter");
   return null;
 }
}
import com.netflix.zuul.ZuulFilter;

public class ErrorFilter extends ZuulFilter {

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

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

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

 @Override
 public Object run() {
  System.out.println("Inside Route Filter");

   return null;
 }
}

4)在src\main\resources目录下application.properties里添加端口号,内容如下:

zuul.routes.EurekaClient1.url=http://localhost:8090
 
ribbon.eureka.enabled=false
  
server.port=8080    

5)运行程序,在浏览器中输入http://localhost:8080/getdata,可以看到访问结果与http://localhost:8090/getdata一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值