微服务 @SentinelResource 服务网关

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 微服务 @SentinelResource 服务网关


@SentinelResource

自定义异常返回是对所有的情况进行统一处理,但针对一些特定的情况我们要单独处理
代码示例:

@RestController
    @Slf4j
    public class AnnoController {
        //设置流控规则 qp=3
        //访问/anno1达到阈值,调用annolBlockHandler方法,并返回内容
        //
        @RequestMapping("/anno1")
        @SentinelResource(value = "anno1",
                          blockHandler = "annoBlockHandles",//当前方法如果被限流或者被降级会调用这个字符串对应的方法
                          fallback = "annoFallback")//当方法出现异常之后,会调用这个字符串对应的方法
        public String anno1(String name){
            if("wolfcode".equals(name)){
                throw new RuntimeException();
            }
            return "anno1";
        }
        public String annoBlockHandles(String name, BlockException ex){
            log.error("{}",ex);
            return "接口被限流或者降级了";
        }
        //Throwable时进入的方法
        public String annoFallback(String name,Throwable throwable){
            log.error("{}",throwable);
            return "接口发生异常了";
        }
    }

blockHandler:当方法如果被限流或者被降级会调用这个字符串对应的方法

falback:当方法出现异常之后,会调用这个字符串对应方法
设置的流控规则 qps=3
访问/anno1 ==>达到阈值,调用anno1BlockHandler方法,并返回内容



访问/anno1?name="wolfback"




Feign整合Sentinel

什么场景下需要Feign集合Sentinel呢?

比如我们在购物的时候,查看商品详情页面的时候,里面包含库存信息,商品详情信息,评论信息,这个需求包含的微服务如下:

假设现在评论服务宕机了,那是不是意味用户发出查看商品请求也无法正常显示了,商品都看不到了,那用户也无法进行下单的操作了.但是对于用户来说,评论看不到并不影响他购物,所以这时候我们应该对评论服务进行及·降级处理,返回一个兜底数据(空数据),这样用户的查看商品请求能正常显示,只是评论数据看不到而已,这样的话,用户的下单请求也不会受到影响.

正常情况下:


若商品服务挂了:


解决方案:

创建容错类:

@Component
    public class ProductFeignFallback implements ProductFeignApi {
        @Override
        public Product findByPid(Long pid) {
            System.out.println("返回兜底数据");
            return new Product();
        }
    }

创建feign接口定义容错类

//远程调用服务名称
@FeignClient(name = "product-service",fallback = ProductFeignFallback.class)
    public interface ProductFeignApi {
        @RequestMapping("/product/{pid}")
        Product findByPid(@PathVariable("pid") Long pid);
    }

在shop-order-server项目的配置文件中开启feign对Sentinel的支持

feign:
  sentinel:
    enabled: true

运行结果:





服务网关

为什么需要网关

1.记录很多的服务地址

2.在后端微服务做集群的情况下,前端需要进行负载均衡

3.微服务的统一处理逻辑,需要在每个微服务中都实现一次

网关组件

统一请求入口,进行统一逻辑的处理,对后端微服务集群进行负载均衡,网络的隔离
实现步骤
1.网关获取到请求地址,默认截取域名后面的部分请求路径 product-serve

2.拿到路径信息和路由规则进行匹配,可以获取到对应的服务名product-service

3.拿到服务名在本地的缓存列表中找到对应的ip地址

4.进行URL地址拼接 http://192.168.10.110/product/1进行网络的调用

Gateway快速入门

什么是Gateway

Spring Cloud Gateway是Spring公司基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的API路由管理方式。它的目标是替代Netflflx Zuul,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控和限流。

操作示例

1.创建一个api-gateway的模块,导入相关依赖

<?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">
    <parent>
        <artifactId>shop-parent</artifactId>
        <groupId>cn.wolfcode</groupId>
        <version>1.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>api-gateway</artifactId>
    <dependencies>
        <!--gateway网关-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--nacos客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
</project>

2.编写启动类

@SpringBootApplication
    @EnableDiscoveryClient
    public class ApiGatewayServer {
        public static void main(String[] args) {
            SpringApplication.run(ApiGatewayServer.class,args);
        }
    }

3.编写配置文件

server:
  port: 9000
spring:
  application:
    name: api-gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          enabled: true #让gateway可以发现nacos中的微服务

测试:




自定义路由规则

