文章目录
- 1 使用 Eureka 搭建注册中心
- 1.1 生成 Spring boot 项目
- 1.2 导入 eureka 包
- 1.3 添加启动文件及配置文件
- 1.4 修改项目为 Maven 父子结构
- 2. 搭建业务模块 system
- 2.1 添加 system 模块的基础文件
- 2.2 测试 system 模块功能
- 3.搭建路由模块
- 3.1 添加 gateway 模块基础文件
- 3.2 添加路由功能
- 3.3 添加路由拦截功能
1 使用 Eureka 搭建注册中心
Eureka,服务注册和发现,它提供了一个服务注册中心、服务发现的客户端,还有一个方便的查看所有注册的服务的界面。 所有的服务使用 Eureka 的服务发现客户端来将自己注册到 Eureka 的服务器上。之后的 system 模块和 gateway 模块都会在这里注册。
1.1 生成 Spring boot 项目
首先在 spring initializr 中生成一个 Spring boot 项目,下载后导入 IDEA 。(其中 Spring boot 版本号等可自行设置)
这时可以运行 CourseApplication ,但是会报错 cannot execute request on any known server
。
1.2 导入 eureka 包
新建一个叫 eureka 的 Maven 模块,修改其中的 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>course</artifactId><groupId>com.course</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>eureka</artifactId><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies></project>
1.3 添加启动文件及配置文件
在 java 包中添加 com.course 包,并添加EurekaApplication.java
文件,代码如下。
package com.course;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
import org.springframework.core.env.Environment;@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {private static final Logger LOG = LoggerFactory.getLogger(EurekaApplication.class);// public static void main(String[] args) {
// SpringApplication.run(EurekaApplication.class, args);
// }public static void main(String[] args){SpringApplication app = new SpringApplication(EurekaApplication.class);Environment env = app.run(args).getEnvironment();LOG.info("启动成功!");LOG.info("Eureka地址:\t http://127.0.0.1:{}",env.getProperty("server.port"));}}
在 resources文件夹中添加 application.properties 文件,代码如下。
spring.application.name=eureka
server.port=8761eureka.client.fetch-registry=false
eureka.client.register-with-eureka=false
这时运行 EurekaApplication.java 文件可以在 http://127.0.0.1:8761/ 中看到下图。
1.4 修改项目为 Maven 父子结构
这时就可以把 course 中的 src 文件夹给删掉了,此时整个项目就是一个 Maven 的父子模块结构,其中父模块只有一个 pom.xml 文件,子模块都是正常的 Maven 项目。
2. 搭建业务模块 system
系统的业务管理和系统管理都会放在system模块。
2.1 添加 system 模块的基础文件
在 course 中添加叫 system 的 Maven 项目,java 包中新建 com.course 包和 SystemApplication.java 文件,其中SystemApplication.java 文件代码如下。
package com.course.system;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.core.env.Environment;@SpringBootApplication
@EnableEurekaClient
public class SystemApplication {private static final Logger LOG = LoggerFactory.getLogger(SystemApplication.class);// public static void main(String[] args) {
// SpringApplication.run(EurekaApplication.class, args);
// }public static void main(String[] args){SpringApplication app = new SpringApplication(SystemApplication.class);Environment env = app.run(args).getEnvironment();LOG.info("启动成功!");LOG.info("System地址:\t http://127.0.0.1:{}",env.getProperty("server.port"));}}
在 resources 包新建 application.properties 文件,代码如下。
spring.application.name=system
server.port=9001
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
2.2 测试 system 模块功能
为了测试业务模块的功能,在 com.course 包下新建 controller 包,在包中新建 test.java 文件,代码如下。
package com.course.system.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class test {@RequestMapping("/test")public String test(){return "success";}
}
此时,eureka 中可以看到 system ,访问http://127.0.0.1:9001/test 可以看到 success。
3.搭建路由模块
系统的路由模块使用 Spring Cloud Gateway ,作为 Spring Cloud 生态系统中的网关,目标是替代 Netflix Zuul,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。
3.1 添加 gateway 模块基础文件
同上新建 gateway 模块、com.course包、GatewayApplication.java等文件。
其中 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>course</artifactId><groupId>com.course</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>gateway</artifactId><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></dependencies></project>
3.2 添加路由功能
GatewayApplication.java 和 SystemApplication.java 类似,只需重构rename。application.properties 文件代码如下。
spring.application.name=gateway
server.port=9000eureka.client.service-url.defaultZone=http://localhost:8761/eureka/#路由转发
#id 需要转发的业务模块
#uri 需要转发的业务模块地址
#predicates[0].name 基于路径转发
#predicates[0].args[0] 路径要求
spring.cloud.gateway.routes[0].id=system
spring.cloud.gateway.routes[0].uri=http://127.0.0.1:9001
spring.cloud.gateway.routes[0].predicates[0].name=Path
spring.cloud.gateway.routes[0].predicates[0].args[0]=/system/**
其中,从 RouteDefinition 可以看到 predicates 是 PredicateDefinition 类的一个集合,name 和 args 分别是方法和路径。
此时,需要访问地址为 http://127.0.0.1:9001/system/test,同时 http://127.0.0.1:9000/system/test 也可以访问这个网页,后面可以加上拦截器,阻止直接访问9001等服务端口,只需暴露一个9000的路由端口即可访问所有的页面。
3.3 添加路由拦截功能
可以在 system 模块的 application.properties 添加server.servlet.context-path=/system
,这样只有端口后是 /system 才能访问 system 的页面。
这样就把项目的基本框架搭建好了。