欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringCloud实操(一)搭建API网关服务器

程序员文章站 2022-04-10 23:41:03
...

1. 概念部分

1.1 什么是API网关?

api网关就是应用程序接口网关,在微服务架构中分布着许多微服务,这些微服务不直接给用户调用,而是通过一个api网关的url为用户提供一致的服务。

1.2 为什么需要API网关?

为了简化调用逻辑,api网关对外提供一致的调用接口,可以简化客户端调用的复杂度。api网关可以将多个微服务的调用逻辑进行聚合,减少客户端的请求次数,优化客户端的使用体验。

1.3 API网关的主要功能是什么?

API网关主要功能是路由和服务治理。在微服务架构中,每个不同的后端服务可能都有用户维护的业务,所以在微服务中会有很多冗余的登录校验和签名校验,我们可以把微服务中的这些功能独立出来做成单独的OAuth2鉴权授权服务器,然后通过API网关调用OAuth2服务器来过滤用户的请求,保证对外服务的安全性。

Spring Cloud 提供了基于Netflix Zuul 实现的API网关组件 Spring Cloud Zuul,在Zuul中封装了API网关的各种功能,比如路由,过滤,Cookie和熔断与Ribbon的支持。
下面引用了Spring官网的图:

SpringCloud实操(一)搭建API网关服务器

2. 代码示例

创建项目 api-gateway , 在build.gradle中为项目添加依赖

dependencies {
   compile('org.springframework.cloud:spring-cloud-starter-zuul')
   compile('org.springframework.cloud:spring-cloud-starter-eureka')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}

创建项目配置文件 application.yml

#服务器配置
server:
  #端口
  port: 8080

#服务器发现注册配置
eureka:
  client:
    serviceUrl:
      #配置服务中心(可配置多个,用逗号隔开)
      defaultZone: https://www.apiboot.cn/eureka

#spring配置
spring:
  #应用配置
  application:
    #名称: api网关服务
    name: api-gateway

#API网关配置
zuul:
  #路由配置
  routes:
    producer:
      #响应的路径
      path: /producer/**
      #重定向到的服务(根据服务id名称从注册中心获取服务地址)
      serviceId:  producer-service

启动类添加注解

/**
* API网关服务
* @ EnableZuulProxy 支持网关路由
*/
@SpringBootApplication
@EnableZuulProxy
public class ApiGatewayApplication {

   public static void main(String[] args) {
      SpringApplication.run(ApiGatewayApplication.class, args);
   }
}

启动项目(为了测试方便,我把服务部署到自己的服务器上并用域名绑定)

打开服务注册中心 https://www.apiboot.cn/

SpringCloud实操(一)搭建API网关服务器


发现注册中心里面有三个服务,其中producer-server是我们的服务提供者,api-gateway是我们的api网关服务。

为了加以区分服务,我把api网关所在的服务端口也做了二级域名映射。
浏览器访问 api网关服务 https://api.apiboot.cn/

SpringCloud实操(一)搭建API网关服务器


我们的api网关服务目前只有一个根路径控制器,我们现在测试一下配置文件中配置的路径,看看能否实现重定向。
打开浏览器,输入地址: https://api.apiboot.cn/producer/hello?name=lanshiqin

SpringCloud实操(一)搭建API网关服务器


可以看到api网关服务已经成功将url重定向到producer-service所在的服务上。

相关标签: SpringCloud