学习路线
- 名字解释
- 架构设计
- 快速启动-转发案例:集成Eureka;http转发
- 基础功能一览
一、名词解释
- Route:路由是网关的基本构成,定义了ID、URI、predicates、filters;请求URL经过predicates后返回为true,即校验通过才能正确路由转发
- predicates:JDK8出的函数编程,返回boolean,就是判断输入条件是否返回true
- Filter:进入网关后,正式业务前后执行,我们的安全校验、限流等都在这做
二、架构设计
官网架构图
解释:
- Gateway Client处理外部请求
- 客户端信息与路由规则进行匹配,匹配成功进入下一步
- 执行Pre过滤器,安全校验等
- 执行匹配成功的下游业务逻辑
- 执行Post过滤器,设置一些特殊返回结果
- 响应客户端
是不是就是:匹配路由规则->执行过滤器->执行下游业务->执行过滤器->返回结果
三、快速启动-转发案例:集成Eureka;http转发
项目源码:https://gitee.com/carpentor/spring-cloud-example
我们先看一下项目结构
1、下游不依赖于Eureka,直接是web服务Http请求:demo1
application.properties
server.port=8003
spring.application.name=user
server.servlet.context-path=/user-info/
UserController
@RestController
@Log4j2
public class UserController {
@GetMapping("user")
public String get(String userId){
log.info("userController========================={}=userId={}",this.getClass().getSimpleName(),userId);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return this.getClass().getSimpleName();
}
}
我们来看住程序
首先引入jar
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
修改application.yml文件
server:
port: 8001
spring:
application:
name: gateway-demo
cloud:
gateway:
routes:
- id: user-server
uri: http://localhost:8003
predicates:
## 拦截带有user-info的url
- Path=/user-info/**
这样就可以将服务转发到下游,启动两个服务访问http://localhost:8001/user-server/user
2、集成Eureka:demo2
先启动Eureka Server(见git项目)将deme2和主程序分别引入jar,支持eureka
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.0.BUILD-SNAPSHOT</version>
</dependency>
如何使用Eureka:微服务-Eureka实战配置
修改application.yml文件
spring:
application:
name: message-server
server:
port: 8002
servlet:
context-path: /message-info/
eureka:
client:
serviceUrl:
defaultZone: http://127.0.0.1:9999/eureka
instance:
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
prefer-ip-address: true
注意spring.application.name=message-server配置
demo2:MessageController
@RestController
@Log4j2
public class MessageController {
@GetMapping("message")
public String get(String username){
log.info("messageController========================={}=",this.getClass().getSimpleName());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return this.getClass().getSimpleName();
}
}
修改主程序application.yml
server:
port: 8001
spring:
application:
name: gateway-demo
cloud:
gateway:
routes:
- id: user-server
uri: http://localhost:8003
predicates:
## 拦截带有user-info的url
- Path=/user-info/**
- id: message-server
uri: lb://message-server
order: 1000
predicates:
- Path=/message-info/**
uri: lb://message-server:其中message-server就是demo2中的spring.application.name
predicates:-Path=/message-info/**:这个就是通过Url匹配路由规则
访问http://localhost:8001/message-info/message即可看到效果
四、过滤器
第三部分就是路由转发,我们再来一览一下过滤器怎么配置
@org.springframework.context.annotation.Configuration
@Log4j2
public class Configuration {
/**
* 过滤器
* order越大优先级越低
* 跟LoginFiter功能一样,两种实现方式
* @return
*/
@Bean
@Order(3)
public GlobalFilter login(){
log.info(this.getClass().getSimpleName()+"===login");
return ((exchange, chain) -> {
//pre filter:在业务执行前执行
log.info("pre filter");
return chain.filter(exchange).then(Mono.fromRunnable(()->{
//业务执行后执行
log.info("post filter");
}));
});
}
}
看注释,这里先有个大概印象
公众号主要记录各种源码、面试题、微服务技术栈,帮忙关注一波,非常感谢