首先创建网关之前你要有几个微服务的应用。这个我之前已经创建好了,没有的先创建一个简单的消费者,提供者,注册中心的微服务。
1:通过IDEA 创建 项目,选择Spring Initializr 点击 next
2:选择微服务名称,路径,点击next,
3:这里选择下面2个选择,选择Eureka Discovery是因为我们需要让路由path不是映射具体的url,而是让它映射到某给具体的服务当中,而具体的url则交给Eureka的服务发现机制去自动维护。
4:点击生成后pxm文件如下图所示:
当我们点开zuul依赖时我们会发现zuul核心依赖不仅包含
spring-cloud-netflix-zuul
还包含下面这些重要的依赖
spring-cloud-starter-netflix-hystrix:该依赖用来在网关服务实现对微服务转发时的保护机制,通过线程隔离和断路器,防止微服务的故障引发API网关的资源无法释放,从而影响其他应用的对外服务
spring-cloud-starter-netflix-ribbon:该依赖用来实现在网关服务进行路由转发时的客户端负载均衡以及请求重试
5:在启动类中加入注解
@EnableZuulProxy //开启Zuul的API网关服务。
@EnableDiscoveryClient //将API注册到注册中心中去,同时也让Zuul获取的注册中心的注册清单,以实现通过path映射服务,在从服务中调用实例来请求转发完整的路由机制。
这是我的yml文件配置:
server:
port: 8989
eureka:
client:
service-url:
defaultZone: http://server1:11000/eureka/,http://server2:12000/eureka/
spring:
application:
name: gateway
zuul:
routes:
server-consumer:
path: /consumer/**
ignored-services:
server-provider:
path: /provider/**
当我调用http://localhost:8989/consumer/MallBackground/productList这个路径的时候,该url的consumer符合consumer的路由规则所用该路径会被映射到serviceId为server-consumer的服务的某给实例中去。
Zuul网关路径匹配:
通配符 | 说明 |
---|---|
? | 匹配任意单个字符 |
* | 匹配任意数量的字符 |
** | 匹配任务数量的字符,支持多级目录 |
示例:
URL路径说明 | 说明 |
---|---|
/consumer/? | 它可以匹配/consumer/a,/consumer/b,/consumer/c |
/consumer/* | 它可以匹配/consumer/abc,/consumer/bac,/consumer/cba,但是无法匹配/consumer/abc/a |
/consumer/** | 它可以匹配/consumer/abc的目录以外还可以匹配/consumer/abc/a,多级目录 |
由于默认情况下所有Eureka上的服务都会Zuul自动创建映射关系来进行路由,这使我们有一些不希望被路由的服务也可能被外部访问到,这个时候可以使用 下面的表达式来定义不创建路由的规则。
zuul:
ignored-services::
server-provider:
path: /provider/**
Zuul还提供了一个忽略表达式的参数
zuul:
ignored-patterns: /**/MallBackground/**
当我们访问consumer/MallBackground/的路径的时候由于符合ignored-patterns的规则所以不被正确路由,另外在使用时还需要注意他不是针对某个路由,而是对所有路由,所有设置的时候需要全面考虑URL的规则,防止不该被忽略的URL也忽略了
路由前缀:
放了方便路由规则增减前缀,Zuul提供了 Zuul.prefix参数来增减前缀
zuul:
prefix: /mall
本地跳转:
Zuul实现了API网关功能中,还支持forward形式的服务端配置,实现方式 gateway 网关服务名,当发起
http://localhost:8989/mall/loca/hello/hello请求时,loca/hello的请求规则转发到API网关以gateway/cookie/hello为前缀的请求上
在API网关执行本地跳转的时候,我们也要为本地实现对应的接口,否则forward转发也会因为找不到请求返回404错误
zuul:
routes:
gateway:
path: /loca/hello/**
url: forward:/gateway/cookie
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/gateway")
public class gatewayController {
@GetMapping("cookie/hello")
public String hello(){
return "0";
}
}