spring cloud zuul 路由的使用

1.介绍

Zuul是spring cloud中的微服务网关。网关: 是一个网络整体系统中的前置门户入口。请求首先通过网关,进行路径的路由,定位到具体的服务节点上。也减少了客户端与服务端的耦合,服务可以独立发展,通过网关层来做映射

Zuul主要有两大功能:路由转发和过滤。路由转发能够为全部服务提供一个唯一的入口,起到外部和内部隔离的作用,保障了后台服务的安全性。过滤可以用来鉴权校验,识别每个请求的权限,拒绝不符合要求的请求。

当它和config server组件配合时能够实现动态路由,动态的将请求路由到不同的后端集群中。

Zuul默认是实现了hystrix,ribbon和actuator

2.路由功能

要创建一个Zuul项目,很简单:

2.1 引入pom文件

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

2.2 主类添加@EnableZuulProxy注解开启网关服务功能

2.3 application.yml

spring:
  application:
    name: zuul-demo
server:
  port: 5555

这样zuul就搭建完成了,然后我们可以通过在配置文件中对zuul进行配置来实现路由转发。

2.4 传统路由配置

2.4.1 单实例配置

在传统的路由的单实例配置中,通过配置path和url来进行转发,配置格式为:zuul.routes.<routeName>.path和zuul.routes.<routeName>.url,如以下配置,<routeName>则表示api-a,该名称可随意定义。但是一组path和url映射关系的路由名要相同

zuul:
  routes: 
    api-a: 
      path: /apia/**
      url: http://localhost:8080/

像如上配置,当我们访问http://localhost:5555/apia/hello时,会被转发到http://localhost:8080/hello

2.4.2 多实例配置

 通过zuul.routes.<routeName>.path和zuul.routes.<routeName>.serviceId参数进行配置,然后利用ribbon的服务列表实现负载均衡(Zuul中自带了对Ribbon的依赖)

zuul:
  routes:
    api-a:
      path: /apia/**
      serviceId: api-a
api-a:
  ribbon:
    listOfServers: http://localhost:8090/

传统的路由模式中,无论是单实例还是多实例,我们都需要自己去维护路由名称,且需要自己定义path和服务实例的列表,这样无疑是很麻烦的。那我们可以将Eureka加进来,因为Eureka中存在所有的服务列表。

2.5 服务路由配置(Zuul和Eureka整合)

通过Zuul和Eureka的整合,可以实现对服务实例的自动化维护,即我们不需要再为每个serviceId指定具体的服务实例列表.但是我们依然是需要维护请求路径的匹配表达式和服务名的映射关系,(也可不维护,会根据默认的路由规则生成)

为Zuul项目添加Eureka的依赖,和@EnableDiscoveryClient注解。

现在我们启动Eureka注册中心,服务提供者端口8090,和Zuul项目

当我们将Zuul和Eureka整合后,只需要像如下配置即可:route名可随意定义

zuul:
  routes:
    #route名,可随意定义
    feign-service-provider:
      path: /feign-service-provider/**
      serviceId: feign-service-provider

我们也可以使用更简单的配置方式:zuul.routes.<serviceId>=<path>,如上的配置等价于:

zuul:
  routes:
    feign-service-provider: /feign-service-provider/**

然后访问http://localhost:5555/feign-service-provider/okuserpost,返回成功

2.5.1 通过接口的方式查看路由列表

首先需要在application.yml中添加如下配置,将actuator的/routes端口暴露出来,如果不添加配置,访问该端口会报404

management:
  endpoints:
    web:
      exposure:
        include: "*"
 

然后访问http://localhost:5555/actuator/routes,会出现以下json结果:

{
"/feign-service-provider/**": "feign-service-provider"
}

2.5.2 路由默认规则

由于再实际的运用过程中,大部分的路由配置规则几乎都会采用服务名作为外部请求的前缀,比如以下例子,其中path路径的前缀使用了feign-service-provider,而对应的服务名也是feign-service-provider,对于这样有规则性的配置内容,我们希望自动化的完成

zuul:
  routes:
    #route名,可随意定义
    feign-service-provider:
      path: /feign-service-provider/**
      serviceId: feign-service-provider

当我们将Zuul和Eureka整合后,Zuul默认实现了这样一套规则,该规则会自动的生成path和serviceId的关联,这样我们就不需要再为这些服务维护这些基本的路由规则了。

由于默认情况下所有Eureka上的服务都会被Zuul自动地创建路由,这回使得一些我们不希望对外开放的服务也会被外部访问到,这时,我们可以使用zuul.ignored-services参数来设置一个服务名表达式来定义不自动创建路由的规则,如当我们设置zuul.ignored-services=*时,Zuul对所有的服务都不自动创建规则。在这种情况下,我们要在配置文件中逐个为需要路由的服务添加规则(使用zuul.routes.<serviceId>=<path>的方式)。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章