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文件,因为使用属性文件会丢失优先级。