路由网关与配置中心

一. 路由网关

1.什么是路由网关?

简单来说,路由网关往往是微服务架构的入口组件,外来的所有请求,都需要通过路由网关进行分发和过滤,路由网关的核心功能:请求的路由,请求的过滤

2.为什么需要路由网关

网关服务和注册中心的关系_配置文件

路由网关提供了外部请求的访问入口,所有的外部请求都只需要知道路由网关的地址就可以了,无需知道每个微服务的地址,路由网关可以将外部的请求负载分发给不同的微服务,这样可以对外屏蔽微服务架构内部的结构,因为路由网关往往是外部请求访问微服务结构的入口,所以可以在路由网关做请求过滤的工作

Springcloud默认提供了2个路由网关,Zuul和geteway,Zuul是网飞(netflix)提供的路由组件,而Gateway是SpringCloud团队自己开发的一款路由组件,用来替换Zuul的

3. 路由网关的实现

3.1. 创建一个微服务工程,注意:该工程中不能添加web依赖
3.2 添加Gateway依赖和eureka客户端依赖
<dependencies>
        <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-gateway</artifactId>
    </dependency>
3.3 配置application.yml
# 配置端口号
 server:
   port: 18888
  # 给服务起名字
 spring:
   application:
     name: spring-gateway
     # 路由网关的相关配置
   cloud:
     gateway:
       routes:
        # id:规则的标识,是一个合法的不重复的字符串即可
         - id: guize1
         # predicates:路由规则,什么样的请求,匹配当前这个规则
           predicates:
             - Path=/tea/**
        # 当前的规则,分发给哪个微服务
           uri: lb://spring-teacher
         - id: guize2
           predicates:
             - Path=/cla/**
           uri: lb://spring-class
         - id: guize3
           predicates:
             - Path=/stu/**
           uri: lb://spring-student

  # 配置注册中心eureka的地址
 eureka:
   client:
     service-url:
       defaultZone: http://localhost:20000/eureka
yml文件写成properties文件的写法(两种写法均可)
application.properties
# 配置端口号
server.port=18888
# 给服务取名字
spring.application.name=spring-gateway
# 路由网关gateway的相关配置
# id:规则的标识,是一个合法的不重复的字符串即可
spring.cloud.gateway.routes[0].id=guize1
# predicates:路由规则,什么样的请求,匹配当前这个规则
spring.cloud.gateway.routes[0].predicates[0]=Path=/stu/**
# 当前的规则,分发给哪个微服务
spring.cloud.gateway.routes[0].uri=lb://spring-student
# 配置访问spring-class的微服务路由规则
spring.cloud.gateway.routes[1].id=guize2
spring.cloud.gateway.routes[1].predicates[0]=Path=/cla/**
spring.cloud.gateway.routes[1].uri=lb://spring-class
#配置spring-teacher的微服务路由规则
spring.cloud.gateway.routes[2].id=guize3
spring.cloud.gateway.routes[2].predicates[0]=Path=/tea/**
spring.cloud.gateway.routes[2].uri=lb://spring-teacher

eureka.client.service-url.defaultZone: http://localhost:20000/eureka
3.4 编写启动类
@SpringBootApplication
@EnableEurekaClient
public class SpringGateway {
    public static void main ( String[] args ) {
        SpringApplication.run(SpringGateway.class,args);
    }
}
3.5 在浏览器输入对应的路由规则

网关服务和注册中心的关系_微服务_02

二:分布式统一配置中心

网关服务和注册中心的关系_spring_03

1. 配置中心的搭建

1.1 创建一个工程,可以不注册到注册中心上
1.2添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>
1.3 启动类添加注解
@EnableConfigServer
1.4 配置application.yml
#配置端口号
server.port=40000
#给服务起名字
spring.application.name=spring-config

#读取本地配置文件,强制需要配置该属性
spring.profiles.active=native
# 配置文件放到本地
spring.cloud.config.server.native.search-locations=classpath:config
# 配置文件放在git
#spring.cloud.config.server.git.uri=git仓库的地址 git仓库里面放的就是各种配置文件
# 配置文件放在svn上
#spring.cloud.config.server.svn.uri=
1.5 在类路径下创建一个config文件夹,在文件夹下创建一个application-local.properties文件
com.name=zhangsan
1.6 测试

网关服务和注册中心的关系_微服务_04

2.将所有微服务的配置文件统一管理(注册中心可以不用)

2.1 将所有的微服务的application.properties放到统一配置中心的指定目录下(git,svn需要传到指定的仓库中)
2.2 给所有的微服务添加依赖
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
2.3 所有的微服务,添加一个配置文件bootstrap.properties

注意:bootstrap.properties用法与application.properties的用法相同,但是在springBoot的启动过程中,是先加载bootstrap.application再加载application.properties

#统一配置中心的地址
spring.cloud.config.uri=http://localhost:40000
#配置文件的名字
spring.cloud.config.name=gateway
#配置文件的环境
spring.cloud.config.profile=local
2.4 统一配置文件中心的目录

网关服务和注册中心的关系_配置文件_05

2.5 启动微服务,观察启动的日志(在启动微服务之前,要先启动配置中心)

网关服务和注册中心的关系_微服务_06

注意:这里有一个强制的顺序要求,必须先启动配置中心,再启动微服务

3. 配置中心需要注意的一些地方

  1. 如果配置文件是放在Config Server本地管理的,那么每次修改配置文件,都必须重启Config Server才会生效
  2. 如果配置文件是放在Config Server的git,svn仓库中管理的,那么每次修改配置文件,不用重启Config Server,会自动生效
  3. 不管配置文件放在哪里,每次修改配置文件,所有的Config Client(微服务)重启才有效,原因在于Config Client只有在启动的时候会去抓取一次配置,然后配置就缓存到本地了,后续所有的代码都是从本地获得配置,因此,微服务的变化,是无感知的,这也是一种优化的结果

4. 关于配置修改,需要重启所有的微服务的解决方案

统一配置中心的管理方案一

网关服务和注册中心的关系_配置文件_07

统一配置中心的管理方案二

网关服务和注册中心的关系_配置文件_08