SpringCloud之GateWay快速入门 左手的ㄟ右手 2024-04-18 14:12 19阅读 0赞 在本项目中只是简单的引入的Spring Cloud GateWay的依赖,来实现路由跳转,更复杂的使用将会在下一篇文章中教大家使用。 # GateWay 快速入门 # 首先我们创建一个简单的SpringBoot工程,pom依赖如下: <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR2</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> 关于Spring Cloud GateWay 配置路由有两种方式,分别是注解和配置文件来进行配置。 注意这里的核心依赖是: <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> </dependencies> # 编程式 # 首先我们在启动类中使用@Bean来注入RouteLocator来配置路由,完整配置如下: @SpringBootApplication public class GatewayApplication { public static void main(String[] args) { SpringApplication.run( GatewayApplication.class, args ); } @Bean public RouteLocator redirectRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route("path_router", r -> r.path("/get") .uri("http://httpbin.org")) .build(); } } 上面这段配置的意思是,配置了一个 id 为 path\_route 的路由规则,当访问地址 `http://localhost:8080/get` 时会自动转发到地址:`http://httpbin.org/get` 。配置完成启动项目即可在浏览器访问进行测试,当我们访问地址`http://localhost:8080/get` 时页面展示如下信息: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3F3ZTg2MzE0_size_16_color_FFFFFF_t_70] # 配置文件方式 # 在resource 中使用.properties或者.yml,这里我用yml来演示,首先在application.yml中配置如下参数: server: port: 8080 spring: cloud: gateway: routes: - id: path_route uri: http://httpbin.org predicates: - Path=/get 分别来解释下上面配置的作用: 1. id:我们自定义的路由 ID,保持唯一,代码中就是 `route()` 方法的第一个参数。 2. uri:需要转发的目标服务地址,`r -> r.path("/get").uri("http://httpbin.org")` 代码使用了函数时编程简化代码。 3. predicates:路由条件,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。 4. filters:过滤规则,本示例暂时没用。 配置完成之后我们把上启动类中的中的RouteLocator 配置全部注销掉, 然后重新启动,访问`http://localhost:8080/get` ,返回信息和上述返回的结果一致,这说明了通过配置的方式也可以到达路由转发的功能。在实际项目中为了方便维护,推荐使用配置文件的方式来配置。 两个 hello world 版的示例都体验完之后,基本可以了解 Spring Cloud GateWay 的工作机制,在日常项目中我们可根据不同的需求,配置不同的路由转发策略,大部分使用场景只需要调整不同的配置信息即可实现。 # 网关和注册中心 # 上面两种转发方式只适合在单一的项目中使用,如果在微服务架构中就会存在一个致命的问题,微服务架构中服务提供者是动态变化的,所以不能直接将目标服务器地址写在配置文件中。那么在微服务架构中如何解决这个问题呢,这个时候就需要和注册中心来配置使用,本文以 Eureka 和 Spring Cloud Gateway 为例给大家讲解。 当网关和注册中心结合起来使用时,把网关当作一个客户端注册到注册中心,然后网关从注册中心获取所有服务,并自动为这些服务提供路由转发功能。Spring Cloud Gateway 提供了此功能,在项目中只需要简单配置即可达到这样的效果,接下来进行演示。 首先我们创建一个名叫spring-cloud-gateway-eureka的maven工程, 做为父工程,然后创建一个eureka-server 的SpringBoot工程,做为注册中心,并且做为子项目。然后我们创建一个rest-provider-1的SpringBoot工程,做为服务提供者,并且做为子项目。然后我们再创建一个rest-consumer-1的SpringBoot工程,做为服务消费者,并且做为子项目。 对于eureka和provider以及consumer的创建我就不阐述了,非常的简单。不清楚的可以参考最下面的源码。 然后我们再创建一个user的普通maven工程,并且提供一个简单的UserVo类。 下面是UserVO内容: public class UserVo { private String nickname; private String age; private String address; private String job; } 省略get/set方法 我们在rest-provier-1中提供一个getUser服务,服务编写如下: @RestController public class ProviderController { private Logger log = LoggerFactory.getLogger(this.getClass()); @RequestMapping(value = "/getUser",method = RequestMethod.POST) public ResponseEntity<Object> getUser(@RequestBody UserVo user) { log.info("provider中到getUser服务被调用了"); user.setAddress(user.getAddress()); user.setAge(user.getAge()); user.setJob(user.getJob()); user.setNickname(user.getNickname()); return new ResponseEntity<Object>(user, HttpStatus.OK); } } 再rest-consumer-1 中使用feign消费我们rest-provier-1 中提供的服务: FeignService @FeignClient("rest-provider-1") public interface FeignService { @GetMapping("/getUser") ResponseEntity<Object> getUser(@RequestBody UserVo user); } 消费 @RestController public class ConsumerController { @Autowired FeignService feignService; @RequestMapping(value = "/getUser",method = RequestMethod.POST) public ResponseEntity<Object> getUser(@RequestBody UserVo user) { Object result = feignService.getUser(user); return new ResponseEntity<Object>(result, HttpStatus.OK); } } 分别启动eureka-server 、 rest-provider-1、rest-consumer-1 然后通过postman 或者其它http请求工具、对`http://localhost:8002/getUser` 进行测试,返回下面结果,我们对准备工作就完成了。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3F3ZTg2MzE0_size_16_color_FFFFFF_t_70 1] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3F3ZTg2MzE0_size_16_color_FFFFFF_t_70 2] 然后我们创建eureka-gateway的SpringBoot项目,做为子项目。 eureka-gateway依赖如下: <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR2</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> 创建好项目后,我们将eureka-gateway注册到eureka-server中,并且配置网关: spring: application: name: eureka-gateway cloud: gateway: discovery: locator: enabled: true server: port: 8888 eureka: client: service-url: defaultZone: http://localhost:1111/eureka/ logging: level: org.springframework.cloud.gateway: debug 上面gateway配置说明: spring.cloud.gateway.discovery.locator.enabled 是否开启通过注册中心进行路由转发的功能,通过 serviceId 转发到服务,默认为 false。 logging.level.org.springframework.cloud.gateway 调整 gateway 包的 log 级别,以便排查问题。 然后启动eureka-gateway,然后我们访问`http://localhost:1111/`: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3F3ZTg2MzE0_size_16_color_FFFFFF_t_70 3] 看到都注册上去了后,我们用网关访问我们的服务`http://localhost:8888/REST-CONSUMER-1/getUser` 注意这里的服务名称必须大写,可以通过配置来支持小写。 我们用postman 之类的工具,来发起请求: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3F3ZTg2MzE0_size_16_color_FFFFFF_t_70 4] 响应结果如下: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3F3ZTg2MzE0_size_16_color_FFFFFF_t_70 5] 说明我们通过路由转发功能调用了 CONSUMER 的 hello 服务,并且我们在配置文件中只是配置了注册中心的地址,并没有配置具体的服务提供者信息。 通过上面的实验说明 Spring Cloud Gateway 和 Eureka 已经深度融合,只需要在 Gateway 中配置好注册中心的地址,即可代理注册中心的所有服务提供者,省掉了中间繁琐的配置。 注意访问的格式是这样的:`http://网关地址:端口/服务中心注册 serviceId/具体的 url` # 总结 # 本节课为大家演示了如何使用 Spring Cloud Gateway。Spring Cloud Gateway 默认有两种使用方式,一种是通过编码的方式来实现,一种是通过配置文件的方式来实现,推荐使用配置文件的方式来使用,便于后期修改维护。Spring Cloud Gateway 支持和注册中心结合起来使用,只要将 Spring Cloud Gateway 注册到注册中心,即可自动代理注册中心中的所有服务,简化路由配置和使用方式。 # 源码地址 # 微服务网关快速实践: [github][] 微服务网关调用服务:[github][github 1] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3F3ZTg2MzE0_size_16_color_FFFFFF_t_70]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/18/0dc6e8ea9ff04801aa22bf5bd7bdb576.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3F3ZTg2MzE0_size_16_color_FFFFFF_t_70 1]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/18/7759a4ae0c754316a3854dc8bc2b84e8.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3F3ZTg2MzE0_size_16_color_FFFFFF_t_70 2]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/18/6a8570cb8afa4e28aae709d01ffd28ff.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3F3ZTg2MzE0_size_16_color_FFFFFF_t_70 3]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/18/91550e00c822454bab6504c9ee1444a6.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3F3ZTg2MzE0_size_16_color_FFFFFF_t_70 4]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/18/2c9b910a0f074ada92a3de1386d2ba13.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3F3ZTg2MzE0_size_16_color_FFFFFF_t_70 5]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/18/785f389b0abe4acb87e40bb9db8dc9e5.png [github]: https://github.com/zhoubiao188/spring_cloud_study/tree/master/gateway [github 1]: https://github.com/zhoubiao188/spring_cloud_study/tree/master/spring-cloud-gateway-eureka
还没有评论,来说两句吧...