栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

服务网关~Gateway

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

服务网关~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)引入相关依赖

    
        
        
            org.springframework.cloud
            spring-cloud-starter-gateway
        
    

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的配置

        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        

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

 3)修改配置文件

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

4)测试访问

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/873713.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号