目录

1、为什么要使用动态路由

2、zuul+config实现动态路由实例

2.1 创建服务提供者

2.2 创建路由配置文件

2.3 创建配置服务端

2.3 创建网关

2.4 创建新服务提供者

3、总结


1、为什么要使用动态路由

微服务的特点是服务特别多,但是对外要统一使用网关作为出入口,请求进入网关之后需要路由到后端的各个服务,实现网关路由的方式有两种:静态路由和动态路由。静态路由和动态路由最大的区别在于路由信息是否写死在路由表中,对应到网关路由上就是是否需要重启网关新配置的路由或者修改的路由才能生效,不用重启就生效的就是动态路由,需要重启的就是静态路由。我们在《API网关-Zuul》中已经使用过了静态路由了(文章访问链接:),今天我们一起来学习一下如何使用config实现动态路由。

简单说一下使用springcloud config实现动态路由的原理,路由信息配置在配置文件中,zuul实现配置客户端,实时去获取配置文件的配置信息,有新服务加入,zuul可以实时感知到。

2、zuul+config实现动态路由实例

2.1 创建服务提供者

创建服务提供者项目springcloud-provider1,controller层代码如下所示:

@RestController
public class ProviderController {
    @RequestMapping("/helloprovider")
    public String hello(){
        return "hello-provider1";
    }
}

application.yml配置文件如下所示:

#端口号
server:
  port: 8001
#Eureka实例名,集群中根据这里相互识别
spring:
  application:
    name: hello-service

eureka:
  #客户端
  client:
    #注册中心地址
    service-url:
      defaultZone: http://localhost:7001/eureka/

2.2 创建路由配置文件

创建路由配置文件dynamic-route-dev.yml

zuul:
  routes:
    hello-service:
      path: /hello-service/**
      serviceId: hello-service

其中serviceId是服务提供者的服务名,path是访问路径。

2.3 创建配置服务端

创建项目springcloud-config-server,application.yml配置文件如下所示:

server:
  port: 9898
#服务名字
spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          #git 仓库的地址
          uri: https://github.com/xiaoyususu/springcloud-dynamic-route.git
          search-paths: config-file
          #git 仓库的账号密码
          username: username
          password: password
#加入注册中心,实现高可用
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/

其他配置不在赘述。 

2.3 创建网关

创建项目springcloud-dynamicroute,pom.xml配置文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud-dynamic-route</artifactId>
        <groupId>com.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.springcloud</groupId>
    <artifactId>springcloud-dynamicroute</artifactId>

    <dependencies>
        <!-- Zuul的依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>
        <!-- Eureka的依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <!--Config客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
    </dependencies>

</project>

创建bootstrap.yml配置文件:

spring:
  application:
    name: dynamic-route-zuul                            #这个名字用做拉取配置文件的名称
  cloud:
    config:
      uri: http://localhost:9898/                         #指定Spring Cloud Config开放的项目端口
server:
  port: 5556
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:7001/eureka/     #注册到注册中心中

创建启动类DynamicRouteApplication.java

@EnableZuulProxy
@SpringCloudApplication
@ComponentScan
public class DynamicRouteApplication {

    public static void main(String[] args) {
        SpringApplication.run(DynamicRouteApplication.class, args);
    }

    @Bean
    @RefreshScope
    @ConfigurationProperties("zuul")
    public ZuulProperties zuulProperties(){
        return new ZuulProperties();
    }
}

启动注册中心springcloud-eureka1、springcloud-eureka2,启动服务提供者springcloud-provider1、springcloud-provider2,启动配置服务端springcloud-config-server,启动网关springcloud-dynamicroute,浏览器访问

http://localhost:5556/hello-service/helloprovider

依次得到如下结果:

springcloud中的gateway是如何解决动态路由的 springcloud 动态路由_配置文件

2.4 创建新服务提供者

创建服务提供者springcloud-provider2,controller层代码如下所示:

@RestController
public class ProviderController {
    @RequestMapping("/route")
    public String hello(){
        return "route";
    }
}

application.yml配置文件如下所示:

#端口号
server:
  port: 8002
#Eureka实例名,集群中根据这里相互识别
spring:
  application:
    name: hello-route

eureka:
  #客户端
  client:
    #注册中心地址
    service-url:
      defaultZone: http://localhost:7002/eureka/

其他配置不在赘述。

修改路由配置文件dynamic-route-dev.yml,添加服务hello-route

zuul:
  routes:
    hello-service:
      path: /hello-service/**
      serviceId: hello-service
    hello-route:
      path: /hello-route/**
      serviceId: hello-route

启动服务提供者springcloud-provider2,浏览器访问

http://localhost:5556/hello-route/route

的到如下结果

springcloud中的gateway是如何解决动态路由的 springcloud 动态路由_spring_02

可以看到路由没有重启,只需要修改一下路由配置文件,新加的服务就生效了。

3、总结

本文演示了如何使用springcloud zuul和springcloud config实现动态路由,感兴趣的小伙伴可以依次为基础创建项目或者深入学习,本文源码下载地址:https://github.com/xiaoyususu/springcloud-dynamic-route.git