三、GateWay网关

GateWay网关

1.创建GateWay网关服务

1.1.选用阿里云仓库,引入网关服务依赖(创建时可直接勾选),等待完成项目构建。(全量配置)

<dependency>
	<--! GateWay网关服务依赖 -->
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

1.2.如果没有/resources/application.yml文件需自行创建,这个配置也可放入远端,通过上章的配置中心获取,目前先不修改了。(全量配置)

server:
  port: 9900  #本项目服务端口
spring:
  application:
    name: gateway-server  #项目名称
  cloud:
    gateway:
      routes: #路由ID、目标URL
        - id: routes_1
          predicates: #断言机制(复合条件,以下条件需要全部满足)
            - Path=/gateway/**  #路径中以gateway开头
#            - Query=key,1 #请求参数和值必须包含key=1
#            - Method=GET  #请求方式必须是GET
#            - Fg7=Host #(请求头包含Host才可以访问)自定义断言Fg7RoutePredicateFactory需继承AbstractRoutePredicateFactory,且必须以RoutePredicateFactory结尾,Fg7默认为name
          filters:
            - StripPrefix=1 #清除第1段请求内容,多个就写多个 (http://localhost:9088/gateway/** -> http://localhost:9088/**)
#            - Fg7=自定义过滤器  #(可以对请求或返回做特殊处理)自定义过滤Fg7GatewayFilterFactory需继承AbstractGatewayFilterFactory,且必须以GatewayFilterFactory结尾,默认Fg7为name
          uri: http://localhost:9600/ #拦截后路由服务地址
eureka:
  instance:
    prefer-ip-address: true #从hostname:port变为ip:port
    instance-id: server:${server.port}
  client:
    service-url:
      defaultZone: http://localhost:9800/eureka,http://localhost:9801/eureka,http://localhost:9802/eureka #【需动态获取,配置中心】

2.自定义断言/过滤类,针对特殊场景,非必须操作步骤

2.1.自定义断言类Fg7RoutePredicateFactory,需继承AbstractRoutePredicateFactory,且必须以RoutePredicateFactory结尾,Fg7默认为name。

import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;import org.springframework.http.HttpHeaders;import org.springframework.stereotype.Component;import org.springframework.web.server.ServerWebExchange;import java.util.Arrays;import java.util.List;import java.util.function.Predicate;@Component public class Fg7RoutePredicateFactory extends AbstractRoutePredicateFactory<Fg7RoutePredicateFactory.Config> { Logger logger = LoggerFactory.getLogger(Fg7GatewayFilterFactory.class);public Fg7RoutePredicateFactory() {super(Config.class);}@Override public Predicate<ServerWebExchange> apply(Config config) {return webExchange -> {logger.info("【pred】" + config.getName());HttpHeaders headers = webExchange.getRequest().getHeaders();List<String> list = headers.get(config.getName());logger.info("【Post】" + list);return list == null || list.size() <= 0 ? false : true;};}public static final String NAME_KEY = "name";@Override public List<String> shortcutFieldOrder() {return Arrays.asList(NAME_KEY);}public static class Config { private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}}

2.2.自定义过滤Fg7GatewayFilterFactory,需继承AbstractGatewayFilterFactory,且必须以GatewayFilterFactory结尾,默认Fg7为name。

import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.cloud.gateway.filter.GatewayFilter;import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;import org.springframework.stereotype.Component;import reactor.core.publisher.Mono;import java.util.Arrays;import java.util.List;@Component public class Fg7GatewayFilterFactory extends AbstractGatewayFilterFactory<Fg7GatewayFilterFactory.Config> { Logger logger = LoggerFactory.getLogger(Fg7GatewayFilterFactory.class);public Fg7GatewayFilterFactory() {super(Config.class);}@Override public GatewayFilter apply(Config config) {return ((exchange, chain) -> {logger.info("【pred】" + config.getName());return chain.filter(exchange).then(Mono.fromRunnable(() -> {String status = exchange.getResponse().getStatusCode().toString();logger.info("【Post】" + status);}));});}public static final String NAME_KEY = "name";@Override public List<String> shortcutFieldOrder() {return Arrays.asList(NAME_KEY);}public static class Config { private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}}

3.实现负载均衡

3.1.添加注册中心客户端依赖。(全量配置)

<dependency>
	<--! GateWay网关服务依赖 -->
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
	<--! Eureka注册中心客户端依赖 -->
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

3.2.编辑application.yml文件。(全量配置)

server:
  port: 9900  #本项目服务端口
spring:
  application:
    name: gateway-server  #项目名称
  cloud:
    gateway:
      discovery:
        locator:
          lower-case-service-id: true #大小写敏感[增加]
          enabled: true #开启服务地址的发现[增加]
      routes: #路由ID、目标URL
        - id: routes_1
          predicates: #断言机制(复合条件,以下条件需要全部满足)
            - Path=/gateway/**  #路径中以gateway开头
#            - Query=key,1 #请求参数和值必须包含key=1
#            - Method=GET  #请求方式必须是GET
#            - Fg7=Host #(请求头包含Host才可以访问)自定义断言Fg7RoutePredicateFactory需继承AbstractRoutePredicateFactory,且必须以RoutePredicateFactory结尾,Fg7默认为name
          filters:
            - StripPrefix=1 #清除第1段请求内容,多个就写多个 (http://localhost:9088/gateway/** -> http://localhost:9088/**)
#            - Fg7=自定义过滤器  #(可以对请求或返回做特殊处理)自定义过滤Fg7GatewayFilterFactory需继承AbstractGatewayFilterFactory,且必须以GatewayFilterFactory结尾,默认Fg7为name
#          uri: http://localhost:9088/ #拦截后路由地址 [修改]
          uri: lb://product-server #从注册中心获取[增加]
eureka:
  instance:
    prefer-ip-address: true #从hostname:port变为ip:port
    instance-id: server:${server.port}
  client:
    service-url:
      defaultZone: http://localhost:9800/eureka,http://localhost:9801/eureka,http://localhost:9802/eureka #【需动态获取,配置中心】

3.3.此时uri: lb://product-server,会从注册中心获取服务名为product-server的服务,通过负载均衡策略分发到该服务上面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值