首页 > 其他分享 >SpringCloud-使用路由网关统一访问接口(附代码下载)

SpringCloud-使用路由网关统一访问接口(附代码下载)

时间:2023-03-12 10:35:04浏览次数:47  
标签:网关 SpringCloud springframework 路由 spring org import hello cloud



上面在实现了使用熔断仪表盘进行监控熔断后,使用路由网关统一访问接口。

API网关

API网关负责请求路由、组合和协议转发。所有的客户端请求首先要通过API网关,之后请求被路由到适当的服务。

API网关通常会调用多个微服务和聚合结果来处理一个请求。它可以在Web协议(如HTTP和WebSocket)和利用于内部的非Web友好协议之间进行转换。

负载均衡方式

在Spring Cloud微服务系统中,一种常见的负载均衡方式是:客户端的请求先经过负载均衡(Zuul、Nginx),再到达服务网关(Zuul集群),然后再到具体的服务。服务统一注册到高可用的服务注册中心集群,服务的所有的配置文件放在Git仓库,方便开发人员随时改配置。

Zuul简介

Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分。

Zuul默认和Ribbon结合实现了负载均衡的功能。

注:

关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

参考上面构建项目的方式,依次建立目录hello-spring-cloud-zuul目录以及在

目录下新建pom.xml,并将其托管。然后新建src/main/java目录和src/main/resources目录并分别进行目录设置。

然后在java下新建包,包下新建启动类,在resources下新建配置文件application.yml。

完成后的目录为:

 

SpringCloud-使用路由网关统一访问接口(附代码下载)_xml

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>javascript:void(0)</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-zuul

server:
port: 8769

eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/

zuul:
routes:
api-a:
path: /api/a/**
serviceId: hello-spring-cloud-web-admin-ribbon
api-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);
}
}

至此整个服务体系的结构如下

SpringCloud-使用路由网关统一访问接口(附代码下载)_ide_02

 

效果

我们依次启动Eureka服务、服务提供者、两个服务消费者、zuul的Application启动类

SpringCloud-使用路由网关统一访问接口(附代码下载)_spring_03

 

然后打开浏览器,输入:

​​http://localhost:8761/​​

打开Eureka的服务与注册发现中心,发现全部被注册并发现

SpringCloud-使用路由网关统一访问接口(附代码下载)_ide_04

 

然后再打开浏览器输入:

​​http://localhost:8769/api/a/hi?message=HelloZuulFromBadao​​

 

SpringCloud-使用路由网关统一访问接口(附代码下载)_Zuul_05

再打开浏览器输入:

​​http://localhost:8769/api/b/hi?message=HelloZuulFromBadao​​

SpringCloud-使用路由网关统一访问接口(附代码下载)_xml_06

 

则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 {

@Override
public String getRoute() {
// ServiceId,如果需要所有调用都支持回退,则 return "*" 或 return null
return "hello-spring-cloud-web-admin-feign";
}

/**
* 如果请求服务失败,则返回指定的信息给调用者
* @param route
* @param cause
* @return
*/
@Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
return new ClientHttpResponse() {
/**
* 网关向 api 服务请求失败了,但是消费者客户端向网关发起的请求是成功的,
* 不应该把 api 的 404,500 等问题抛给客户端
* 网关和 api 服务集群对于客户端来说是黑盒
* @return
* @throws IOException
*/
@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.OK;
}

@Override
public int getRawStatusCode() throws IOException {
return HttpStatus.OK.value();
}

@Override
public String getStatusText() throws IOException {
return HttpStatus.OK.getReasonPhrase();
}

@Override
public void close() {

}

@Override
public 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"));
}

@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
// 和 getBody 中的内容编码一致
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
return headers;
}
};
}
}


标签:网关,SpringCloud,springframework,路由,spring,org,import,hello,cloud
From: https://blog.51cto.com/BADAOLIUMANGQZ/6115500

相关文章

  • SpringCloud-创建服务消费者-Feign方式(附代码下载)
    场景在上面已经实现服务注册中心、服务提供者和以Ribbon方式实现服务消费者的前提下,使用另一种Feign方式实现服务消费者。FeignFeign是一个声明式的伪Http客户端,它使得写......
  • SpringCloud -创建统一的依赖管理
    场景SpringCloud为开发者提供了在分布式系统(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性Token,全居琐,Leader选举,分布式Session,集群状态)中快速构建的工具,使用Spring......
  • 网关采集电表_RS485_698透传
    1,网关配置  2,集中器设置       ......
  • SpringCloud第一部分(认识微服务、RestTemplate、Eureka、Ribbon、Nacos、Feign)
    认识微服务单体架构将业务的所有功能集中在一个项目中开发打成一个包部署优点:架构简单部署成本低缺点:耦合度高分布式架构根据业务功能对系统进行拆分,每个业......
  • VueRouter路由与Vuex状态管理
    路由的基本搭建与嵌套路由模式vue路由的搭建路由在vue中属于第三方插件,需要下载安装后进行使用。版本说明一下,Vue3搭配的是VueRouter4,目前正常安装的话,就是路由4的版本......
  • routers自动生成路由
    1.routers自动生成路由:1_1.routers自动生成路由代码:#自动生成路由第一步:导入router模块fromrest_frameworkimportrouters#自动生成路由第二步:有两个类,实例化得到对......
  • vue项目vuerouter动态添加路由坑中之坑
    出了什么问题请求到的动态路由数据该如何应用?addRoute()?你想的太简单了!!!起因最近在用通过网络请求到的路由记录来进行动态路由渲染后端大佬说路由全部放前端不......
  • Gin学习笔记--使用路由组分类处理请求
    在实际的项目开发中,均是模块化开发,同一模块化的功能接口,往往会有相同的接口前缀,比如说用户有不同的注册,登录等注册:http:..localhost:8080/user/register登录:http://loca......
  • Kuboard安装并部署springcloud微服务项目
    Kuboard安装并部署springcloud微服务项目Kuboard是一款k8s的管理界面,我认为它有页面美观(颜值即正义)、操作简洁、系统配置要求不高、对新手友好的特点。开发者认为他们......
  • 不是所有的LoRa网关都防爆-防爆LoRa基站推荐
    我们都知道LoRa技术是当前物联网应用的主流技术之一,其中LoRa基站,终端,DTU等一系列产品也都有着极高的性价比,因此,很多行业在向着智能化转型的时候,都会选择使用LoRa相关产品。......