服务网关~Gateway

原文链接:服务网关~Gateway – 编程屋

目录

1 前言

2 Gateway

2.1 Gateway初步使用

2.2 从nacos获取信息


1 前言

网关就是系统的统一入口,它封装了应用程序的内部结构,为客户端提供统一服务,一些与业务本身无关公共逻辑可以在这里实现,像认证、鉴权、路由转发等等。

常见网关:

  • Nginx+lua

使用nginx的反向代理和负载均衡可实现对api服务器的负载均衡和高可用,lua是一种脚本语言,可以编写一些简单的逻辑,nginx支持lua脚本

  • Kong

基于nginx+lua开发,性能高,稳定,有多个可用的插件(限流、鉴权)可以开箱即用

问题:只支持http协议,二次开发,自由扩展困难;提供管理API,缺乏更易用的管控、配置方式。

  • Zuul

Netflix开源的网关,功能丰富,使用java开发,易于二次开发

问题:缺乏管控,无法动态配置;依赖组件较多;处理http请求依赖是web容器,性能不如Nginx。

  • Spring Cloud Gateway

spring公司为了替换zuul而开发的网关服务。

2 Gateway

2.1 Gateway初步使用

        Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。

优点:

  •         性能强劲:是第一代网关Zuul的1.6倍
  •         功能强大:内置了很多实用的功能,例如,转发,监控、限流
  •         设计优雅,容易扩展

缺点:

  • 其实现依赖于Netty与WebFlux,不是传统的Servlet编程模型,学习成本高
  • 不能将其部署在Tomcat、Jetty等Servlet容器里、只能打成jar运行
  • 需要Spring Boot2.0 以上才能支持

1)新建一个moudle,添加api-gateway

2)引入相关依赖

    <dependencies>
        <!--此模块不能引入starter-web-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
    </dependencies>

3)编写配置文件

server:
  port: 7000
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      routes: #路由数组(当前请求满足什么样的条件转发到哪个微服务上)
        - id: product_route #当前路由发的标识、要求唯一
          uri: http://localhost:8081 #请求最终要被转发的地址
          order: 1 #路由的优先级,数字越小代表路由的优先级越高
          predicates: #断言(条件判断,返回值是boolean 转发请求要满足的条件)
            - Path=/product-serv/** #当请求路径满足Path的指定路径时,此路由信息才会正常转发
          filters: #过滤器(在请求传递过程中,对请求做一些处理)
            - StripPrefix=1 #在请求转发之前去掉一层路径

4) 商品微服务controller层

@RestController
@Slf4j
public class ProductController {

    @Autowired
    private ProductService productService;

    @RequestMapping("/product/{pid}")
    public Product product(@PathVariable("pid") Integer pid) {
        log.info("接下来要进行{}号商品的查询",pid);
        Product product =  productService.findById(pid);
        log.info("商品信息查询成功,内容为{}", JSON.toJSONString(product));
        return product;
    }



}

5)通过网关访问

 可见通过网关:http://localhost:7000/product-serv/product/1 == http://localhost:8081/product/1

2.2 从nacos获取信息

由2.1 可知:服务网关需要路由的地址是在配置文件中写死固定的,那么这显然在平时开发中是不方便的,所以我们需要将我们的网关服务和nacos结合起来,从nacos中去获取配置。

1)在网关微服务的配置文件下加入nacos的配置

        <!--nacos客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

2)在启动类上加入@EnableDiscoveryClient注解

以上只是部分内容,为了维护方便,本文已迁移到新地址:服务网关~Gateway – 编程屋

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值