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直接进行连接,需要使用一些 ...
随机推荐
- 解决:std::ostream operator<< should have been declared inside 'xxx'
用VS的NMAKE构建,不会报错,但是用GNU MAKE构建,就会报错.(尝试删除Toast.h中第24行的声明) 因此在遇到类似的情况的时候,记得不仅class里面要有friend声明,namesp ...
- url参数
两个参数情况: String url="http://59.78.93.208:9097/Order?id="+id+"&value="+value; ...
- HTML5坦克大战(1)绘制坦克
坦克尺寸如下: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head&g ...
- 分享 stormzhang的Andoid学习之路
硬件 电脑–推荐Mac 首先声明我不是果粉,个人Windows,Linux,Mac OX系统均用过, 只能说Windows上面的开发工具简直难以恭维,尤其命令行超级难用,而Linux自己必须得花不少时 ...
- pycharm-community-3.1.1.tar.gz下载
国外服务器着实慢, 下载地址:http://yun.baidu.com/share/link?shareid=2521912381&uk=3020189984
- angularjs 手动启动
谷歌推的javascript框架angulajs相当火热,由于新项目的缘故,最近一直看angularjs.在看的时候,一直有个疑问,angularjs 核心依赖于DI(依赖注入).常用的方法是在页面的 ...
- ARM与X86架构的对决[整编]
CISC(复杂指令集计算机)和RISC(精简指令集计算机)是当前CPU的两种架构.它们的区别在于不同的CPU设计理念和方法.早期的CPU全部是CISC架构,它的设计目的是 CISC要用最少的机器语言 ...
- thinkphp 读取页面报错 说 /Runtime/Cache/Home/XXXXXX.php 错误
thinkphp _STORAGE_WRITE_ERROR_:./Runtime/Cache/Home/xxxx.php 这一种报错一般是在linux 才会出现的错误,因为是权限问题.把Home文件加 ...
- Swift-7-闭包
// Playground - noun: a place where people can play import UIKit // swift 中闭包与C和OC中的blocks比较相似 // 1. ...
- 11个免费的Web安全测试工具
1.Netsparker Community Edition(Windows) 这个程序可以检测SQL注入和跨页脚本事件.当检测完成之后它会给你提供一些解决方案. 2.Websecurify(Wind ...