Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关。网关做为流量的,在微服务系统中有着很是做用。
网关常见的功能有前端
如上图所示,客户端向Spring Cloud Gateway发出请求。 若是Gateway Handler Mapping肯定请求与路由匹配(这个时候就用到predicate),则将其发送到Gateway web handler处理。 Gateway web handler处理请求时会通过一系列的过滤器链。 过滤器链被虚线划分的缘由是过滤器链能够在发送代理请求以前或以后执行过滤逻辑。 先执行全部“pre”过滤器逻辑,而后进行代理请求。 在发出代理请求以后,收到代理服务的响应以后执行“post”过滤器逻辑。这跟zuul的处理过程很相似。在执行全部“pre”过滤器逻辑时,每每进行了鉴权、限流、日志输出等功能,以及请求头的更改、协议的转换;转发以后收到响应以后,会执行全部“post”过滤器的逻辑,在这里能够响应数据进行了修改,好比响应头、协议的转换等。 mysql
增新一个项目 分别是服务提供方provider,消费方comsumer,注册中心eureka,网关gatewaygit
@RequestMapping("/hello")
@RestController
public class HelloController {
@GetMapping("")
public String hello(@RequestParam String name) {
return "Hello, " + name + "!";
}
}
复制代码
使用Feign调用github
@CommonsLog
@RequestMapping("/hello")
@RestController
public class HelloController {
@Autowired
HelloFeignService helloRemote;
@GetMapping("/{name}")
public String index(@PathVariable("name") String name) {
log.info("the name is " + name);
return helloRemote.hello(name) + "\n" + new Date().toString();
}
}
复制代码
增长 Hystrix 断路器web
@FeignClient(name = "producer", fallback = HelloFeignProviderHystrix.class)
public interface HelloFeignService {
/**
* @param name
* @return
*/
@GetMapping("/hello/")
String hello(@RequestParam(value = "name") String name);
}
复制代码
Spring Cloud gateway内置了不少校验条件谓语(predicate)来实现路由功能。
有两种方式配置,一种是配置文件application的方式,一种是代码配置面试
spring:
application:
name: sc-gateway-server
cloud:
gateway:
discovery:
locator:
# 是否能够经过其余服务的serviceId来转发到具体的服务实例。默认为false
# 为true,自动建立路由,路由访问方式:http://Gateway_HOST:Gateway_PORT/大写的serviceId/**,其中微服务应用名默认大写访问
enabled: true
routes:
- id: host_route
uri: http://httpbin.org:80/get
predicates:
- Host=**.csdn.** # 请求域名携带csdn的,则转发
- id: query_route
uri: http://httpbin.org:80/get
predicates:
- Query=username, zzz* # 请求参数含有username,且值知足zzz开头的,则转发(对值的匹配能够省略)
- id: header_route
uri: http://httpbin.org:80/get
predicates:
- Header=request, \d+ # 若是请求头含有request,且为数字,则转发
复制代码
gateway也提供了代码的方式配置,好比咱们注释掉上面的application配置,而后建一个配置类spring
@Configuration
public class GateWayConfig {
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route(r -> r.path("/fluent/**")
.uri("http://httpbin.org:80/get"))
.build();
}
}
复制代码
在上面的代码中,咱们使用了一个router,该router使用host去断言请求是否进入该路由,当请求的host有“/fluent/**”,都会进入该router,重定向到了“httpbin.org:80/get”。sql
Spring Cloud Gateway内置了许多Predict,这些Predict的源码在org.springframework.cloud.gateway.handler.predicate包中。缓存
列举各类Predicate以下图: bash
启动项目
输入URL 能够看到转到了 comsumer 的地址返回了provider的内容
推荐阅读
学习Java进阶技术干货、实践分享,职位内推,一块儿聊聊理想。志同道合的朋友,欢迎你的加入。