赞
踩
下面的示例启动两个服务:gataway-server 和 user-service 都注册到注册中心 Eureka上,客户端请求后端服务【user-service】,网关提供后端服务的统一入口。网关通过负载均衡将客户端请求转发到具体的后端服务。
序号 | 服务名称 | 端口号 | 备注 |
---|---|---|---|
1 | gateway-server | 9000 | 网关服务 |
2 | user-service | 8001 | 用户服务 |
3 | eureka-server | 8888 | 注册中心 |
用户服务比较简单,只需要注册到注册中心并提供一个测试接口 /user
<!--注册中心客户端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--actuator 监控--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--配置中心客户端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
#服务暴露顿口号 server.port=8001 #服务名称 spring.application.name=user-service #注册中心地址 eureka.client.serviceUrl.defaultZone=${EUREKA_SERVICE_URL:http://localhost:8888}/lb/eureka/ management.endpoint.conditions.enabled=true #优先使用IP地址注册 eureka.instance.prefer-ip-address=true ##服务所属分组名称 #eureka.instance.app-group-name=lkf_group #服务实例id eureka.instance.instanceId=${spring.application.name}@${spring.cloud.client.ip-address}@${server.port} #开放所有页面节点 默认只开启了health、info两个节点 management.endpoints.web.exposure.include=*
对外暴露 /user 接口,返回字符串 I’m ok
@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
@GetMapping("/user")
public String getUser() {
return "I'm ok";
}
}
网关服务提供路由配置、路由断言和过滤器等功能。下面将会分别实现这些功能
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--注册中心客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
注册到注册中心并读取服务列表,支持向注册中心服务列表中的服务路由,这里需要注意,如果 spring.cloud.gateway.discovery.locator.lowerCaseServiceId 不为true,则只能根据服务实例id的大写进行转发,不支持小写的serviceId
#服务暴露顿口号 server.port=9000 #服务名称 spring.application.name=gateway-server #注册中心地址 eureka.client.serviceUrl.defaultZone=${EUREKA_SERVICE_URL:http://localhost:8888}/eureka/ management.endpoint.conditions.enabled=true #优先使用IP地址注册 eureka.instance.prefer-ip-address=true ##服务所属分组名称 #eureka.instance.app-group-name=lkf_group #服务实例id eureka.instance.instanceId=${spring.application.name}@${spring.cloud.client.ip-address}@${server.port} #开放所有页面节点 默认只开启了health、info两个节点 management.endpoints.web.exposure.include=* #启用基于服务发现的路由定位 spring.cloud.gateway.discovery.locator.enabled=true #启用服务实例id名称小写支持 spring.cloud.gateway.discovery.locator.lowerCaseServiceId=true
路由断言有很多种,根据请求时间、Host地址、请求路径和请求方法等,这里实现一个基于路径的路由断言匹配
@Bean
public RouterFunction<ServerResponse> testFunRouterFunction() {
RouterFunction<ServerResponse> route = RouterFunctions.route(
RequestPredicates.path("/test"), request -> ServerResponse.ok()
.body(BodyInserters.fromObject("I am testing")));
return route;
}
当请求路径为 /test 时,直接返回结果为 I am testing
网关经常需要对路由请求进行过滤,对符合条件的请求进行一些操作,例如:增加请求头、增加请求参数、增加响应头和断路器等功能。
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes().route(r -> r.path("/test/custom").uri("http://ww.baidu.com"))
.route(r -> r.path("/user/**").uri("lb://user-service"))
.build();
}
当请求路径为 /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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。