目前Gateway正在逐渐取代Zuul的地位,相关性能分析就不多说了,不涉及其它组件,只完成路由功能,直接上代码。
pml文件:
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.M3</spring-cloud.version>
</properties>
<dependencies>
<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.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</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>
路由配置方式有yml和Bean这2种,当2处配置了相同的路由,将以Bean的为准。
yml
spring:
cloud:
gateway:
routes:
- id: get_route
uri: lb://ribbo-client #路由路径,lb表示从注册中心根据应用名获取服务地址
predicates:
- Path=/hello/** #匹配规则
filters:
- name: Hystrix #熔断机制
args:
name: fetchError
fallbackUri: forward:/hystric #需要加上斜杠,不然找不到路径,目前只支持forward,/hystric是某个handler映射地址
application:
name: gateway-service
server:
port: 8082
eureka:
client:
service-url:
defaultZone: http://localhost:8081/eureka/
Bean 如何转到其它服务目前没弄出来
@Bean
public RouteLocator myRoutes(RouteLocatorBuilder builder) {
return builder.routes()
.route(p -> p
.path("/get")
.filters(f ->
f.hystrix(config -> config.setFallbackUri("forward:/hystric2"))
)
.uri("https://spring.io/projects/spring-cloud"))
.build();
}
最后简单配置一下handler
@RestController
public class HystrixController {
@RequestMapping(value = "/hystric")
public String hystric(){
System.out.println("1");
return "hello error!";
}
@RequestMapping(value = "/hystric2")
public String hystric2(){
System.out.println("2");
return "hello error2!";
}
}
浏览器访问localhost:8082,访问对应uri,路由到其它服务或是熔断(对应服务不可用)。
ribbo-client服务部分代码:
@RequestMapping("/hello")
public String hello(){
return "hello world!";
}