在本项目中只是简单的引入的Spring Cloud GateWay的依赖,来实现路由跳转。
1.1、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>
1.2、编程式
首先在启动类中使用 @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 时页面展示如下信息:
1.3、配置文件方式
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 的工作机制,在日常项目中我们可根据不同的需求,配置不同的路由转发策略,大部分使用场景只需要调整不同的配置信息即可实现
1.4、网关和注册中心
上面两种转发方式只适合在单一项目中使用,如果在微服务架构中就会存在一个致命的问题,微服务架构中服务提供者是动态变化的,所以不能直接将目标服务器地址写在配置文件中。那么在微服务架构中如何解决这个问题呢,这个时候就需要和注册中心配置使用,本文以 Eureka 和 spring Cloud GateWay为例子:
当网关和注册中心结合起来使用时,把网关当作一个客户端注册到注册中心,然后网关从注册中心获取所有服务,并自动为这些服务提供路由转发功能。spring Cloud GateWay提供了从功能,在项目中只需要简单配置即可达到这样的效果。
首先创建一个名叫 spring-cloud-gateway-eureka的maven 工程,作为父工程,然后创建一个eureka-server的springboot工程,作为注册中心,并且作为子项目。然后我们创建一个rest-provider-1的springboot工程,作为服务提供者,并且作为子项目。然后我们再创建一个rest-consumer-1的springboot工程,作为服务消费者,并且为子项目。然后我们再创建一个user的普通maven工程,并且提供一个简单的UserVo类。
- UserVo类 ```java public class UserVo { private String nickname; private String age; private String address; private String job; }
- 我们在rest-provider-1 中提供一个getUser服务:
```java
@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-provider-1 中提供的服务:
FeignService
@FeignClient("rest-provider-1")
public interface FeignService {
@GetMapping("/getUser")
ResponseEntity<Object> getUser(@RequestBody UserVo user);
}
消费 ```java @RestController public class ConsumerController { @Autowired FeignService feignService;
@RequestMapping(value = “/getUser”,method = RequestMethod.POST) public ResponseEntity