API网关作用就是把各个服务对外提供的API汇聚起来,让外界看起来是一个统一的接口。同时也可在网关中提供额外的功能。
总结:网关就是所有项目的一个统一入口。
1.准备Eureka注册中心
2.准备一个微服务工程
3.搭建Gateway网关微服务
(1)导入依赖
(3)编写启动类
@SpringBootApplicationpublicclassGatewayApplication{publicstaticvoidmain(String[]args){SpringApplication.run(GatewayApplication.class,args);}}
谓词:当满足条件在进行路由转发。
在SpringCloudGateway中谓词实现GatewayPredicate接口。其中类名符合:XXXRoutePredicateFactory,其中XXX就是在配置文件中谓词名称。
所有的谓词都设置在predicates属性中,当设置多个谓词时取逻辑与条件,且一个谓词只能设置一组条件,如果需要有个多条件,添加多个相同谓词。
(1)Path
用于匹配路由地址规则的谓词。
spring:application:name:cloud-gatewaycloud:gateway:discovery:locator:enabled:false#关闭自动发现工具的本地路由逻辑lower-case-service-id:trueroutes:#配置多路由策略的属性,类型是List。配置方案是:回车+缩进+-+空格。集合中的每个对象的属性,对齐多行配置-id:application-service#路由的唯一名称uri:lb://application-service#规则满足后,转发到的地址。lb是springcloudgateway支持的一种协议名predicates:#谓词-Path=/service/**#路由地址规则filters:#过滤器,先使用,后续课程细致讲解。后续案例配置统一,文档中省略-StripPrefix=1
(2)Query
用于校验请求中是否包含指定的请求参数,同时可也校验请求参数值是否符合要求。
-id:application-serviceuri:lb://application-servicepredicates:#谓词-Path=/service/**-Query=name#请求参数必须包含name
如果设定请求中必须包含多个参数及值。则设置多个Query。在此处演示多个相同谓词配置,其他谓词中就不在强调如何配置多个谓词。
-id:application-serviceuri:lb://application-servicepredicates:-Path=/service/**-Query=name,bjsxt.*#请求参数必须包含name,请求参数的值必须以bjsxt开头-Query=age#请求参数必须包含age
(3)Header
用于校验请求中是否包含指定的请求头,同时可也校验请求头数值是否符合要求。配置方式和Query类似。
-id:application-serviceuri:lb://application-servicepredicates:-Path=/service/**-Query=name,bjsxt.*-Query=age-Header=Host,.*#请求头必须有Host,值为任意字符串
(4)Method
Method表示请求方式。支持多个值,使用逗号分隔,多个值之间为or条件。
-id:application-serviceuri:lb://application-servicepredicates:-Path=/service/**-Method=GET,POST#请求方式必须是GET或POST
(5)RemoteAddr
允许访问的客户端地址。
-id:application-serviceuri:lb://application-servicepredicates:-Path=/service/**-RemoteAddr=192.168.41.252#客户端IP必须是192.168.41.252
(6)Host
匹配请求中Host请求头的值。满足Ant模式(之前在SpringSecurity中学习过)可以使用:
-id:application-serviceuri:lb://application-servicepredicates:-Path=/service/**-Host=127.0.0.1:9999#请求头Host值必须是127.0.0.1:9999
(7)Cookie
要求请求中包含指定Cookie名和满足特定正则要求的值。
Cookie必须有两个值,第一个Cookie包含的参数名,第二个表示参数对应的值,正则表达式。不支持一个参数写法。
-id:application-serviceuri:lb://application-servicepredicates:-Path=/service/**-Cookie=name,bjsxt.*#请求必须包含名称是name,值符合bjsxt开头的cookie。
(8)Before
-id:application-serviceuri:lb://application-servicepredicates:-Path=/service/**-Before=2022-10-01T18:00:00.000+08:00[Asia/Shanghai]#2022-10-01晚18点前可以访问
(9)After
-id:application-serviceuri:lb://application-servicepredicates:-Path=/service/**-After=2020-10-01T08:00:00.000+08:00[Asia/Shanghai]#2020-10-01早8点后可以访问
(10)Between
-id:application-serviceuri:lb://application-servicepredicates:-Path=/service/**-Between=2020-10-01T08:00:00.000+08:00[Asia/Shanghai],2022-10-01T18:00:00.000+08:00[Asia/Shanghai]#2020-10-01早8点后,2022-10-01晚18点前可以访问
(11)Weight
多版本服务发布的时候,偶尔使用。
如v1.0+v1.1两个版本同时发布服务。内容一致,实现机制不同。发布两个不同命名的服务集群。使用Gateway做负载均衡并设置权重。代表同一个组中URI进行负载均衡。语法:Weight=组名,负载均衡权重在Eureka中注册两个服务,这个服务(项目)是相同的,应用程序名分别叫做application-service1和application-service2。Gateway在路由匹配时application-service1将占20%,application-service2将占80%。
-id:application-service1uri:lb://application-service1predicates:-Path=/service/**-Weight=group1,2-id:application-service2uri:lb://application-service2predicates:-Path=/service/**-Weight=group1,8
在路由转发到代理服务之前和代理服务返回结果之后额外做的事情。Filter是在路由转发之后,被代理的服务执行前后运行的。只要Filter执行了,说一定满足了谓词条件。在SpringCloudGateway的路由中Filter分为:
(1)StripPrefix
跳过路由uri中前几段后发送给下游。
spring:application:name:cloud-gatewaycloud:gateway:discovery:locator:enabled:falselower-case-service-id:trueroutes:-id:application-serviceuri:lb://application-servicepredicates:-Path=/service/**filters:#过滤器-StripPrefix=1#跳过路由uri中前1段后发送给下游。
(2)AddRequestHeader
添加请求头参数,参数名和值之间使用逗号分隔。
filters:-StripPrefix=1-AddRequestHeader=company,bjsxt
(3)AddRequestParameter
添加请求表单参数,多个参数需要有多个过滤器。
filters:-StripPrefix=1-AddRequestParameter=name,bjsxt-AddRequestParameter=age,18
(4)AddResponseHeader
添加响应头。
filters:-StripPrefix=1-AddResponseHeader=company,bjsxt··
(5)DedupeResponseHeader
对指定响应头去重复。配置语法:DedupeResponseHeader=响应头参数或DedupeResponseHeader=响应头参数,strategy。
RETAIN_UNIQUE保留唯一的,出现重复的属性值,会保留一个。例如有两个My:bbb的属性,最后会只留一个。
filters:-StripPrefix=1-DedupeResponseHeader=MyHeader,RETAIN_UNIQUE
(6)CircuitBreaker
实现熔断时使用,支持CircuitBreaker和Hystrix两种。
(7)FallbackHeaders
可以添加降级时的异常信息。
(8)PrefixPath
给符合规则替换后的URI地址添加统一的前缀地址。
(9)RequestRateLimiter
限流过滤器。
(10)RedirectTo
重定向。有两个参数,status和url。其中status应该300系列重定向状态码。
(11)RemoveRequestHeader
删除请求头参数。
(12)RemoveResponseHeader
删除响应头参数。
(13)RemoveRequestParameter
删除请求参数。
(14)RewritePath
重写请求路径。
(15)RewriteResponseHeader
重写响应头参数。
(16)SaveSession
如果项目中使用SpringSecurity和SpringSession整合时,此属性特别重要。
(17)SecureHeaders
具有权限验证时,建议的头信息内容。
(18)SetPath
功能和StripPrefix有点类似。语法更贴近restful。
(19)SetRequestHeader
替换请求参数头数。不是添加。
(20)SetResponseHeader
替换响应头参数。
(21)SetStatus
设置响应状态码。
(22)Retry
设置重试次数。
(23)RequestSize
请求最大大小。包含maxSize参数,单位包括“KB”或“MB”等。默认为“B”。
(24)ModifyRequestBody
修改请求体内容。
(25)ModifyResponseBody
修改响应体
令牌桶算法
令牌桶算法可以说是对漏桶算法的一种改进。
在桶中放令牌,请求获取令牌后才能继续执行。如果桶中没有令牌,请求可以选择进行等待或者直接拒绝。
由于桶中令牌是按照一定速率放置的,所以可以一定程度解决突发访问。如果桶中令牌最多有100个,QPS最大为100。
/***服务降级控制器*/@ControllerpublicclassFallbackController{/***服务降级处理方法。*当通过gateway转发请求的服务,不可用时,当前方法执行。返回降级数据。*@return*/@RequestMapping(value="/fallback",produces={"text/html;charset=UTF-8"})@ResponseBodypublicStringfallback(){return"
-id:hystrixuri:lb://application-servicepredicates:-Path=/hystrix/**filters:-StripPrefix=1-name:Hystrixargs:name:fallback#随意定义的名称。相当于@HystrixCommand注解中的commandKey属性。fallbackUri:forward:/fallback#如果转发的服务不可用,请求转发到当前系统的哪一个路径上。
编辑全局过滤器
/***自定义全局过滤器。*必须实现接口GlobalFilter*当前类型的对象,必须被spring容器管理。*无须配置,所有路由都生效。**执行顺序:*先执行网关过滤器,后执行全局过滤器*多个全局过滤器,执行顺序由Springboot扫描管理当前对象的顺序决定。*每个过滤器,都是完整执行后,才执行下一个过滤器。*/@ComponentpublicclassMyGlobalFilterimplementsGlobalFilter{/***过滤方法。*实现上,只有唯一的要求。必须调用方法chain.filter(exchange),并把方法的返回值,返回。*@paramexchange*@paramchain*@return*/@OverridepublicMono
定义针对于Router的Filter。必须经由配置才能生效。注意: