Nacos 服务发现-Spring Cloud Alibaba 综合架构实战(五) -实现 gateway 网关。
1、什么是网关?
原来的单体架构,所有的服务都是本地的,UI 可以直接调用,现在按功能拆分成独立的服务,
跑在独立的一般都在独立的虚拟机上的 java 进程了。
客户端 UI 如何访问?
他的后台有 N 个服务,前台就需要记住管理 N 个服务,一个服务下线/更新/升级,
前台就要重新部署,这明显不符合拆分的理念,特别是当前台是移动应用的时候,
通常业务变化的节奏更快。另外,N 个小服务的调用也是一个不小的网络开销。
有了网关作为服务统一入口,就可以避免上述问题,不仅如此,服务网关是在微服务前面设置一道屏障,
请求先到服务网关,网关会对请求进行过虑、校验、路由等处理。有了服务网关可以提高微服务的安全性,
网关请求的合法性,请求不合法将被拦截,拒绝访问。
网关提供统一服务入口,让微服务对前台透明。
网关聚合后台的服务,节省流量,提升性能。
网关提供安全、过滤、流控等 API 管理功能。
2、什么是 Zuul ?
Spring Cloud Zuul 是整合 Netflix 公司的 Zuul 开源项目实现的微服务网关(API Gateway)。
它实现了请求路由、负载均衡、校验过滤等功能。
Zuul 官网:https://github.com/Netflix/zuul
3、Zuul 与 Nginx 在实际项目中,需要配合使用,Nginx 的作用是反向代理、负载均衡, Zuul 的作用是保障微服务的安全访问,拦截微服务请求,校验合法性及负载均衡。
4、在 api-gateway 子模块的 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>nacos-micro-service</artifactId>
<groupId>djh.it</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>api-gateway</artifactId>
<dependencies>
<!-- 引入 service-1-api 二级子模块依赖 -->
<dependency>
<groupId>djh.it</groupId>
<artifactId>service-1-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 引入 service-2-api 二级子模块依赖 -->
<dependency>
<groupId>djh.it</groupId>
<artifactId>service-2-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 引入 nacos 配置管理 依赖项 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- 引入 nacos 服务发现 依赖项 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入 zuul 依赖项 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<!-- 引入 feign 依赖项 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
</project>
<!-- C:\java-test\idea2019\nacos_discovery\nacos-micro-service\api-gateway\pom.xml -->
5、在 api-gateway 子模块中,创建 配置文件 bootstrap.yml
##C:\java-test\idea2019\nacos_discovery\nacos-micro-service\api-gateway\src\main\resources\bootstrap.yml
server:
port: 56010 # 启动端口 命令行注入。
#port: ${port:56010} # 启动端口设置为动态传参,如果未传参数,默认端口为 56010
#servlet:
#context-path: /application1
spring:
application:
name: api-gateway #spring应用名, # 注意 FeignClient 不支持名字带下划线
main:
allow-bean-definition-overriding: true # SpringBoot2.1 需要设定。
cloud:
nacos:
discovery: # 表示服务发现
server-addr: 127.0.0.1:8848 # nacos 服务器地址
namespace: b75c342f-8aeb-4f5a-a1d3-21f0738d7960 # dev开发环境(nacos-1.1.3)
cluster-name: DEFAULT
config: # 表示配置管理
server-addr: 127.0.0.1:8848 # 配置 nacos 中心地址
file-extension: yaml # 配置文件后缀名。
namespace: b75c342f-8aeb-4f5a-a1d3-21f0738d7960 # dev开发环境(nacos-1.1.3)。
group: NACOS_MICROSERVICE_GROUP # xx业务组。
6、浏览器地址栏输入:http://127.0.0.1:8848/nacos 登录 nacos 服务,在配置列表的,dev 开发环境,创建新配置。
Data ID : api-gateway.yaml
Group : NACOS_MICROSERVICE_GROUP
配置格式 :YAML
配置内容 :
zuul:
routes:
application1:
stripPrefix: false
path: /application1/**
7、在 api-gateway 子模块中,创建 网关 启动类 ApiGatewayBootstrap.java
/**
* C:\java-test\idea2019\nacos_discovery\nacos-micro-service\api-gateway\src\main\java\djh\it\microservice\gateway\ApiGatewayBootstrap.java
*
* 2024-4-13 在 api-gateway 子模块中,创建 网关 启动类 ApiGatewayBootstrap.java
*/
package djh.it.microservice.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
@EnableDiscoveryClient
@EnableZuulProxy
public class ApiGatewayBootstrap {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayBootstrap.class, args);
}
}
8、运行 网关 启动类 ApiGatewayBootstrap.java 进行测试,
再次 在浏览器地址栏输入:http://localhost:56010/application1/service
输出结果变为:test | Consumer invoke | Provider invoke
上一节相关代码请点击:
# Nacos 服务发现-Spring Cloud Alibaba 综合架构实战(四) -实现 service2 子模块。