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直接进行连接,需要使用一些 ...
随机推荐
- deepin linux 15.3安装完eclipse启动报错An error has occurred.
原因是系统中安装了jdk9 导致的. 卸载jdk9就可以了 $ java -version Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings ...
- UITextField/UITextView限制字数
一,UITextFild限制字数(三步) 1,给textfild添加响应事件,类型为:UIControlEventEditingChanged [self.nickNameFild addTarget ...
- azkaban入门中遇到的问题
执行时报错,后来发现他的配置文件中写了相对路径!!所以必须在他的根目录下执行,命令为 nohup bin/azkaban-web-start.sh 1>/tmp/azstd.out 2&g ...
- PHP——上传文件
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 国内外知名IT科技博客(强烈推荐)
国内 1.36氪(www.36kr.com): 目前国内做的最风生水起的科技博客,以介绍国内外互联网创业新闻为主的博客网站,自己建立有36Tree互联网创业融投资社区.36氪的名字源于元素周期 表的第 ...
- 【Mac + GitHub】之在另一台Mac电脑上下载GitHub的SSH链接报错
当输入git命令github项目时报错: ⇒ git clone git@github.com:/TX-Class.git Cloning into 'TX-Class'... Warning: Pe ...
- idea编译修改jdk版本
由于项目需要,需要修改jdk的版本为1.8,这里记录一下修改的地方 1,项目的jdk版本 右键点击项目-> open module setting ->project,然后如图所示 2,在 ...
- The.first.glance.at.linux.commands
## Get Ubuntu Version Info lsb_release -a ## Get Linux kernal info uname -a ## Get Computer name ech ...
- Switch选择语句能否作用在String【字符串】上,也就是能否这么写:Switch(一个字符串变量)?
Switch选择语句能否作用在String[字符串]上,也就是能否这么写:Switch(一个字符串变量)? 解答:不可以,只能处理int,byte,short,char,(其实是只能处理int,其它三 ...
- Text类型的字段进行数据替换
一.text不大于8000 varchar和nvarchar类型是支持replace函数的,所以如果你的text不超过8000,可以先转换成前面两种类型再使用replace. UPDATE News ...