当我们的架构实现前后端分离以后,前端和后端之间交互就是通过API网关进行,API网关两个职责:
1.设计上的适配层,或称Facade模式,后端微服务可能过于细粒度,通过API网关进行内外适配,前后端转换,如果220v转换成110v一样。
2.运行阶段:将外部请求路由分发到内部各个微服务,负载平衡和路由策略是需要的。
API网关,即边缘服务,为一组微服务提供统一的接口,以便客户无需了解微服务内部的所有细节。但是,在微服务架构中使用API网关模式有一些优缺点。
优点:
缺点:
Spring Cloud提供类似于Nginx的代理 Zuul,可用于创建API网关。最新版本已经使用非堵塞的Spring Cloud Gateway替代了Zuul,当然我们还是能通过Zuul方便使用了解学习API网关。本文看看Zuul如何将前端请求转发到后端的微服务。
现在我们已经掌握了一个规律,建立一个Springcloud项目,一般主要首先是Maven的配置,然后就是元注解,第三就是application.properties,按照这个开发步骤:
第一步, pom.xml配置如下,也可以使用idea的新模块导航,选择Spring.io进行一步步设置,生成如下配置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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-netflix-zuul</artifactId>
</dependency>
这里引入zuul库包是不奇怪的,那么为什么引入注册服务器呢?这个问题很好,本文我们将展示通过或不通过注册服务器两种应用场景:
1. 如果我们在application.properties配置
zuul.routes.producer.url=http://localhost:2111
这是将前端请求/producer/**都转发到端口2111上,这个功能就非常类似Nginx了,这种情况当然不需要服务注册服务器,因为没有有关服务信息,只是纯url信息。
2.如果我们在application.properties配置:
zuul.routes.peng.path=/producer/**
zuul.routes.peng.serviceId=PengProducerService
application.properties中Zuul路由的配置遵循以下模式:zuul.routes.+服务名称.+path或serviceId。这里我们随便取了服务名称peng,主要是为了辨识这个服务器名称在运行时是否起作用,当然实际中最好与服务名称一致,zuul.routes.peng.path=/producer/就是将前端请求/producer/**都转发到zuul.routes.peng.serviceId=中定义的PengProducerService,这个服务在哪里呢?就需要服务注册器了,那么我们需要在pom.xml中配置eureka。
好了,除了以上两种情况的不同配置,我们在application.properties中还要配置:
spring.application.name=zuulrouter
server.port=8080
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
这是常例配置,如果不需要eurake就去除,端口是开在8080,这里直接面对前端的端口,正式环境可以是80端口,这类似Nginx作用。
第三步看看元注解:
@SpringBootApplication
@EnableZuulProxy
public class ZuulrouterApplication {
public static void main(String\[\] args) {
SpringApplication.run(ZuulrouterApplication.class, args);
}
}
@EnableZuulProxy是需要的。
好了我们完成开发配置,下面可以运行测试,我们也分两种情况:
1. 先启动模块producer,测试第一种情况纯粹url转发:
http://localhost:8080/producer/articles
这个请求将被Zuul路由转发到2111端口的producer,访问其中/articles。
2.再启动eureka注册服务器,再启动producer,测试第二种情况:
http://localhost:8080/producer/articles
这是根据服务Id进行转发的。
为了测试两种情况对应注册服务器是否启动,可以对application.properties里面配置错配,比如使用服务Id转发,如果不启动注册服务器,则无法访问成功。
本文源码案例:百度网盘
附:API网关能够实现Nginx +Lua复杂的路由分发逻辑,包括动静网页分离,权限检查等,下面是application.yml格式的配置案例,学完以上教程以后应该能看懂:
logging:
level:
org.springframework.security: DEBUG
org.springframework.cloud: DEBUG
org.springframework.web: WARN
server:
port: 8080
spring:
aop:
proxy-target-class: true
zuul:
routes:
startpage:
path: /**
url: http://localhost:8081
resource:
path: /resource/**
url: http://localhost:9001/resource
user:
path: /user/**
url: http://localhost:9999/uaa/user
security:
oauth2:
client:
accessTokenUri: http://localhost:9999/uaa/oauth/token
userAuthorizationUri: http://localhost:9999/uaa/oauth/authorize
clientId: ui1
clientSecret: ui1-secret
resource:
userInfoUri: http://localhost:9999/uaa/user
preferTokenInfo: false
sessions: ALWAYS
Original url: Access
Created at: 2019-03-07 16:45:23
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论