SpringCloud-使用路由网关统一访问接口(附代码下载)
场景
SpringCloud-使用熔断器仪表盘监控熔断:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102673599
SpringCloud -创建统一的依赖管理:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102530574
上面在实现了使用熔断仪表盘进行监控熔断后,使用路由网关统一访问接口。
API网关
API网关负责请求路由、组合和协议转发。所有的客户端请求首先要通过API网关,之后请求被路由到适当的服务。
API网关通常会调用多个微服务和聚合结果来处理一个请求。它可以在Web协议(如HTTP和WebSocket)和利用于内部的非Web友好协议之间进行转换。
负载均衡方式
在Spring Cloud微服务系统中,一种常见的负载均衡方式是:客户端的请求先经过负载均衡(Zuul、Nginx),再到达服务网关(Zuul集群),然后再到具体的服务。服务统一注册到高可用的服务注册中心集群,服务的所有的配置文件放在Git仓库,方便开发人员随时改配置。
Zuul简介
Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分。
Zuul默认和Ribbon结合实现了负载均衡的功能。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
实现
参考上面构建项目的方式,依次建立目录hello-spring-cloud-zuul目录以及在
目录下新建pom.xml,并将其托管。然后新建src/main/java目录和src/main/resources目录并分别进行目录设置。
然后在java下新建包,包下新建启动类,在resources下新建配置文件application.yml。
完成后的目录为:
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"><modelVersion>4.0.0</modelVersion><parent><groupId>com.badao</groupId><artifactId>hello-spring-cloud-dependencies</artifactId><version>1.0.0-SNAPSHOT</version><relativePath>../hello-spring-cloud-dependencies/pom.xml</relativePath></parent><artifactId>hello-spring-cloud-zuul</artifactId><packaging>jar</packaging><name>hello-spring-cloud-zuul</name><url>https://blog.csdn.net/badao_liumang_qizhi</url><inceptionYear>2019-Now</inceptionYear><dependencies><!-- Spring Boot Begin --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- Spring Boot End --><!-- Spring Cloud Begin --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency><!-- Spring Cloud End --></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><mainClass>com.badao.hello.spring.cloud.zuul.ZuulApplication</mainClass></configuration></plugin></plugins></build>
</project>
配置文件application.yml代码
spring:application:name: hello-spring-cloud-zuulserver:port: 8769eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/zuul:routes:api-a:path: /api/a/**serviceId: hello-spring-cloud-web-admin-ribbonapi-b:path: /api/b/**serviceId: hello-spring-cloud-web-admin-feign
注:
以 /api/a 开头的请求都转发给 hello-spring-cloud-web-admin-ribbon 服务
以 /api/b 开头的请求都转发给 hello-spring-cloud-web-admin-feign 服务
其中routes是固定的,但是api-a与api-b是自己定义的。
在自定义的路由中,path代表请求的路径,serviceId代表真正映射的服务的Id。
在path中**代表通配符,即以/api/a开头的都会请求同组内的serviceId所对应的服务。
然后在包下新建com.badao.hello.spring.cloud.zuul包,并在包下新建ZuulApplication启动类
package com.badao.hello.spring.cloud.zuul;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class ZuulApplication {public static void main(String[] args) {SpringApplication.run(ZuulApplication.class, args);}
}
至此整个服务体系的结构如下
效果
我们依次启动Eureka服务、服务提供者、两个服务消费者、zuul的Application启动类
然后打开浏览器,输入:
http://localhost:8761/
打开Eureka的服务与注册发现中心,发现全部被注册并发现
然后再打开浏览器输入:
http://localhost:8769/api/a/hi?message=HelloZuulFromBadao
再打开浏览器输入:
http://localhost:8769/api/b/hi?message=HelloZuulFromBadao
则Zuul的路由配置功能配置成功。
配置网关路由失败时的回调
有时如果因为网络、内存等原因导致网关路由失败,则需要配置失败时的回调。
再新建fallback包,包下新建WebAdminFeignFallbackProvider
package com.badao.hello.spring.cloud.zuul.fallback;import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
@Component
public class WebAdminFeignFallbackProvider implements FallbackProvider {@Overridepublic String getRoute() {// ServiceId,如果需要所有调用都支持回退,则 return "*" 或 return nullreturn "hello-spring-cloud-web-admin-feign";}/*** 如果请求服务失败,则返回指定的信息给调用者* @param route* @param cause* @return*/@Overridepublic ClientHttpResponse fallbackResponse(String route, Throwable cause) {return new ClientHttpResponse() {/*** 网关向 api 服务请求失败了,但是消费者客户端向网关发起的请求是成功的,* 不应该把 api 的 404,500 等问题抛给客户端* 网关和 api 服务集群对于客户端来说是黑盒* @return* @throws IOException*/@Overridepublic HttpStatus getStatusCode() throws IOException {return HttpStatus.OK;}@Overridepublic int getRawStatusCode() throws IOException {return HttpStatus.OK.value();}@Overridepublic String getStatusText() throws IOException {return HttpStatus.OK.getReasonPhrase();}@Overridepublic void close() {}@Overridepublic InputStream getBody() throws IOException {ObjectMapper objectMapper = new ObjectMapper();Map<String, Object> map = new HashMap<>();map.put("status", 200);map.put("message", "无法连接,请检查您的网络");return new ByteArrayInputStream(objectMapper.writeValueAsString(map).getBytes("UTF-8"));}@Overridepublic HttpHeaders getHeaders() {HttpHeaders headers = new HttpHeaders();// 和 getBody 中的内容编码一致headers.setContentType(MediaType.APPLICATION_JSON_UTF8);return headers;}};}
}
代码下载
https://download.csdn.net/download/badao_liumang_qizhi/11908425
SpringCloud-使用路由网关统一访问接口(附代码下载)相关推荐
- 从实例一步一步入门学习SpringCloud的Eureka、Ribbon、Feign、熔断器、Zuul的简单使用(附代码下载)
场景 SpringCloud -创建统一的依赖管理: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102530574 Sprin ...
- 解决SpringCloud的Gateway网关无法访问服务的静态资源
解决SpringCloud的Gateway网关无法访问服务的静态资源 在重构项目的时候,配置gateway网关后,利用网关地址访问服务,发现服务的静态资源报了404 报错如下: gateway网关配置 ...
- 分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载
一.分布式消息总线以及基于Socket的实现 在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给大家分享和介绍了一个极其简单也非常容易上的基于.N ...
- ASP.NET的MVC中使用Cookie做身份验证(附代码下载)
场景 ASP.NET的MVC中使用Session做身份验证(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1071 ...
- Dubbo与SpringBoot整合流程(从实例入手,附代码下载)
场景 Dubbo环境搭建-管理控制台dubbo-admin实现服务监控: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10362 ...
- Ionic+Angular实现中英国际化(附代码下载)
场景 Ionic介绍以及搭建环境.新建和运行项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/106308166 在上面搭建起 ...
- Ionic+Angular+Express实现前后端交互使用HttpClient发送get请求数据并加载显示(附代码下载)
场景 Ionic介绍以及搭建环境.新建和运行项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/106308166 在上面搭建起 ...
- JPA中实现双向多对多的关联关系(附代码下载)
场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...
- springcloud 之 路由网关 zuul
话不多说,先上图(图是丑陋了点,大家别介意哈),这幅图是我根据公司现有的业务设计出来的一个简单的基于springcloud微服务架构图. 在springcloud微服务体系中,我们一般不对外直接暴露服 ...
最新文章
- Docker的原理及特性介绍
- Intelij IDEA管理git之远程代码冲突解决方案
- 3年,从工程师到创始人
- jacoco+maven 初次使用覆盖率工具
- LR11安装报错:此计算机上缺少vc2005_sp1_with_atl_fix_redist,请安装所有缺少的必要组件,然后重新运行此安装。
- wpsmac历史版本_WPS Office 2019 1.2.0(1574) Mac中文正式版
- 虚拟机VMware安装苹果系统macOS,超级详细教程,附文件下载,真教程!!
- Cy5 COOH非活性染料溶于有机溶剂1032678-07-1 科研
- 设计并编写代码自动格斗类游戏
- win10更新后D盘变成CD驱动器
- 端到端的图像压缩----《Channel-wise Autoregressive Entropy Models For Learned Image Compression》论文笔记
- NameNode和DataNode中重要的数据结构解析
- 【excel】隔行引用另一表中连续数据
- U3D Anchors
- 2017年美国计算机科学,2017年U.S.News美国大学研究生计算机科学专业排名
- UART串口流控制(Flow control)
- 7-33 有理数加法 (15分) C++实现
- 网站开发CSS十条口诀
- 十六足球队,随机分四组
- docker数据卷容器挂载不上
热门文章
- 「后端小伙伴来学前端了」Vue脚手架中 render 函数
- php解析multilpart,使用PHP语言实现POP3邮件的解码
- java http参数传递_Java在HTTP请求中传递数组参数的方法
- java 矩阵题目_java练习本(20190604)
- python可以在哪些平台安装_python都有哪些版本,如何在你的计算机上运行python?...
- 无法打开 源 文件 pch.h_outlook 客户端数据文件无法打开,如何解决?
- spring.profiles.active配置了没生效_一文带你彻底学会 Git Hooks 配置
- 如何从零开始搭建知识图谱?
- spark端口实验总结:
- python内置函数教程_Python内置函数详解