一、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. dedecms使用

    使用到了dedecms内容管理系统,遇到两个问题: 1.点击登录后,没有登录进去也没有任何提示,一片空白 解决办法:我是把网站从云主机拷贝下来的,但是忘了云主机上的数据库密码和自己本地的数据库密码不一 ...

  2. 关于mysql内存表的一个帖子(转载)

    地址:http://bbs.csdn.net/topics/360030699 引用楼主 zgycsmb 的回复:问:1mysql的内存表性能怎么样2mysql的内存表与system v 这种共享内存 ...

  3. spring的容器(控制反转、依赖注入)

    一.spring的容器 ”容器“是spring的一个重要概念,其主要作用是完成创建成员变量,并完成装配. 而容器的特点”控制反转“和”依赖注入“是两个相辅相成的概念. 控制反转:我们在使用一个类型的实 ...

  4. win 7和虚拟机之间ping

    虚拟机的网卡和真实机的IP设为同一网段.用ping检查是否通,通了后用工具连接ssh看能否登录!如果成功的话winscp应该就能用了.如果不同就要就检查防火墙看是否开放了22端口,没有的话就要开放一下 ...

  5. ubus

    openwrt提供了一个系统总线ubus,类似linux桌面操作系统的d-bus,目标是提供系统级的进程间通信(IPC)功能. 为了提供各种后台进程和应用程序之间的通信机制,ubus被开发出来,由3部 ...

  6. tuning 03 Sizing the Share pool

    share pool : (组成) library cache: stores shared sql and pl/sql code (包含 statement text, parsed code, ...

  7. java程序调用kettle

    (1).将相应的kettle的jar包导入的java项目,主要的jar包有一下几个. (2).java程序. package cn.com.taiji.oosweb.test.web; import ...

  8. .net 编码常见问题

    问题一: windows service 启动时需要用死循环来控制程序,如果不开启异步,死循环会导致windows sevice 程序无法启动,代码情况如下 protected override vo ...

  9. A Deep Compositional Framework for Human-like Language Acquisition in Virtual Environment

    论文地址:https://128.84.21.199/abs/1703.09831 这篇论文来自于百度的机器学习研究院,作者为:徐伟.余昊男.张海超 这篇论文用了多种技术的组合: reinforcem ...

  10. 初识Python、PyCharm、Anaconda与tensorflow

    最近裸辞了,未来希望转深度学习.语音识别.文本挖掘,觉得这块特别有意思,比较好玩.开始自学相关知识,为了能够独立地.系统地了解和学习相关知识,计划不定期记录和更新一些平时的学习总结,个人关于以上几个方 ...