你要足够努力,才能够游刃有余
在学习这个gateway服务网关的时候还是在服务调用的时候出现了纠结,我们有consumer和provider服务,然后在调用时又引入了gateway网关来做路由转发,视频上教的是直接对provider集群进行路由,我这里是对服务端进行路由。
consumer整合gateway
1.写pom
添加gateway组件
<dependencies>
<!--gateway gateway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--自定义公共api-->
<dependency>
<groupId>org.example</groupId>
<artifactId>cloud-api-book-commons</artifactId>
</dependency>
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!--注解组件-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--测试组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--eureka -client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
写yml
server:
port: 9527
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: false # 开启从注册中心动态创建路由的功能,利用微服务名称j进行路由
routes:
- id: book_route1 # 路由的id,没有规定规则但要求唯一,建议配合服务名
#匹配后提供服务的路由地址
#uri: http://localhost:8001
uri: http://localhost:80 #设置访问路径,如果根据微服务上面的名字来则是 lb://CLOUD-PAYMENT-SERVICE
predicates:
- Path=/consumer/book/getAllBooks #断言,路径相匹配的进行路由
#- After=2021-02-25T15:48:39.229+08:00[Asia/Shanghai] #断言,设置为时间点后生效
#- Cookie=username, DESKTOP-R8V3MKG #断言,设置cookie值
#- Header=X-Request-Id, \d+ #断言,设置请求头参数
# filters: #过滤器
# - AddRequestHeader=X-Request-red, blue #过滤器,键值对形式
# - id: book_route2
# #uri: http://localhost:8001
# uri: lb://CLOUD-PAYMENT-SERVICE
# predicates:
# - Method=GET
# - Path=/payment/lb/** #断言,路径相匹配的进行路由
# - id: book_route3
# #uri: http://localhost:8001
# uri: lb://CLOUD-PAYMENT-SERVICE
# predicates:
# - Method=GET
# - Path=/payment/lb/** #断言,路径相匹配的进行路由
# - id: book_route4
# #uri: http://localhost:8001
# uri: lb://CLOUD-PAYMENT-SERVICE
# predicates:
# - Method=GET
# - Path=/payment/lb/** #断言,路径相匹配的进行路由
# - id: book_route5
# #uri: http://localhost:8001
# uri: lb://CLOUD-PAYMENT-SERVICE
# predicates:
# - Method=GET
# - Path=/payment/lb/** #断言,路径相匹配的进行路由
eureka:
instance:
hostname: cloud-gateway-service
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
主启动
@SpringBootApplication
@EnableEurekaClient
public class GateWayMain9527 {
public static void main(String[] args) {
SpringApplication.run(GateWayMain9527.class,args);
}
}
这个时候进行启动就能根据断言和筛选进行功能实现了。
在config手动配置predicates
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator customRoutrKocator(RouteLocatorBuilder routeLocatorBuilder)
{
RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
routes.route("path_routr_1",
r -> r.path("/guoji")
.uri("http://news.baidu.com")).build();
return routes.build();
}
}
在config手动写filter
@Component
@Slf4j
public class GatewayFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("Date----->"+new Date());
String uname = exchange.getRequest().getQueryParams().getFirst("uname");
if (uname == null){
log.info("非法用户");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}
写这个博客主要是边复现自己学习的内容,巩固一下,有人观看我的博客的话可能会因为博客风格看的不是特别清楚。希望看到的大佬能够多多指教