SpringCloud系列:spring cloud gateway之服务注册与发现

举报
云享专家 发表于 2019/08/31 15:45:57 2019/08/31
【摘要】 在上面的配置中,配置了一个Path 的predict,将以/demo/**开头的请求都会转发到uri为lb://SERVICE-HI的地址上,lb://SERVICE-HI即service-hi服务的负载均衡地址,并用StripPrefix的filter 在转发之前将/demo去掉。

在之前的文章介绍了Spring Cloud GatewayPredict(断言)、Filter(过滤器),大家对Spring Cloud Gateway有初步的认识,其中在对服务路由转发的这一块,在之前的文章是采用硬编码的方式进行路由转发。这篇文章以案例的形式来讲解Spring Cloud Gateway如何配合服务注册中心进行路由转发。

工程介绍

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

工程名

端口

作用

eureka-server

8761

注册中心eureka server

service-hi

8762

服务提供者eurka client

service-gateway

8081

路由网关eureka client

这三个工程中,其中service-hiservice-gateway向注册中心eureka-server注册。用户的请求首先经过service-gateway,根据路径由gatewaypredict 去断言进到哪一个routerrouter经过各种过滤器处理后,最后路由到具体的业务服务,比如 service-hi。如图:

                 1.png

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

gateway工程详细介绍

gateway工程中引入项目所需的依赖,包括eureka-client的起步依赖和gateway的起步依赖,代码如下:

1.  <dependency>

2.      <groupId>org.springframework.cloud</groupId>

3.      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

4.  </dependency>

5.  <dependency>

6.      <groupId>org.springframework.cloud</groupId>

7.      <artifactId>spring-cloud-starter-gateway</artifactId>

8.  </dependency>

在工程的配置文件application.yml,指定程序的启动端口为8081,注册地址、gateway的配置等信息,配置信息如下:

1.  server:

2.    port:8081

3.    

4.  spring:

5.    application:

6.      name:sc-gateway-service

7.    cloud:

8.      gateway:

9.        discovery:

10.          locator:

11.            enabled:true

12.            lowerCaseServiceId:true

13.   

14.  eureka:

15.    client:

16.      service-url:

17.        defaultZone:http://localhost:8761/eureka/

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

在浏览器上请求输入localhost:8081/service-hi/hi?name=1323,网页获取以下的响应:

1.  hi 1323,i am fromport:8762

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

1.  spring:

2.    application:

3.      name:sc-gateway-server

4.    cloud:

5.      gateway:

6.        discovery:

7.          locator:

8.            enabled:false

9.            lowerCaseServiceId:true

10.        routes:

11.        -id:service-hi

12.          uri:lb://SERVICE-HI

13.          predicates:

14.            -Path=/demo/**

15.          filters:

16.            -StripPrefix=1

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

在浏览器上请求localhost:8081/demo/hi?name=1323,浏览器返回以下的响应:

1.  hi 1323,i am fromport:8762

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

源码下载

https://github.com/forezp/SpringCloudLearning/tree/master/sc-f-gateway-cloud

参考资料

https://juejin.im/post/5aa4eacbf265da237a4ca36f

https://www.jianshu.com/p/1c942a8abe18

https://juejin.im/post/5ba8daa56fb9a05cfe486ebf

 

原创作者:方志朋

方志朋简介:SpringCloud中国社区联合创始人,博客访问量突破一千万,爱好开源,热爱分享,活跃于各大社区,保持着非常强的学习驱动力,终身学习践行者,终身学习受益者。目前就职于国内某家知名互联网保险公司,担任DEVOPS工程师,对微服务领域和持续集成领域研究较深,精通微服务框架SpringCloud

 

 


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。