一、API Gateway简介

参看:http://www.cnblogs.com/bjlhx/p/8794437.html

二、zuul简介【路由器和过滤器:Zuul】

  在微服务架构的组成部分进行路由。例如,/可能映射到您的Web应用程序,/ api / users映射到用户服务,并且/ api / shop映射到商店服务。Zuul是Netflix提供的基于JVM的路由器和服务器端负载均衡器。

  Netflix使用Zuul进行以下操作:

    认证、洞察、压力测试、金丝雀测试、动态路由、服务迁移、加载脱落、安全、静态响应处理、主动/主动流量管理

  Zuul的规则引擎允许使用基本上任何JVM语言编写规则和过滤器,并支持Java和Groovy。

  注意1:配置属性zuul.max.host.connections已被两个新属性zuul.host.maxTotalConnections和zuul.host.maxPerRouteConnections取代,默认值分别为200和20。

  注意2:所有路由的默认Hystrix隔离模式(ExecutionIsolationStrategy)为SEMAPHORE。如果此隔离模式为首选,则zuul.ribbonIsolationStrategy可以更改为THREAD。

2.1、嵌入式Zuul反向代理

  Spring Cloud已经创建了一个嵌入式Zuul代理来缓解UI应用程序希望将调用代理调用到一个或多个后端服务的非常常见的用例的开发。此特性对于用户界面代理其所需的后端服务非常有用,从而避免需要独立管理所有后端的CORS和身份验证问题。

  要启用它,使用@EnableZuulProxy注释一个Spring Boot主类,并且将本地调用转发给相应的服务。按照惯例,具有ID“用户”的服务将接收来自位于/ users的代理的请求(剥离了前缀)。代理使用功能区找到要通过Ribbon转发的实例,并且所有请求都在hystrix命令中执行,因此故障将显示在Hystrix指标中,一旦断路器打开,代理不会尝试联系服务。

  注意:Zuul启动器不包含发现客户端,所以对于基于服务ID的路由,您需要在类路径中提供其中的一个(例如,Eureka是一种选择)。

2.1.1、使用

pom引用

        <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>

启动类增加@EnableZuulProxy

@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}

配置文件

spring:
application:
name: microservice-gateway-zuul
server:
port: 8040
eureka:
client:
serviceUrl:
defaultZone: http://user:a123@localhost:8761/eureka/
instance:
prefer-ip-address: true

开始启动Eureka项目,在启动user-provider项目,在启动Zuul项目

  通过zuul访问:http://192.168.199.211:8040/microservice-provider-user/sample/1

2.1.2、路由规则

1、简化微服务名称

  将microservice-provider-user路由成user

