SpringCloud-15:Zuul反向代理服务器

11、Zuul

官网参考地址:

https://cloud.spring.io/spring-cloud-static/Greenwich.RELEASE/single/spring-cloud.html#_router_and_filter_zuul

路由是微服务架构中必须(integral )的一部分,比如,“/” 可能映射到你的WEB程序上,”/api/users “可能映射到你的用户服务上,“/api/shop”可能映射到你的商品服务商。

Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器。zuul功能:

l认证

l压力测试

l金丝雀测试

l动态路由

l负载削减

l安全

l静态响应处理

l主动/主动交换管理

Zuul的规则引擎允许通过任何JVM语言来编写规则和过滤器, 支持基于Java和Groovy的构建。

11.1、Zuul做反向代理

当一个UI应用调用一个或更多的后端服务的时候,我们可以用Spring Cloud创建一个Zuul代理减少硬编码开发是非常常见的例子。使用代理服务来避免必须的跨域资源共享(Cross-Origin Resource Sharing)和所有的后端需要分别认证的问题。

在Spring Boot主函数上通过注解@EnableZuulProxy来开启, 这样可以让本地的请求转发到适当的服务. 按照约定, 一个ID为"users"的服务会收到 /users 请求路径的代理请求(前缀会被剥离). Zuul使用Ribbon定位服务注册中的实例, 并且所有的请求都在hystrix的command中执行, 所以失败信息将会展现在Hystrix metrics中, 并且一旦断路器打开, 代理请求将不会尝试去链接服务.

Zuul starter没有包含服务发现的客户端, 所以对于路由你需要在classpath中提供一个根据service IDs做服务发现的服务.(例如, eureka是一个不错的选择),即添加eureka-client的依赖。

在服务ID表达式列表中设置 zuul.ignored-services, 可以忽略已经添加的服务. 如果一个服务匹配表达式, 则将会被忽略, 但是对于明确配置在路由匹配中的, 将不会被忽略, 例如:

application.yml

zuul:

ignoredServices: '*'

routes:

