当前位置:首页 > 服务端 > 微服务从零到一服务网关(Gateway基础篇)

微服务从零到一服务网关(Gateway基础篇)

2022年11月08日 23:09:35服务端36

                                        服务网关(Gateway)

搭建网关服务

本案例中使用spring boot的版本为2.0.3.RELEASE,spring cloud版本为Finchley.RELEASE。在中涉及到了三个工程, 分别为注册中心eureka-server、服务提供者service-hi、 服务网关service-gateway,如下:

工程名    端口    作用
eureka-server   1001    注册中心eureka server
feign-provider   1003    服务提供者 eurka client
gateway    1007   路由网关 eureka client
这三个工程中,其中feign-provider、gateway向注册中心eureka-server注册。用户的请求首先经过service-gateway,根据路径由gateway的predict 去断言进到哪一个 router, router经过各种过滤器处理后,最后路由到具体的业务服务,比如 feign-provider。如图:

eureka-server、feign-provider这两个工程直接复制于我的另外一篇文章https://blog.csdn.net/forezp/article/details/81040925 ,在这就不在重复,可以查看源码,源码地址见文末链接。 其中,feign-provider服务对外暴露了一个RESTFUL接口“queryNameById?id=2”接口。现在重点讲解gateway。

  • 新建gateway工程,新增pom依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
  • 在工程的配置文件application.yml中 ,指定程序的启动端口为1007,注册地址、gateway的配置等信息,配置信息如下:
server:
  port: 1007

spring:
  application:
    name: gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          lowerCaseServiceId: true
          
eureka:
  client:
    service-url:
      defaultZone: http://localhost:1001/eureka/

  • 其中,spring.cloud.gateway.discovery.locator.enabled为true,表明gateway开启服务注册和发现的功能,并且spring cloud gateway自动根据服务发现为每一个服务创建了一个router,这个router将以服务名开头的请求路径转发到对应的服务。spring.cloud.gateway.discovery.locator.lowerCaseServiceId是将请求路径上的服务名配置为小写(因为服务注册的时候,向注册中心注册时将服务名转成大写的了),比如以/service-hi/*的请求路径被路由转发到服务名为service-hi的服务上。

    在浏览器上请求输入http://localhost:1007/feign-provider/queryNameById?id=2,网页获取以下的响应:211111

  • 在上面的例子中,向service发送的请求时,url必须带上服务名service-hi这个前缀,才能转发到service-hi上,转发之前会将feign-provider去掉。
    那么我能不能自定义请求路径呢,毕竟根据服务名有时过于太长,或者历史的原因不能根据服务名去路由,需要由自定义路径并转发到具体的服务上。答案是肯定的是可以的,只需要修改工程的配置文件application.yml,具体配置如下
     

    spring:
      application:
        name: gateway
      cloud:
        gateway:
          discovery:
            locator:
              enabled: false
              lowerCaseServiceId: true
          routes:
          - id: feign-provider
            uri: lb://feign-provider
            predicates:
              - Path=/user/**
            filters:
              - StripPrefix=1
             
    
    

    在上面的配置中,配置了一个Path 的predict,将以/user/**开头的请求都会转发到uri为lb://SERVICE-HI的地址上,lb://feign-provider即feign-provider服务的负载均衡地址,并用StripPrefix的filter 在转发之前将/demo去掉。同时将spring.cloud.gateway.discovery.locator.enabled改为false,如果不改的话,之前的localhost:8081/service-hi/hi?name=1323这样的请求地址也能正常访问,因为这时为每个服务创建了2个router。

    在浏览器上请求http://localhost:1007/user/queryNameById?id=2,浏览器返回以下的响应:


    返回的结果跟我们预想的一样。
     

作者:我行其野&芃芃其麦
来源链接:https://blog.csdn.net/honger_hua/article/details/98201868

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/server/68599.html

分享给朋友: