10.Netflix Zuul(服务网关)基本使用

目录


Spring Cloud专栏目录(点击进入…)



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/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未禾

您的支持是我最宝贵的财富!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值