Spring Cloud Gateway(二):Spring Cloud Gateway整合Eureka应用

喜欢ヅ旅行 2022-04-17 02:00 391阅读 0赞

Spring Cloud Gateway 应用概述

下面的示例启动两个服务:gataway-server 和 user-service 都注册到注册中心 Eureka上,客户端请求后端服务【user-service】,网关提供后端服务的统一入口。网关通过负载均衡将客户端请求转发到具体的后端服务。

image






























序号 服务名称 端口号 备注
1 gateway-server 9000 网关服务
2 user-service 8001 用户服务
3 eureka-server 8888 注册中心

用户服务搭建

用户服务比较简单,只需要注册到注册中心并提供一个测试接口 /user

Maven 依赖

  1. <!--注册中心客户端-->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-test</artifactId>
  9. <scope>test</scope>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-web</artifactId>
  14. </dependency>
  15. <!--actuator 监控-->
  16. <dependency>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-actuator</artifactId>
  19. </dependency>
  20. <!--配置中心客户端-->
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-starter-config</artifactId>
  24. </dependency>

配置文件

  1. #服务暴露顿口号
  2. server.port=8001
  3. #服务名称
  4. spring.application.name=user-service
  5. #注册中心地址
  6. eureka.client.serviceUrl.defaultZone=${EUREKA_SERVICE_URL:http://localhost:8888}/lb/eureka/
  7. management.endpoint.conditions.enabled=true
  8. #优先使用IP地址注册
  9. eureka.instance.prefer-ip-address=true
  10. ##服务所属分组名称
  11. #eureka.instance.app-group-name=lkf_group
  12. #服务实例id
  13. eureka.instance.instanceId=${spring.application.name}@${spring.cloud.client.ip-address}@${server.port}
  14. #开放所有页面节点 默认只开启了health、info两个节点
  15. management.endpoints.web.exposure.include=*

暴露服务接口

对外暴露 /user 接口,返回字符串 I’m ok

  1. @SpringBootApplication
  2. @EnableDiscoveryClient
  3. @RestController
  4. public class UserApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(UserApplication.class, args);
  7. }
  8. @GetMapping("/user")
  9. public String getUser() {
  10. return "I'm ok";
  11. }
  12. }

网关服务搭建

网关服务提供路由配置、路由断言和过滤器等功能。下面将会分别实现这些功能

Maven 引用

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-gateway</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-actuator</artifactId>
  8. </dependency>
  9. <!--注册中心客户端-->
  10. <dependency>
  11. <groupId>org.springframework.cloud</groupId>
  12. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  13. </dependency>

配置文件

注册到注册中心并读取服务列表,支持向注册中心服务列表中的服务路由,这里需要注意,如果 spring.cloud.gateway.discovery.locator.lowerCaseServiceId 不为true,则只能根据服务实例id的大写进行转发,不支持小写的serviceId

  1. #服务暴露顿口号
  2. server.port=9000
  3. #服务名称
  4. spring.application.name=gateway-server
  5. #注册中心地址
  6. eureka.client.serviceUrl.defaultZone=${EUREKA_SERVICE_URL:http://localhost:8888}/eureka/
  7. management.endpoint.conditions.enabled=true
  8. #优先使用IP地址注册
  9. eureka.instance.prefer-ip-address=true
  10. ##服务所属分组名称
  11. #eureka.instance.app-group-name=lkf_group
  12. #服务实例id
  13. eureka.instance.instanceId=${spring.application.name}@${spring.cloud.client.ip-address}@${server.port}
  14. #开放所有页面节点 默认只开启了health、info两个节点
  15. management.endpoints.web.exposure.include=*
  16. #启用基于服务发现的路由定位
  17. spring.cloud.gateway.discovery.locator.enabled=true
  18. #启用服务实例id名称小写支持
  19. spring.cloud.gateway.discovery.locator.lowerCaseServiceId=true

路由断言

路由断言有很多种,根据请求时间、Host地址、请求路径和请求方法等,这里实现一个基于路径的路由断言匹配

  1. @Bean
  2. public RouterFunction<ServerResponse> testFunRouterFunction() {
  3. RouterFunction<ServerResponse> route = RouterFunctions.route(
  4. RequestPredicates.path("/test"), request -> ServerResponse.ok()
  5. .body(BodyInserters.fromObject("I am testing")));
  6. return route;
  7. }

当请求路径为 /test 时,直接返回结果为 I am testing

过滤器

网关经常需要对路由请求进行过滤,对符合条件的请求进行一些操作,例如:增加请求头、增加请求参数、增加响应头和断路器等功能。

  1. @Bean
  2. public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
  3. return builder.routes().route(r -> r.path("/test/custom").uri("http://ww.baidu.com"))
  4. .route(r -> r.path("/user/**").uri("lb://user-service"))
  5. .build();
  6. }

当请求路径为 /test/custom 时,网关将请求转发到 http://ww.baidu.com;

当请求路径为 /user 时,网关将请求转发到用户服务的/user 接口 ,/user-service/user

客户端访问

向网关发送请求:http://127.0.0.1:9000/user ,
被网关转发到 http://127.0.0.1:9000/user-service/user,得到结果为:I’m ok

发表评论

表情:
评论列表 (有 0 条评论,391人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Spring Cloud -- GateWay

    1. 为什么需要网关 > 在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务

    相关 Spring cloud gateway

    网关核心功能是路由转发,因此不要有耗时操作在网关上处理,让请求快速转发到后端服务上。 早期的cloud中使用的是基于Zuul的网关,但是由于Zuul1.x是阻塞的,后面clo