我们来学习服务网关
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}");
// }
}