注意此处的配置 uri: lb://gateway-service 与之前都有所不同,之前都是指定了明确的转发地址,可以满足单个服务转发的需求,但是一般情况都会有多个服务,所以这里是指定的服务名称,格式为:lb://应用注册服务名。
启动注册中心工程(registry-service),网关工程(master-service)和服务工程 A/B(a-service、b-service)
项目启动成功后访问::8000/age
这时可能会报错 500.错误信息为 'Unable to find instance for gateway-service'
这种情况不要慌张,只是服务还没有被注册到注册中心,稍等片刻再访问
多次访问::8000/age
轮流输出内容:'I am three years old this year. aaa' 和 'I am three years old this year. bbb'
此时还通过网关达到了负载均衡的效果
证明转发指定服务并传入参数成功
master-service - 熔断 spring: #配置文件名称,用来标识不同环境的配置。由 spring.profiles.active 的值来决定使用哪组配置。 ##熔断 profiles: route_hystrix application: # 应用名称 name: gateway-master cloud: gateway: discovery: locator: # 是否和服务注册与发现组件结合,设置为 true 后可以直接使用应用名称调用服务 enabled: true # 路由(routes:路由,它由唯一标识(ID)、目标服务地址(uri)、一组断言(predicates)和一组过滤器组成(filters)。filters 不是必需参数。) routes: # 路由标识(id:标识,具有唯一性) 熔断 - id: route_hystrix # 目标服务地址(uri:地址,请求转发后的地址) uri: lb://gateway-service # 路由条件(predicates:断言,匹配 HTTP 请求内容) predicates: ## 匹配 GET 请求 - Method=GET # 过滤器(filters:过滤器,过滤规则) filters: ## 添加指定参数 - AddRequestParameter=age, three ## 熔断 - name: Hystrix args: name: fallbackcmd ### fallback 时调用的方法 :8000/fallback fallbackUri: forward:/fallback eureka: instance: # 使用 ip 代替实例名 prefer-ip-address: true # 实例的主机名 hostname: ${spring.cloud.client.ip-address} # 实例的 ID 规则 instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port} client: serviceUrl: # 注册中心地址 defaultZone: ${eureka.instance.hostname}:8761/eureka/ logging: level: # log 级别 org.springframework.cloud.gateway: debug
停止注册中心工程(registry-service),网关工程(master-service)和服务工程 A/B(a-service、b-service)
把 master-service - application.yml 配置文件中最上面的 spring.profiles.active 的值更改为 route_hystrix
上面配置文件内容意思是访问的路径 :8000/age (网关地址/age)会被转发到 (uri/age),并传入 'age=three' 参数(注意为 Get 请求)
注意此处的配置 uri: lb://gateway-service 与之前都有所不同,之前都是指定了明确的转发地址,可以满足单个服务转发的需求,但是一般情况都会有多个服务,所以这里是指定的服务名称,格式为:lb://应用注册服务名。
此处还多配置了一个过滤器 '- name: Hystrix'(熔断)
当请求服务出错时,会调用 fallback,路径为::8000/fallback (网关地址/fallback)
此时就需要如下前端控制器
master-service - 熔断 - controller package com.zwc.gateway.hystrix; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @ClassName FallbackController * @Desc TODO 网关断路器 * @Date 2019/6/23 19:33 * @Version 1.0 */ @RestController public class FallbackController { /* * @ClassName FallbackController * @Desc TODO 网关断路器 * @Date 2019/6/23 19:35 * @Version 1.0 */ @RequestMapping("/fallback") public String fallback() { return "I'm Spring Cloud Gateway fallback."; }}
8. 启动注册中心工程(registry-service),网关工程(master-service)和服务工程 A/B(a-service、b-service)
项目启动成功后访问::8000/age
输出内容:'I'm Spring Cloud Gateway fallback.'