Spring Cloud课题实验手册(三)

在本系列的 上一篇文章 中,我们将一个普通的 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/> <!-- lookup parent from repository -->
</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 中启动应用,然后在浏览器中打开:

1
http://localhost:8761

可以看到todo 服务和 gateway 服务已经注册到注册服务器中了。

接着在浏览其中打开:

1
http://localhost:9098/api/todo/todo

如果正常,应该得到 cloud-todo-service 的返回的待办事项,是一个 json 数组。

下一步

下一步 中,我们将为 Gateway 增加限流功能。

本文标题:Spring Cloud课题实验手册(三)

文章作者:梅老师

发布时间:2019年10月31日 - 17:10

最后更新:2020年09月16日 - 08:09

原始链接:https://www.mls-tech.info/microservice/spring-cloud/springcloud-practise-manual-03/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。