在本系列的 上一篇文章 中,我们将一个普通的 Spring Boot 项目改造为 Spring Cloud 框架中的一个服务。在本文中,我们将实现一个 Gateway 服务,以便于调用改造好的 Todo 服务。
构建Gateway项目
在 IDEA 中构建一个简单的 Maven 项目,groupId 命名为: cn.com.hohistar.tutorial, artifactId 为: springcloud-gateway-srv, 然后将将以下的内容替换原 pom.xml 文件中的内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| <?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"> <modelVersion>4.0.0</modelVersion>
<groupId>cn.com.hohistgar.tutorial</groupId> <artifactId>springcloud-gateway-srv</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging>
<name>springcloud-gateway-srv</name> <description>Demo project for Spring Boot</description>
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> <relativePath/> </parent>
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.SR1</spring-cloud.version> </properties>
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency>
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
<repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/libs-milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
</project>
|
可以看到,我们将使用 Spring Cloud 的两个组件: netflix-zuul 和 netflix-eureka-client
新建启动类:
在 src/main/java 目录下新建一个包: cn.com.hohistgar.tutorial.springcloudgatewaysrv, 再在包中新建一个类, 名为: SpringcloudGatewaySrvApplication, 复制以下代码在内容:
1 2 3 4 5 6 7 8 9 10
| @EnableZuulProxy @EnableEurekaClient @SpringBootApplication public class SpringcloudGatewaySrvApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudGatewaySrvApplication.class, args); } }
|
其实 SpringcloudGatewaySrvApplication 就是一个 SpringBoot 的启动类,只是增加了两个注解: @EnableZuulProxy, @EnableEurekaClient 。
@EnableEurekaClient - 用来实现把自己(当前应用服务)注册到注册与发现服务中
@EnableZuulProxy - 开启 Gateway 的功能
定义配置参数
在 src/main/resources 目录中新建一个名为: application.yaml 的文件,将以下内容复制到文件中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| server: port: 9098
spring: application: name: gateway
eureka: instance: leaseRenewalIntervalInSeconds: 1 leaseExpirationDurationInSeconds: 2 client: serviceUrl: defaultZone: http://localhost:8761/eureka/ healthcheck: enabled: true lease: duration: 5
zuul: prefix: /api routes: todo-by-service: path: /todo/** serviceId: cloud-todo-service
|
可以看到,整个配置文件分为四段,第一,第二段是普通的 Spring Boot 项目设置,指明项目运行的端口和项目名称。第三段是注册服务的客户端配置,注意将 defaultZone 换为环境中实际运行的注册服务的地址和端口。最后一部分是 Gateway 的配置,在当前的例子中,我们只配置了路由,将对 todo 路径的访问转发到 cloud-todo-service 中。
运行并验证
注意:在运行 Gateway 之前,确保在手册一和二中将来的服务已经运行
在 IDEA 中启动应用,然后在浏览器中打开:
可以看到todo 服务和 gateway 服务已经注册到注册服务器中了。
接着在浏览其中打开:
1
| http://localhost:9098/api/todo/todo
|
如果正常,应该得到 cloud-todo-service 的返回的待办事项,是一个 json 数组。
下一步
在下一步 中,我们将为 Gateway 增加限流功能。