话不多说,搬砖!
创建Zuul工程
1,pom文件如下:
<?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">
<parent>
<artifactId>my-springcloud-parent</artifactId>
<groupId>com.dwsoft</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>my-springcloud-zuul</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
</project>
2,配置文件application.yml
server:
port: 8085
spring:
application:
name: my-springcloud-zuul
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8083/eureka/
3,主启动类:
package com.dwsoft.myspringcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
/**
* @author tlk
* @date 2020/7/16-10:38
*/
@EnableZuulProxy //启用zuul代理功能
@SpringBootApplication
public class ZuulMain {
public static void main(String[] args) {
SpringApplication.run(ZuulMain.class,args);
}
}
4,启动注册中心,服务工程,消费工程,网关进行测试
通过网关正常访问。
对于地址解释一下:
此时:通过 Zuul 可以访问,也可以不经过 Zuul 直接访问目标微服务。
server:
port: 8085
spring:
application:
name: my-springcloud-zuul
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8083/eureka/
zuul:
routes:
zuul-test: # 自定义路由规则的名称,在底层的数据结构中是 Map 的键
serviceId: my-springcloud-consumer # 目标微服务名称,ZuulRoute 类型的一个属性
path: /zuul-user/** # 用来代替目标微服务名称的路径, ZuulRoute 类型的一个属性 ,/**表示匹配多层路径,如果没有加/**则不能匹配后续的多层路径了
测试(重启网关工程):
http://127.0.0.1:8085/my-springcloud-consumer/consumer/get/user/by/id?userId=5566
http://127.0.0.1:8085/zuul-user/consumer/get/user/by/id?userId=5566
这两个地址都能正常访问。
需求2:让用户不能通过微服务名称访问
修改application.yml
server:
port: 8085
spring:
application:
name: my-springcloud-zuul
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8083/eureka/
zuul:
ignored-services:
- my-springcloud-consumer # 忽略指定微服务名称,让用户不能通过微服务名称访问 ; 若ignored-services: '*' 则忽略所有微服务名称
routes:
zuul-test: # 自定义路由规则的名称,在底层的数据结构中是 Map 的键
serviceId: my-springcloud-consumer # 目标微服务名称,ZuulRoute 类型的一个属性
path: /zuul-user/** # 用来代替目标微服务名称的路径, ZuulRoute 类型的一个属性 ,/**表示匹配多层路径,如果没有加/**则不能匹配后续的多层路径了
测试(重启网关工程):
http://127.0.0.1:8085/my-springcloud-consumer/consumer/get/user/by/id?userId=5566
http://127.0.0.1:8085/zuul-user/consumer/get/user/by/id?userId=5566 可以正常访问
需求3:给访问路径添加统一前缀
修改配置文件application.yml
server:
port: 8085
spring:
application:
name: my-springcloud-zuul
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8083/eureka/
zuul:
prefix: /hello # 给访问路径添加统一前缀
ignored-services:
- my-springcloud-consumer # 忽略指定微服务名称,让用户不能通过微服务名称访问 ; 若ignored-services: '*' 则忽略所有微服务名称
routes:
zuul-test: # 自定义路由规则的名称,在底层的数据结构中是 Map 的键
serviceId: my-springcloud-consumer # 目标微服务名称,ZuulRoute 类型的一个属性
path: /zuul-user/** # 用来代替目标微服务名称的路径, ZuulRoute 类型的一个属性 ,/**表示匹配多层路径,如果没有加/**则不能匹配后续的多层路径了
测试(重启网关工程):
http://127.0.0.1:8085/hello/zuul-user/consumer/get/user/by/id?userId=5566 (正常)
http://127.0.0.1:8085/zuul-user/consumer/get/user/by/id?userId=5566 (找不到地址了404)
网关路由功能到此!
网关过滤器功能主要用的是抽象类ZuulFilter,有兴趣的可以去了解。