spring:
  application:
    name: api-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.80.131:8848
    gateway:
      discovery:
        locator:
          enabled: true #让gateway可以发现nacos中的微服务
      routes:
      - id: product_route
        uri: lb://product-service
        predicates:
        - Path=/product-serv/**
        filters:
        - StripPrefix=1
      - id: order_route
        uri: lb://order-service
        predicates:
        - Path=/order-serv/**
        filters:
        - StripPrefix=1

id:路由名称,保证唯一

uri: 将符合条件的请求转发到哪个微服务,1b表示对服务进行负载均衡

predicates:拦截那些请求

filters:在转发请求之前,将拦截到的路径的第一层路径删除掉

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
7天前
|
微服务 应用服务中间件
微服务跨域(通过网关配置进行跨域)
在单体架构中,我们通常通过SpringMVC配置类实现CORS跨域支持,设置允许的来源、请求头、方法及凭证等。然而,在微服务架构下,因浏览器首先访问网关再进行服务路由,需在网关配置跨域。对于无SpringMVC环境的网关(如使用Gateway组件),我们可在YAML文件中配置`spring.cloud.gateway.globalcors`属性,以实现全局跨域支持。
26 0
|
1天前
|
消息中间件 Java API
解密微服务架构:如何在Java中实现高效的服务通信
微服务架构作为一种现代软件开发模式,通过将应用拆分成多个独立的服务,提升了系统的灵活性和扩展性。然而,实现微服务之间的高效通信仍然是许多开发者面临的挑战。本文将探讨在Java环境中实现微服务架构时,如何使用不同的通信机制来优化服务之间的交互,包括同步和异步通信的方法,以及相关的最佳实践。
|
4天前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 API 网关 2024 年 07 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要。
|
6天前
|
API
阿里云微服务引擎及 API 网关 2024 年 7 月产品动态
阿里云微服务引擎及 API 网关 2024 年 7 月产品动态。
|
9天前
|
设计模式 监控 API
探索微服务架构中的API网关模式
在微服务的宇宙里,API网关是连接星辰的桥梁。它不仅管理着服务间的通信流量,还肩负着保护、增强和监控微服务集群的重任。本文将带你走进API网关的世界,了解其如何成为微服务架构中不可或缺的一环,以及它在实际应用中扮演的角色和面临的挑战。
|
12天前
|
安全 前端开发 Java
微服务网关及其配置
微服务网关及其配置
51 4
|
13天前
|
缓存 监控 API
【微服务战场上的神秘守门人】:揭秘API网关的超能力 —— 探索微服务架构中的终极守护者与它的神奇魔法!
【8月更文挑战第7天】随着微服务架构的流行,企业应用被拆分为围绕特定业务功能构建的小型服务。API网关作为微服务间的通信管理核心,对请求进行路由、认证、限流等处理,简化客户端集成并提升用户体验。以电商应用为例,通过Kong部署API网关,配置产品目录等服务的API及JWT认证插件,确保安全高效的数据交互。这种方式不仅增强了系统的可维护性和扩展性,还提供了额外的安全保障。
31 2
|
13天前
|
Prometheus 监控 Java
微服务架构下的服务治理策略:打破服务混乱的惊天秘籍,开启系统稳定的神奇之门!
【8月更文挑战第7天】微服务架构将应用细分为可独立部署的小服务,提升灵活性与可扩展性。但服务增多带来治理挑战。通过服务注册与发现(如Eureka)、容错机制(如Hystrix)、监控工具(如Prometheus+Grafana)、集中配置管理(如Spring Cloud Config)和服务网关(如Zuul),可有效解决这些挑战,确保系统的高可用性和性能。合理运用这些技术和策略,能充分发挥微服务优势,构建高效应用系统。
26 1
|
4天前
|
Kubernetes Nacos 微服务
【技术难题破解】Nacos v2.2.3 + K8s 微服务注册:强制删除 Pod 却不消失?!7步排查法+实战代码,手把手教你解决Nacos Pod僵死问题,让服务瞬间满血复活!
【8月更文挑战第15天】Nacos作为微服务注册与配置中心受到欢迎,但有时会遇到“v2.2.3 k8s 微服务注册nacos强制删除 pod不消失”的问题。本文介绍此现象及其解决方法,帮助开发者确保服务稳定运行。首先需检查Pod状态与事件、配置文件及Nacos配置,确认无误后可调整Pod生命周期管理,并检查Kubernetes版本兼容性。若问题持续,考虑使用Finalizers、审查Nacos日志或借助Kubernetes诊断工具。必要时,可尝试手动强制删除Pod。通过系统排查,通常能有效解决此问题。
10 0
|
12天前
|
API Go 数据安全/隐私保护
go-zero微服务框架的静态文件服务
【8月更文挑战第7天】`go-zero` 微服务框架支持多种静态文件服务实现方式。常用方法是利用 `Go` 标准库 `http.FileServer`。通过设置静态文件根目录并使用 `http.StripPrefix` 去除路径前缀,能确保 `/static/` 开头的请求正确返回文件。此外,结合 `go-zero` 的路由机制可更灵活地控制静态文件服务,例如仅在特定 API 路径 `/api/static` 下提供服务,从而实现精细化访问控制。