users: /myusers/**

在这个例子中, 除了"users", 其他所有服务都被忽略了.这个意味着http请求"/myusers"将被转发到"users"服务(比如 "/myusers/101" 将跳转到 "/101")

为了更细致的控制一个路由, 你可以直接配置路径和服务ID:

zuul:

routes:

users:

path: /myusers/**

serviceId: users_service

这个意味着HTTP 调用"/myusers"被转发到"users_service"服务. 路由必须配置一个可以被指定为ant风格表达式的"path", 所以“/myusers/*”只能匹配一个层级,

但"/myusers/**"可以匹配多级。

后端的配置既可以是"serviceId"(对于服务发现中的服务而言), 也可以是"url"(对于物理地址), 例如:

zuul:

routes:

users:

path: /myusers/**

url:http://example.com/users_service

这个简单的"url-routes"不会按照 HystrixCommand 执行, 也无法通过Ribbon负载均衡多个URLs. 为了实现这一指定服务路由和配置Ribbon客户端(这个必须在

Ribbon中禁用Eureka: 具体参考更多信息), 例如:

zuul:

routes:

users:

path: /myusers/**

serviceId: users

ribbon:

eureka:

enabled: false

users:

ribbon:

listOfServers: example.com,google.com //所使用的Ribbon列表

你可以使用regexmapper提供serviceId和routes之间的绑定. 它使用正则表达式组来从serviceId提取变量, 然后注入到路由表达式中.

ApplicationConfiguration.java

@Bean

public PatternServiceRouteMapper serviceRouteMapper() {

return new PatternServiceRouteMapper(

"(?^.+)-(?v.+$)",

"$/$");

}

这个意思是说"myusers-v1"将会匹配路由"/v1/myusers/**". 任何正则表达式都可以, 但是所有组必须存在于servicePattern和routePattern之中.

如果servicePattern不匹配服务ID,则使用默认行为. 在上面例子中,一个服务ID为“myusers”将被映射到路径“/ myusers/**”(没有版本被检测到),这个功能默认是关闭的,并且仅适用于服务注册的服务。

设置zuul.prefix 可以为所有的匹配增加前缀, 例如 /api,代理前缀默认会从请求路径中移除(通过 zuul.stripPrefix=false 可以关闭这个功能).

#反响代理配置

#这里的配置类似nginx的反响代理

#当请求/api/**会直接交给listOfServers配置的服务器处理

#当stripPrefix=true的时候 (http://127.0.0.1:8181/api/user/list -> http://192.168.1.100:8080/user/list)

#当stripPrefix=false的时候(http://127.0.0.1:8181/api/user/list -> http://192.168.1.100:8080/api/user/list)

zuul.routes.api.path=/api/**

你也可以在指定服务中关闭这个功能:

zuul:

routes:

users:

path: /myusers/**

stripPrefix: false

在这个例子中, 请求"/myusers/101"将被跳转到"users"服务的"/myusers/101"上.

zuul.routes的键值队实际上绑定到类型为 ZuulProperties 的对象上. 如果你查看这个对象你会发现一个叫"retryable"的字段, 设置为"true"会使Ribbon客户端自动在失败时重试(如果你需要修改重试参数, 直接使用Ribbon客户端的配置)

X-Forwarded-Host 请求头默认在跳转时添加. 通过设置 zuul.addProxyHeaders = false 关闭它. 前缀路径默认剥离, 并且对于后端的请求通过请求头"X-Forwarded-Prefix"获取(上面的例子中是"/myusers")

通过@EnableZuulProxy 应用程序可以作为一个独立的服务, 如果你想设置一个默认路由("/"), 比如 zuul.route.home: /将路由所有的请求(例如: "/**")到"home"服务.

11.2、快速示例

步1、创建一个独立的SpringCloud微服务项目

创建maven项目:

springcloud-eureka-zuul

1.0

添加依赖:

spring-cloud-starter-netflix-eureka-client

spring-cloud-starter-netflix-zuul

步2、添加application.yml配置文件

与普通的eureka-client配置并没有太大的区别。

server:

port:3001

eureka:

client:

enabled:true

service-url:

defaultZone:http://Jack:1234@server1:8761/eureka/

spring:

application:

name:eureka-zuul

logging:

file:eureka-zuul.log

level:

root:INFO

步3、开发启动类

开发启动类,并添加@EnableZuulProxy注解。

importorg.springframework.boot.SpringApplication;

importorg.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

@EnableZuulProxy//添加ZuulProxy注解,此注解包含@EnableCircuitBreaker注解

@EnableEurekaClient

publicclassEurekaZuulApp {

publicstaticvoidmain(String[]args) {

SpringApplication.run(EurekaZuulApp.class,args);

}

}

步4、启动以下项目

分别启动:

1:eureka-server微服务注册发现中心项目。

2:eureka-movie项目集群。

3:启动eureka-zuul网关反向代理项目。

步5、通过路由访问其他微服务项目

由于8001,8002里面有一个服务,我们可以直接通过这两个端口访问这个服务如下:

Zuul项目启动后,会自动代理所有在eureka-server中注册的服务。所以现在我们可以通过3001端口访问movie电影微服务。只要输入电脑微服务的id即可,如下访问:

http://server1:3001/eureka-movie/movie/1

你已经看到了,只是在代理项目即端口后面输入电影微服务的id,后面再添加正常的url即可以实现访问电影微服务的资源。

步6、配置路由直接使用serviceid: /pattern/**(建议)

默认情况下,可以直接在路由的后面通过添加serviceid/url的形式访问其他微服务的资源。但serviceid也可以影射成其他的url规则,这一点是通过zuul的配置实现的。

现在我们将eureka-movie配置成movie:

application.yml:

zuul:

ignored-services:

-'*'#配置忽略的service,但不包含以下通过routes配置的规则

routes:

eureka-movie:/movie/**

截图:

现在就只能通过以下url来访问电影微服务的资源了:

http://server1:3001/movie/movie/1

上面的url中,第一个movie是配置到zuul中的影射名称。第二个movie是电影微服务中的url。

到此,您已经学会如何快速使用zuul了。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190214G09FET00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券