0601-Zuul构建API Gateway-API gateway简介、基础使用、路由配置、负载配置
一、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、使用正则配置
@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简介、基础使用、路由配置、负载配置的更多相关文章
- 从0开始构建你的api网关--Spring Cloud Gateway网关实战及原理解析
API 网关 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题 ...
- 在 Traefik 中使用 Kubernetes Gateway API
文章转载自:https://mp.weixin.qq.com/s/QYy8ETBB-xqU0IMI7YuTWw Gateway API(之前叫 Service API)是由 SIG-NETWORK 社 ...
- Golang Gateway API 搭建教程
原文链接 随着微服务的兴起,行业里出现了非常多优秀的微服务网关框架,今天教大家搭建一套国人,用Golang写的微服务网关框架. 这里啰嗦一句,可能到今天还有人不理解什么是微服务,为什么要用微服务.目前 ...
- 浅谈API网关(API Gateway)如何承载API经济生态链
序言 API经济生态链已经在全球范围覆盖, 绝大多数企业都已经走在数字化转型的道路上,API成为企业连接业务的核心载体, 并产生巨大的盈利空间.快速增长的API规模以及调用量,使得企业IT在架构上.模 ...
- 利用Vert.x构建简单的API 服务、分布式服务
目前已经使用Vertx已经一年多了,虽然没有太多的造诣,但也已在项目中推广了下:从最初的vertx搭建web服务,到项目上线运营,还算比较稳定.再到后来尝试搭建基于vertx的分布式服务,一路下来也积 ...
- 最全面的改造Zuul网关为Spring Cloud Gateway(包含Zuul核心实现和Spring Cloud Gateway核心实现)
前言: 最近开发了Zuul网关的实现和Spring Cloud Gateway实现,对比Spring Cloud Gateway发现后者性能好支持场景也丰富.在高并发或者复杂的分布式下,后者限流和自定 ...
- API各函数作用简介
API各函数作用简介 1.控件与消息函数 AdjustWindowRect 给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小 AnyPopup 判断屏幕上是否存在任何弹出式窗口 ArrangeI ...
- [译]Quartz 框架 教程(中文版)2.2.x 之第二课 Quartz API,Jobs和Triggers简介
第二课:QuartzAPI,Jobs和Triggers简介 Quartz API Quartz API 关键的几个接口: Scheduler:跟任务调度相关的最主要的API接口. Job:你期望任务调 ...
- Redis API与常用数据类型简介
Redis API与常用数据类型简介 一.Redis API For .Net 首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些 ...
随机推荐
- Makefile 13——理解make的解析行为
make是以从上到下的顺序读入Makefile中的内容的.然而,处理Makefile中的语句却并非完全从上到下. 大体上,make处理一个Makefile分为两个阶段.第一个阶段包含: 1.make读 ...
- PHP学习笔记(6)js点击刷新验证码
用“换一张”来控制验证码刷新,js脚本怎么写 宏朋雄 | 浏览 3663 次 2012-06-11 22:41 2012-06-12 01:49 最佳答案 <img src=“验证码文 ...
- WebService 页面重定向错误
“/”应用程序中的服务器错误. 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败. xxx.xxx.xxx.xxx:xx 说明: 执行当前 Web 请求期间,出现未经处理的异常.请 ...
- Spring的核心机制——依赖注入(Dependency Inject)
Spring不仅提供对象,还提供对象的属性值,而不是由使用该对象的程序所提供的. Java应用是由一些相互协作的对象所组成的,在Spring中这种相互协作的关系就叫依赖关系. 如果A组件调用了B组件的 ...
- mysql—Access denied for user 'root'@'localhost' (using password:NO)
安装mysql未设置初始密码,登录提示Access denied for user 'root'@'localhost' (using password:NO): 解决方案: sudo /etc/i ...
- Android将指定的.class打包到mainDex中
1️⃣ 我们分包的时候会遇到一个问题,因为加载和初始化的问题,如果某个类不在mainDex中,那么程序就会报错,java.lang.NoClassDefFoundError. 2️⃣ 在gradle中 ...
- php在linux中执行外部命令
目录:一.PHP中调用外部命令介绍二.关于安全问题三.关于超时问题四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍在PHP中调用外部命令,可以用,1>调用专门函数. ...
- webservice linux 杀进程
一 . linux 下首先查看进程 ./stopServcer.sh server1如果停不掉websphere服务.则强制杀掉其进程! 1.查看websphere进程号bejqylc06:~ # ...
- Angular2 初识
AppComponent 壳的三个实现文件: app.component.ts— 组件的类代码,这是用 TypeScript 写的. app.component.html— 组件的模板,这是用 HTM ...
- Linux shell 1-初步认识
1.什么是linux linux是一种操作系统,它可划分为以下四部分 1.linux内核(Linux系统的核心,负责管理系统内存,硬件驱动,文件系统等) 2.GNU工具(一组软件工具,提供一些类UNI ...