zuul:
routes:
microservice-provider-user: /user/**

2、只想反向代理 microservice-provider-user用户服务,其他不代理

zuul:
ignoredServices: '*'
routes:
users: /myusers/**

或者忽略具体的,使用“,”分隔

3、为了更好地控制路由,您可以独立指定路径和serviceId:

zuul:
routes:
user-controller: #名称任意
path: /user/**
serviceId: microservice-provider-user

这意味着http调用“/ myusers”被转发到“users_service”服务。路由必须有一个可以指定为ant样式的“路径”,因此“/myusers/*”只匹配一个级别,但“/myusers/**”分层次匹配。

4、可以将后端的位置指定为“serviceId”(对于来自发现的服务)或“url”(对于物理位置)

zuul:
routes:
user-controller: #名称任意
path: /user/**
url: http://127.0.0.1:7900/

5、负载均衡

这些简单的url路由不会作为HystrixCommand执行,也不会使用Ribbon来负载多个URL。

方法一、为了达到这个目的,你可以用一个静态的服务器列表来指定一个serviceId:

zuul:
routes:
echo: #名称任意
path: /microservice/**
serviceId: microservice-provider-user
stripPrefix: true hystrix:
command:
microservice-provider-user:
execution:
isolation:
thread:
timeoutInMilliseconds: 10000 microservice-provider-user: #微服务的ID
ribbon:
NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
ListOfServers: http://localhost:7900,http://localhost:7901
ConnectTimeout: 1000
ReadTimeout: 3000
MaxTotalHttpConnections: 500
MaxConnectionsPerHost: 100

方法二、另一种方法是指定一个服务路由并为serviceId配置一个Ribbon客户端(这需要禁用功能区中的Eureka支持:有关详细信息,请参阅上文)。

ribbon:
eureka:
enabled: false
zuul:
routes:
user-controller: #名称任意
path: /user/**
serviceId: microservice-provider-user
microservice-provider-user: #微服务的ID
ribbon:
listOfServers: http://localhost:7900,http://localhost:7901

注:前6个参考代码:https://github.com/bjlhx15/spring-cloud/tree/master/microservice-gateway-zuul

6、使用正则配置

  您可以使用regexmapper在serviceId和路由之间提供约定。它使用正则表达式命名组从serviceId提取变量并将它们注入路由模式。
@Bean
public PatternServiceRouteMapper serviceRouteMapper() {
return new PatternServiceRouteMapper("(?<name>^.+)-(?<version>v.+$)", "${version}/${name}");
}

  这意味着serviceId“myusers-v1”将被映射为路由“/ v1 / myusers / **”。任何正则表达式都被接受,但所有已命名的组必须存在于servicePattern和routePattern中。如果servicePattern与serviceId不匹配,则使用默认行为。

参看代码:https://github.com/bjlhx15/spring-cloud/tree/master/microservice-gateway-zuul-reg-exp

7、 映射前缀

  要为所有映射添加前缀,请将zuul.prefix设置为值,例如/ api。代理前缀在请求被默认转发之前从请求中剥离(使用zuul.stripPrefix = false关闭此行为)。您还可以关闭从单个路由中剥离服务特定的前缀,例如

设置前缀:

zuul:
prefix: /api

  请求地址:http://192.168.199.211:8040/api/v1/microservice-provider-user/sample/1

剥离前缀

zuul:
routes:
users:
path: /myusers/**
stripPrefix: false

zuul.stripPrefix特别适用于zuul.prefix,是全局的;zuul.routes.<route> .stripPrefix适用于zuul.routes.<route> .path,是局部的

注意:zuul.stripPrefix仅适用于在zuul.prefix中设置的前缀。它对给定路径路径中定义的前缀没有任何影响。

日志跟踪代码

logging:
level:
com.netflix: debug

8、忽略具体路径

 zuul:
ignoredPatterns: /**/admin/**
routes:
users: /myusers/**

  这意味着诸如“/ myusers / 101”的所有呼叫都将被转发到“用户”服务上的“/ 101”。但包括“/ admin /”的调用不会解决。

9、针对某个服务使用路由,其他不适用

 zuul:
routes:
users:
path: /myusers/**
legacy:
path: /**

针对用户路由使用/myusers/**;其他使用/**

注意:如果您需要您的顺序以保留其优先级,则需要使用YAML文件,因为使用属性文件会丢失优先级。

  

0601-Zuul构建API Gateway-API gateway简介、基础使用、路由配置、负载配置的更多相关文章

  1. 从0开始构建你的api网关--Spring Cloud Gateway网关实战及原理解析

    API 网关 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题 ...

  2. 在 Traefik 中使用 Kubernetes Gateway API

    文章转载自:https://mp.weixin.qq.com/s/QYy8ETBB-xqU0IMI7YuTWw Gateway API(之前叫 Service API)是由 SIG-NETWORK 社 ...

  3. Golang Gateway API 搭建教程

    原文链接 随着微服务的兴起,行业里出现了非常多优秀的微服务网关框架,今天教大家搭建一套国人,用Golang写的微服务网关框架. 这里啰嗦一句,可能到今天还有人不理解什么是微服务,为什么要用微服务.目前 ...

  4. 浅谈API网关(API Gateway)如何承载API经济生态链

    序言 API经济生态链已经在全球范围覆盖, 绝大多数企业都已经走在数字化转型的道路上,API成为企业连接业务的核心载体, 并产生巨大的盈利空间.快速增长的API规模以及调用量,使得企业IT在架构上.模 ...

  5. 利用Vert.x构建简单的API 服务、分布式服务

    目前已经使用Vertx已经一年多了,虽然没有太多的造诣,但也已在项目中推广了下:从最初的vertx搭建web服务,到项目上线运营,还算比较稳定.再到后来尝试搭建基于vertx的分布式服务,一路下来也积 ...

  6. 最全面的改造Zuul网关为Spring Cloud Gateway(包含Zuul核心实现和Spring Cloud Gateway核心实现)

    前言: 最近开发了Zuul网关的实现和Spring Cloud Gateway实现,对比Spring Cloud Gateway发现后者性能好支持场景也丰富.在高并发或者复杂的分布式下,后者限流和自定 ...

  7. API各函数作用简介

    API各函数作用简介 1.控件与消息函数 AdjustWindowRect 给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小 AnyPopup 判断屏幕上是否存在任何弹出式窗口 ArrangeI ...

  8. [译]Quartz 框架 教程(中文版)2.2.x 之第二课 Quartz API,Jobs和Triggers简介

    第二课:QuartzAPI,Jobs和Triggers简介 Quartz API Quartz API 关键的几个接口: Scheduler:跟任务调度相关的最主要的API接口. Job:你期望任务调 ...

  9. Redis API与常用数据类型简介

    Redis API与常用数据类型简介 一.Redis API For .Net 首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些 ...

随机推荐

  1. 什么是BOM

    什么是BOM BOM(byte-order mark),即字节顺序标记,它是插入到以UTF-8.UTF16或UTF-32编码Unicode文件开头的特殊标记,用来识别Unicode文件的编码类型.对于 ...

  2. linux学习笔记34--命令rcp和scp

    rcp代表“remote file copy”(远程文件拷贝).该命令用于在计算机之间拷贝文件.rcp命令有两种格式.第一种格式用于文件到文件的拷贝:第二种格式用于把文件或目录拷贝到另一个目录中. 1 ...

  3. (译)Getting Started——1.3.2 Using Design Patterns(使用设计模式)

    设计模式解决了一个常见的软件工程学问题.模式不是编码,它是抽象的设计.它用于帮助开发者定义数据模型的结构和应用的交互.如果你采用了某种设计模式,你需要把它的一般形式适配到你特殊的需求上.不论你的应用是 ...

  4. oracle tuning 工具

    工欲善其事, 必先利其器. oracle 调优方面有很多工具, 目前 UI 个人只打算使用 Toad. 重要文件 一. alert log file. (位置 parameter BACKGROUND ...

  5. 下面的那一个不属于MVC模式中的对象?

    下面的那一个不属于MVC模式中的对象? A. Model B. View C. Collection D. Controller 解答:C MVC是三个单词的缩写,分别为: 模型(Model),视图( ...

  6. 简要描述如何结合struts、hibernate、spring开发Web应用?

    简要描述如何结合struts.hibernate.spring开发Web应用? 解答:Struts可以将jsp页面的表单关联起来,就是把JSP页面的表单数据封装成javaBean,这样的话,在acti ...

  7. JSP数据库连接成功

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  8. json 字符串 对象 互转

    json对象,json字符串,不注意的话,很容易忽视混淆.例举几个容易混的情况 1,php将变量放到input框中,通过js去读取出来的是json字符串,要想使用就要将json字段串转成json对象 ...

  9. VC++ Debug格式化数值显示

    When you watch variables in the Watch or Quick Watch window, the values are displayed using the defa ...

  10. mybatis总结(二)

    实现简单的crud,上一节已经进行最简单的查询 这次在oracle数据库中操作,就在oracle实例中操作,分别是Dept表和Emp表,所以配置文件需要改动. 1.实体类 Dept类 public c ...