目录
Netflix Zuul(服务网关)基本使用
Netflix Zuul(服务网关)基本使用
1.导入依赖
<!-- Eureka Client客户端:注册 -->
<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>
2.配置文件(application.yml)
将Zuul服务注册到到注册中心,以便路由和过滤
server:
port: 10001
spring:
application:
name: api-gateway
zuul:
routes:
service-provide: /provide/** # 配置服务请求路径(服务提供方),将/provide/**路径映射到服务名为service-provide的服务中进行处理
service-consume: /consume/** # 配置服务请求路径(服务消费方)
prefix: /api # 设置zuul网关请求前缀
其中配置服务请求路径方法有3种:
zuul:
routes:
服务名:
path: /xxx/**
serviceId: 服务名
zuul:
routes:
服务名:
path: /xxx/**
zuul:
routes:
服务名: /xxx/**
(1)使用Eureka负载路由方式
server:
port: 8080
spring:
application:
name: zuul
#配置Eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
#构建路由地址
zuul:
routes:
# 这里可以自定义
demo:
# 匹配的路由规则
path: /demo/**
# 路由的目标服务名
serviceId: demo
(2)不使用Eureka负载方式路由,采取请求地址路由
server:
port: 8080
spring:
application:
name: zuul
#配置eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
#构建路由地址
zuul:
routes:
# 这里可以自定义
demo:
# 匹配的路由规则
path: /demo/**
# 路由的目标服务名
url: demo
#关闭使用eureka负载路由
ribbon:
eureka:
enabled: false
#如果不使用eureka的话,需要自己定义路由的那个服务的其他负载服务
demo:
ribbon:
# 这里写你要路由的demo服务的所有负载服务请求地址,本项目只启动一个,因此只写一个
listOfServers: http://localhost:8090/
(3)如果不想依赖于Eureka使用zuul,那么可使用以下配置方式
server:
port: 8080
spring:
application:
name: zuul
#构建路由地址
zuul:
routes:
# 这里可以自定义
demo:
# 匹配的路由规则
path: /demo/**
# 路由的目标地址
url: http://localhost:8090/
路由规则
当Zuul集成Eureka之后,其实就可以为Eureka中所有的服务进行路由操作,在zuul中,路由匹配的路径表达式采用ant风格定义
默认规则举例:
默认转发规则:“API网关地址 + 访问的服务名称 + 接口URI”
规则 | 描述 |
---|---|
API网关地址 | http://localhost:2103 |
用户服务名称 | user-service |
用户登录接口 | /user/login |
那么通过Zuul访问登录接口的规则 | http://localhost:2103/user-service/user/login |
(1)指定具体服务路由
可以为每一个服务都配置一个路由转发规则
zuul.routes.client-house.path=/zuul-house/**
client.house:具体服务
zuul.house:自定义路由路径
上述代码将client-house服务的路由地址配置成了zuul-house
访问client-house中的接口时,通过/zuul-house/index来进行。这其实就是将服务名称变成了自定义的名称
通配符 | 描述 |
---|---|
? | 匹配任意单个字符 |
* | 匹配任意数量的字符。只能转发一级的URL:/zuul-house/index/1 --> /client-house/index |
** | 匹配任意数量的字符,支持多级目录。可以转发任意层级的URL:/zuul-house/index/1 --> /client-house/index/1 |
(2)路由前缀
在API前面配置一个统一的前缀,即在每个接口前面加一个rest(前缀)
原服务地址:http://localhost:8000/
zuul.prefix=/rest
比如:/zuul-house/user/login接口,在加上前缀后,即访问http://localhost:8000/rest/user/login接口
(3)本地跳转:forward
Zuul的API路由还提供了本地跳转功能,通过forward实现
zuul.routes.client-house.path=/api/**
zuul.routes.client-house.url=forward:/local
当访问http://localhost:8000/api/1的时候会路由到本地的http://localhost:8000/local/1上去
local是本地接口:Controller
@RestController
public class LocalController {
@GetMapping("/local/{id}")
public String local(@PathVariable String id) {
return id;
}
}
(4)忽略表达式
忽略表达式参数:zuul.ignored-patterns。该参数可以用来设置不希望被api网关进行路由的url表达式;即忽略含此表达式的URL
zuul:
routes:
demo:
path: /demo/**
serviceId: demo
# 不路由demo2开头的任意请求
ignored-patterns: /demo2/**
3.启动类:@EnableZuulProxy
@EnableZuulProxy
@SpringBootApplication
public class SpringcloudconsumerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudconsumerApplication.class, args);
}
}
4.整合Eureka
内部服务的数量会很多,而且可以随时扩展,不可能每增加一个服务就改一次路由的配置,所以也得通过结合Eureka来实现动态的路由转发功能
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka
eureka.client.serviceUrl.defaultZone=http://zhangsan:123456@localhost:8761/eureka/