微服务-gateway-基础架构-快速启动功能预览

学习路线

  1. 名字解释
  2. 架构设计
  3. 快速启动-转发案例:集成Eureka;http转发
  4. 基础功能一览

一、名词解释

  1. Route:路由是网关的基本构成,定义了ID、URI、predicates、filters;请求URL经过predicates后返回为true,即校验通过才能正确路由转发
  2. predicates:JDK8出的函数编程,返回boolean,就是判断输入条件是否返回true
  3. Filter:进入网关后,正式业务前后执行,我们的安全校验、限流等都在这做

二、架构设计

官网架构图

解释:

  1. Gateway Client处理外部请求
  2. 客户端信息与路由规则进行匹配,匹配成功进入下一步
  3. 执行Pre过滤器,安全校验等
  4. 执行匹配成功的下游业务逻辑
  5. 执行Post过滤器,设置一些特殊返回结果
  6. 响应客户端

是不是就是:匹配路由规则->执行过滤器->执行下游业务->执行过滤器->返回结果

三、快速启动-转发案例:集成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");
			}));
		});
	}
}

看注释,这里先有个大概印象

 

公众号主要记录各种源码、面试题、微服务技术栈,帮忙关注一波,非常感谢

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章