Gateway怎样实现服务转发? | 带你读《Spring Cloud Alibaba(2019)》之十

上一篇:什么是微服务网关? | 带你读《Spring Cloud Alibaba(2019)》之九
下一篇:如何保证微服务接口的安全? | 带你读《Spring Cloud Alibaba(2019)》之十一

本文来自于《精通Spring Cloud Alibaba》课程的整理,讲师为余胜军,点击查看视频内容
本文系志愿者整理,供配合学习中心课程使用,不做商业用途。

Gateway整合Nacos实现服务转发

在微服务网关中怎样转发到真实的地址:
修改接口地址:

uri: http://127.0.0.1:8081/

修改匹配规则:

- Path=/mamber/**

此时执行结果如下:

Gateway怎样实现服务转发? | 带你读《Spring Cloud Alibaba(2019)》之十

可以实现我们的结果,但是并不是我们想要的方法。我们希望根据我们的服务名称查找地址实现调用,此时需要添加如下依赖:

    <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
       <version>0.2.2.RELEASE</version>
    </dependency>

重新配置:

 uri: lb://mayikt-member

nacos:
      discovery:
        server-addr: 127.0.0.1:8848

此时启动80服务,执行结果为:页面404

Gateway怎样实现服务转发? | 带你读《Spring Cloud Alibaba(2019)》之十

我们需要修改:

Gateway怎样实现服务转发? | 带你读《Spring Cloud Alibaba(2019)》之十

执行结果还是404:

Gateway怎样实现服务转发? | 带你读《Spring Cloud Alibaba(2019)》之十

此时还需要加一个参数,放置在lb下面:

          filters:
            - StripPrefix=1

执行结果为:

Gateway怎样实现服务转发? | 带你读《Spring Cloud Alibaba(2019)》之十
Gateway怎样实现服务转发? | 带你读《Spring Cloud Alibaba(2019)》之十

添加Maven依赖:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
        <version>2.0.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>0.2.2.RELEASE</version>
    </dependency>
</dependencies>

application配置

server:
  port: 80
####服务网关名称
spring:
  application:
    name: mayikt-gateway
  cloud:
    gateway:
      discovery:
        locator:
          ####开启以服务id去注册中心上获取转发地址
          enabled: true
        ###路由策略
      routes:
        ###路由id
        - id: mayikt
          ####转发http://www.mayikt.com/
          uri: http://www.mayikt.com/
          ###匹配规则
          predicates:
            - Path=/mayikt/**
        ###路由id
        - id: member
          #### 基于lb负载均衡形式转发
          uri: lb://mayikt-member
          filters:
            - StripPrefix=1
          ###匹配规则
          predicates:
            - Path=/member/**
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

Nginx与网关的区别

微服务网关能够做的事情,Nginx也可以实现。
相同点:都是可以实现对api接口的拦截,负载均衡、反向代理、请求过滤等,可以实现和网关一样的效果。

不同点:
Nginx采用C语言编写的
在微服务领域中,都是自己语言编写的,比如我们使用java构建微服务项目,Gateway就是java语言编写的。

毕竟Gateway属于Java语言编写的, 能够更好对微服务实现扩展功能,相比Nginx如果想实现扩展功能需要结合Nginx+Lua语言等。

Nginx实现负载均衡的原理:属于服务器端负载均衡器。
Gateway实现负载均衡原理:采用本地负载均衡器的形式。

查看SpringCloud Gateway的官网:
https://spring.io/projects/spring-cloud-gateway
根据官网文档,新建一个包filter以及Token类。
自定义TokenFilter实现参数拦截

@Component
public class TokenFilter implements GlobalFilter {
    @Override
   public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest().getQueryParams().getFirst("token");
        if (token == null || token.isEmpty()) {
            ServerHttpResponse response = exchange.getResponse();
            response.setStatusCode(HttpStatus.BAD_REQUEST);
            String msg = "token not is null ";
            DataBuffer buffer = response.bufferFactory().wrap(msg.getBytes());
            return response.writeWith(Mono.just(buffer));
        }
        // 使用网关过滤
        return chain.filter(exchange);
    }
}

我们需要添加:

   <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
    </dependency>

执行结果:

Gateway怎样实现服务转发? | 带你读《Spring Cloud Alibaba(2019)》之十

我们添加一个参数:token=11

Gateway怎样实现服务转发? | 带你读《Spring Cloud Alibaba(2019)》之十
Gateway怎样实现服务转发? | 带你读《Spring Cloud Alibaba(2019)》之十

思考一个问题:如果我们使用网关宕机了,会出现什么情况?也就是说会导致我们整个微服务无法实现通讯。
答:网关实现集群,基于Nginx实现即可。
网关实现了集群如何访问?
使用nginx或者lvs虚拟vip。

Gateway怎样实现服务转发? | 带你读《Spring Cloud Alibaba(2019)》之十

客户端访问lvs虚拟vip,随机绑定一个Nginx,每个Nginx配置一样。

上一篇:nagios分组出图代码实现讲解[1]


下一篇:假期前的数据库检查脚本之主备关系(r11笔记第46天)