赞
踩
目录
微服务的特点是服务特别多,但是对外要统一使用网关作为出入口,请求进入网关之后需要路由到后端的各个服务,实现网关路由的方式有两种:静态路由和动态路由。静态路由和动态路由最大的区别在于路由信息是否写死在路由表中,对应到网关路由上就是是否需要重启网关新配置的路由或者修改的路由才能生效,不用重启就生效的就是动态路由,需要重启的就是静态路由。我们在《API网关-Zuul》中已经使用过了静态路由了(文章访问链接:https://blog.csdn.net/u010482601/article/details/103440962),今天我们一起来学习一下如何使用config实现动态路由。
简单说一下使用springcloud config实现动态路由的原理,路由信息配置在配置文件中,zuul实现配置客户端,实时去获取配置文件的配置信息,有新服务加入,zuul可以实时感知到。
创建服务提供者项目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/
创建路由配置文件dynamic-route-dev.yml
- zuul:
- routes:
- hello-service:
- path: /hello-service/**
- serviceId: hello-service
其中serviceId是服务提供者的服务名,path是访问路径。
创建项目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/
其他配置不在赘述。
创建项目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-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 zuul和springcloud config实现动态路由,感兴趣的小伙伴可以依次为基础创建项目或者深入学习,本文源码下载地址:https://github.com/xiaoyususu/springcloud-dynamic-route.git
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。