springcloud 入门(6) 网关 zuul

简介: springcloud 入门(6) 网关 zuul

文章目录

介绍

zuul 是springcloud微服务的网关组件,用于构建边界服务,致力于动态路由、监控、过滤、弹性伸缩和安全。

zuul在微服务中起着至关重要的作用,它的作用主要体现在以下6个方面:


  1. Zuul 、 Ribbon 以及 Eureka 相结合,可以实现智能路由和负载均衡的功能, Zuul 能够将请求流量按某种策略分发到集群状态的多个服务实例。
  2. 网关将所有服务的 API 接口统一聚合,并统一对外暴露。外界系统调用 API 接口时,都是由网关对外暴露的 API 接口,外界系统不需要知道微服务系统中各服务相互调用的复杂性。微服务系统也保护了其内部微服务单元的 API 接口,防止其被外界直接调用,导致服务的敏感信息对外暴露。
  3. 网关服务可以做用户身份认证和权限认证,防止非法请求操作 API 接口,对服务器起到保护作用。
  4. 网关可以实现监控功能,实时日志输出,对请求进行记录。
  5. 网关可以用来实现流量监控,在高流量的情况下,对服务进行降级。
  6. API 接口从内部服务分离出来,方便做测试

使用

新建一个zuul-gateway 项目,依赖如下:

<dependencies>
        <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>
    </dependencies>

application.properties配置文件

server.port=8501
spring.application.name=zuul-gateway
# 此客户端是否应该从eureka server 获取eureka注册信息
eureka.client.register-with-eureka=false
# 和eureka服务器通讯的URL
eureka.client.service-url.defaultZone=http://localhost:8001/eureka
#eureka.instance.prefer-ip-address=true

启动类加注解EnableZuulProxy

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@EnableZuulProxy
@SpringBootApplication
public class ZuulApplication {
    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class, args);
    }
}

启动,通过Zuul代理访问http://localhost:8501/providers/provider/getName/yy

providers是我的providers服务的spring.application.name,providers后面的是providers服务的对外接口的访问路

image.png

修改为自定义的路由访问地址

zuul.routes后面是服务集群名,后面是自定义的服务集群

zuul.routes.providers=providers-proxy/**

访问http://localhost:8501/providers-proxy/provider/getName/yy

image.png

现在访问http://localhost:8501/providers/provider/getName/yy还是能访问到providers服务的,不让看到真实的路由,可以屏蔽路由访问前缀

# 忽略集群名,屏蔽服务对外访问的路由前缀
zuul.ignored-services=providers

再次重启访问 http://localhost:8501/providers/provider/getName/yy

image.png

每个屏蔽太麻烦,可以屏蔽所有的

# *是屏蔽所有的服务前缀
zuul.ignored-services=*

设置统一前缀,重启访问http://localhost:8501/zuul-proxy/providers-proxy/provider/getName/yy

# 设置公共前缀
zuul.prefix=/zuul-proxy

结果:

image.png

通过feign 访问zuul

之前consumer是通过feign访问providers的,现在zuul进行了代理再次访问就访问不到了,所以要修改consumer服务的接口,这样consumer的controller就不用修改了

//@FeignClient(name = "PROVIDER" , path = "provider" , fallback = ProviderServiceFallback.class)
@FeignClient(name = "ZUUL-GATEWAY" , path = "zuul-proxy/providers-proxy/provider" , fallback = ProviderServiceFallback.class)
//@FeignClient(name = "PROVIDER" , path = "provider" , fallbackFactory = ProviderFallbackFactory.class)
public interface ProviderService {
    @GetMapping("hello")
    public String test();
    @GetMapping("getName/{name}")
    public String testHystrix(@PathVariable String name);
}

zuul 熔断

虽然其他服务做了降级处理,zuul作为代理方也应该做降级处理

实现FallbackProvider接口,做一个简单的降级处理

@Component
public class ProviderFallback implements FallbackProvider {
    @Override
    public String getRoute() {
        return "*";
    }
    @Override
    public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
        final HttpStatus badRequest = HttpStatus.BAD_REQUEST;
        return new ClientHttpResponse() {
            @Override
            public HttpStatus getStatusCode() throws IOException {
                return badRequest;
            }
            @Override
            public int getRawStatusCode() throws IOException {
                return badRequest.value();
            }
            @Override
            public String getStatusText() throws IOException {
                return badRequest.getReasonPhrase();
            }
            @Override
            public void close() {
            }
            @Override
            public InputStream getBody() throws IOException {
                final String s = route + "服务不可用";
                return  new ByteArrayInputStream(s.getBytes());
            }
            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders headers = new HttpHeaders();
                headers.set("Content-Type", "text/html; charset=UTF-8");
                return headers;
            }
        };
    }
}

停止服务提供者,访问http://localhost:8501/zuul-proxy/providers-proxy/provider/getName/yy,出现下面结果,降级处理成功

image.png

至此zuul的简单使用就完成了


上篇:springcloud多模块项目一步一步搭建(5)Hystrix Dashboard &Turbine


下篇:springcloud多模块项目一步一步搭建(7)springcloud config


GitHub地址:

https://github.com/ArronSun/micro-services-practice.git


参考书籍:

《重新定义springcloud实战》

《深入理解Spring cloud与微服务构建》


能力一般,水平有限,如有错误,请多指出。


目录
相关文章
|
14天前
|
人工智能 安全 Java
AI 时代:从 Spring Cloud Alibaba 到 Spring AI Alibaba
本次分享由阿里云智能集团云原生微服务技术负责人李艳林主讲,主题为“AI时代:从Spring Cloud Alibaba到Spring AI Alibaba”。内容涵盖应用架构演进、AI agent框架发展趋势及Spring AI Alibaba的重磅发布。分享介绍了AI原生架构与传统架构的融合,强调了API优先、事件驱动和AI运维的重要性。同时,详细解析了Spring AI Alibaba的三层抽象设计,包括模型支持、工作流智能体编排及生产可用性构建能力,确保安全合规、高效部署与可观测性。最后,结合实际案例展示了如何利用私域数据优化AI应用,提升业务价值。
|
2月前
|
SpringCloudAlibaba Dubbo Java
【SpringCloud Alibaba系列】Dubbo基础入门篇
Dubbo是一款高性能、轻量级的开源Java RPC框架,提供面向接口代理的高性能RPC调用、智能负载均衡、服务自动注册和发现、运行期流量调度、可视化服务治理和运维等功能。
【SpringCloud Alibaba系列】Dubbo基础入门篇
|
25天前
|
人工智能 自然语言处理 Java
Spring Cloud Alibaba AI 入门与实践
本文将介绍 Spring Cloud Alibaba AI 的基本概念、主要特性和功能,并演示如何完成一个在线聊天和在线画图的 AI 应用。
255 7
|
2月前
|
消息中间件 监控 Java
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
45 6
|
2月前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
184 5
|
2月前
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
72 5
|
2月前
|
缓存 监控 Java
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
54 5
|
4月前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
4月前
|
XML Java 数据格式
如何使用 Spring Cloud 实现网关
如何使用 Spring Cloud 实现网关
61 3
|
5月前
|
负载均衡 Java 网络架构
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
227 5