Zuul:路由转发,排除和自定义

我们来学习服务网关

api-gateway

在主类上加一个注解@EnableZuulProxy,我们希望访问gateway的时候,可以路由到product的这个接口上,我们来拿

这个接口作为实验

@GetMapping("/list")
public List<ProductInfo> list() {
	//1. 查询所有在架的商品
	List<ProductInfo> productInfoList = productService.findUpAll();
	return productInfoList;
}

localhost:7900/product/list

再来启动我们的网关,要怎么通过网关来访问这个接口呢

localhost:8040/product/product/list

前面的product是服务的名字,这样子就访问到了,你也可以路由到其他的地址,这上面的都可以路由,比如我们挑一个CONFIG,

挑CONFIG服务的某个接口,我们访问一下

localhost:8080/order-test.yml

可以访问,前面填服务的名字,

localhost:8040/config/order-test.yml

也是可以访问得到的,我们也 可以试一下POST接口,我们使用POSTMAN来测试,传过去的内容是这个商品的ID,也能够获取的到,

这就是路由转发的基本的功能,我们会发现,使用Zuul这个组件呢,什么都没配置,非常轻松的就实现了路由的功能,你看我们只是

引入了依赖,然后加这么一个注解,就实现了,但同时也有他的弊端,你访问的地址必须按照他的规则来,CONFIG是应用的名字,

接上他的地址,那我想自定义怎么办呢,就拿开始的PRODUCT来说,那我想换一个地址,

localhost:8040/product/product/list

比如叫myProduct,这样的话我要怎么来做呢,自定义路由,这个时候你就要使用到Zuul的配置了,zuul.routes,下面是你要

定义规则的名字,比如就叫myProduct.path,这是你的URL地址

zuul.routes.myProduct.path=/myProduct/**

以及你要路由到哪个服务上去,服务名叫product,

zuul.routes.myProduct.service-id=product

再不看一下这个配置怎么配的,访问一下新的地址,

localhost:8040/myProduct/product/list

那有没有地方可以让我看到所有路由的规则呢,其实是有的,我们来找一下,找一下他的mapper,你要访问

/application/routes

localhost:8040/application/routes

提示权限问题,这里需要加这么一个配置

management.security.enabled=false

写成false,这就可以看到了

http://localhost:8040/routes

{"/myProduct/**":"product","/product/**":"product"}

它上面所有的路由的功能,myProduct路由到product这个服务,product也同样的路由到这个服务,

所以你看到我先做写成product也是可以的

localhost:8040/product/product/list

这里注意一下,

zuul.routes.myProduct.path=/myProduct/**

这里的myProduct我们是可以随意来定义的,比如我写aaaa也没关系

zuul.routes.aaaa.path=/myProduct/**

而/myProduct/**这个就不能瞎写了,这个必须是真实的访问路径,

zuul.routes.aaaa.path=/myProduct/**
zuul.routes.aaaa.service-id=product

这个的意思就是myProduct/product/list路由到product/product/list

我们再来看一下配置的规则,如果你只是配置两项的话呢,他其实还有一个简便的写法,你在routes下面可以直接写

service-id,后面直接跟上path

zuul.routes.product=/myProduct/**

把之前的给注释掉,也是可以访问

http://localhost:8040/myProduct/product/list

既然可以控制路由到某个地址,那我能不能禁止某个地址的路由呢,说起来有点绕,我希望这个接口暴露出去,

给移动端或者WEB端访问,怎么写呢,

zuul.ignoredPatterns

private Set<String> ignoredPatterns = new LinkedHashSet<>();

配置是一个Set,你可以配置多个,怎么在yml里面配置Set呢
<?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.learn.cloud</groupId>
	<artifactId>api-gateway</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	 <parent>
	   <groupId>cn.learn</groupId>
	   <artifactId>microcloud02</artifactId>
	   <version>0.0.1</version>
	 </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-eureka-server</artifactId>
        </dependency>
		<dependency>
		    <groupId>org.springframework.cloud</groupId>
		    <artifactId>spring-cloud-starter-zuul</artifactId>
		</dependency>
	</dependencies>
	
	<!-- 这个插件,可以将应用打包成一个可执行的jar包 -->
	<build>
	    <plugins>
	        <plugin>
	            <groupId>org.springframework.boot</groupId>
	            <artifactId>spring-boot-maven-plugin</artifactId>
	        </plugin>
	    </plugins>
	</build>

  
</project>
server.port=8040
spring.application.name=api-gateway
eureka.instance.prefer-ip-address=true
eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}
eureka.client.serviceUrl.defaultZone=http://admin:1234@10.40.8.152:8761/eureka
#eureka.instance.appname=api-gateway
#zuul.routes.user-route.service-id=product
#zuul.ignoredServices=microservice-consumer-movie-ribbon-hystrix
#zuul.routes.user-route.path=/user/**
#zuul.routes.user-route.url=http://localhost:7900/
#ribbon.eureka.enabled=false
#microservice-simple-provider-user.ribbon.listOfServers=http://localhost:7900/,http://localhost:7901/

#zuul.routes.myProduct.path=/myProduct/**
#zuul.routes.myProduct.service-id=product
zuul.routes.product=/myProduct/**
management.security.enabled=false
package com.learn.cloud;

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

@EnableZuulProxy
@SpringBootApplication
public class APIGatewayApplication {
  public static void main(String[] args) {
    SpringApplication.run(APIGatewayApplication.class, args);
  }
  
//  @Bean
//  public PatternServiceRouteMapper serviceRouteMapper() {
//      return new PatternServiceRouteMapper(
//          "(?<name>^.+)-(?<version>v.+$)",
//          "${version}/${name}");
//  }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值