【Java】 Nacos与Gateway使用负载均衡

Java系列文章目录

IDEA使用指南

Java泛型总结(快速上手详解)

Java Lambda表达式总结(快速上手详解)

Java Optional容器总结(快速上手图解)

Java 自定义注解笔记总结(油管)

Java 抽象知识笔记总结(油管)


一、前言

  • 近期学习Gateway与Nacos的实操笔记总结
  • 通过Nacos观察gateway的作用

二、学习内容:

  • Gateway实操学习
  • Nacos实操学习
  • Knif4j配置
  • 均衡负载
  • 灰度发布策略
  • 微服务知识学习

三、问题描述

  • 实操经验不丰富

四、解决方案:

4.1 认识依赖

4.1.1 认识Nacos依赖

4.1.1.1配置中心依赖

需要拉取Nacos配置的时候要有

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  • 功能: 提供了Nacos作为配置中心的能力。
  • 作用: 允许Spring Cloud应用从Nacos服务器上拉取配置信息,并自动刷新应用内的配置。

🌟 应用场景: 当你需要集中管理和动态更新应用配置时使用。

4.1.1.2注册依赖

使用Nacos这个必须要有

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  • 功能: 提供了Nacos作为服务发现的能力。
  • 作用: 允许Spring Cloud应用注册到Nacos服务器,并能够发现其他已经注册的服务实例。

⭐️应用场景: 当你需要实现服务间的自动发现和调用时使用。

4.1.2 认识gateway依赖

只要网关项目加上就可以其他项目不用加

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
  • 此依赖项包含了必要的自动配置和其他依赖项,以便快速开始使用Spring Cloud Gateway。

4.1.3 认识Knif4j依赖

🌟这个是加在gateway里面的依赖

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-gateway-spring-boot-starter</artifactId>
    <version>4.4.0</version>
</dependency>

引入了Knife4j Gateway的Spring Boot启动器,提供了开箱即用的API网关功能。

主要功能包括:

  • API网关基础功能:路由转发、限流、鉴权等。
  • 动态路由:支持通过控制台动态调整路由规则。
  • 限流:支持针对不同用户、不同API的流量限制。
  • 鉴权:支持多种认证方式,如Token、Cookie等。
  • 插件扩展:支持通过插件扩展更多功能。

🌟这是正常项目的依赖

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
    <version>4.4.0</version>
</dependency>
  • 引入Knife4j OpenAPI3 Jakarta SpringBoot启动器,以便于在项目中使用Knife4j提供的API文档生成和接口调试功能。

注意二者区别
访问地址:http://localhost:8080/doc.html

4.1.4 负载均衡依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
  • 就是引入负载均衡

4.2 父子项目的设置

4.2.1父工程配置

  • 加入Package配置
  • 加入Moudle配置子项目
  • 删除依赖

在这里插入图片描述

删除依赖后加入下面依赖:

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

🌟 这里的依赖子工程自动配置

4.2.2 子工程配置

删除的都已有父工程管理

  • 删除配置
  • 删除依赖管理
  • 指定父工程

在这里插入图片描述

4.3 微服务、负载均衡与灰度发布

4.3.1 新建微服务

网关名字记得改

在这里插入图片描述

  • 为了方便观察运行时把SpringBoot加入Services管理

在这里插入图片描述

  • 运行端口为8080的服务

在这里插入图片描述

  • 新建服务

在这里插入图片描述

  • 之后修改要改的端口与内容再次运行即可

端口要改不然冲突

在这里插入图片描述

  • 我们发现Nacos的nacos-demo服务实例已变为两个

看上张图片,因为我们又运行了一个服务

在这里插入图片描述

  • 微服务配置注意看Path

在这里插入图片描述

  • 测试通过网关访问服务实例
    可直接打开Knif4j使用或者使用ApiPost

注意测试负载均衡访问的是微服务所以端口号是9091同时路径别忘写

在这里插入图片描述

在这里插入图片描述

⭐️访问实例的时候可以调整一下权重看看负载均衡与灰度发布效果

  • 灰度发布用于逐步将新版本的应用程序或功能推出,目的是降低风险并提高系统的稳定性

设置权重调整比例即可


五、总结:

5.1 学习总结:

🌟 注意一点负载均衡是按概率不是按比例
🌟 灰度发布将新版本以一定比例或特定用户群体的形式逐步发布,而不是一次性将所有用户切换到新版本。这样可以在新版本出现问题时,快速回退并限制影响范围。

不管谁访问经由网关即可访问实例

请添加图片描述

Spring Cloud Gateway 是一个用于构建 API 网关的框架,提供了多种服务路由、过滤和负载均衡的功能

动态路由:

  • 支持通过配置文件或编程方式设置路由。
  • 可以根据请求的路径、请求方法、查询参数等进行路由匹配。

过滤器:

  • 提供了预定义的过滤器(如请求头、请求参数、限流等)。
  • 用户可以自定义过滤器来处理请求和响应的各种需求。

负载均衡:

  • 支持与 Spring Cloud LoadBalancer 集成,实现对后端服务的负载均衡。
  • 可以配置不同的策略,如轮询、随机等。

断路器支持:

  • 可以与 Spring Cloud Circuit Breaker 集成,提供服务熔断功能,提高系统的健壮性。

安全与认证:

  • 支持集成 Spring Security,为 API 提供安全认证机制。 可以对访问进行监控和限制,保证系统安全。

响应式编程:

  • 基于 Spring WebFlux 构建,实现非阻塞的 API 调用,提高系统吞吐量。

监控和追踪:

  • 通过集成 Spring Boot Actuator 进行运行时监控。
  • 支持分布式追踪(如 Sleuth 和 Zipkin),帮助追踪请求流动。

应用场景

  • 微服务架构: 在微服务架构中,作为服务的入口,聚合多个服务的 API。
  • API 管理: 提供统一的 API 接入点,简化客户端的访问方式。
  • 安全层: 集中管理微服务的安全措施,对外提供单一的认证和授权方式。

配置文件参考:

spring.application.name=nacos-demo
server.port=8080

spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
spring.cloud.nacos.config.contextPath=/nacos
# 设置配置中心服务端地址

spring.cloud.nacos.config.server-addr=localhost:8848
# Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,请不要填写这个值,直接留空即可
spring.cloud.nacos.config.namespace=nacos-demo
spring.config.import=nacos:datatest.properties?refresh=true
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html

# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口

spring.cloud.nacos.discovery.server-addr=localhost:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=nacos-demo
spring.application.name=gateway
server.port=9091


knife4j.gateway.discovery.enabled=true
knife4j.gateway.enabled=true
knife4j.gateway.tags-sorter=order
knife4j.gateway.operations-sorter=order
knife4j.gateway.strategy=discover

spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
spring.cloud.nacos.config.contextPath=/nacos
spring.cloud.nacos.config.server-addr=localhost:8848
spring.config.import=nacos:datatest.properties?refresh=true
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
spring.cloud.nacos.discovery.server-addr=localhost:8848
spring.cloud.nacos.discovery.namespace=nacos-demo

spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-origin-patterns=*
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedHeaders=*
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowCredentials=true
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[0]=GET
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[1]=POST
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[2]=PUT
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[3]=OPTIONS
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[4]=DELETE
spring.cloud.gateway.discovery.locator.enabled=true

spring.cloud.gateway.routes[0].id=nacos-demo
spring.cloud.gateway.routes[0].uri=lb://nacos-demo
spring.cloud.gateway.routes[0].predicates[0]=Path=/nacos_demo/**
spring.cloud.gateway.routes[0].filters[0]=StripPrefix=1

依赖参考:

  • 父文件依赖
<dependencies>
    <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>

⭐️注意如果有拉配置下来config必须加到要导入配置的项目

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  • gateway依赖
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-gateway-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
  • demo使用的依赖
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
            <version>4.4.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
    </dependencies>

同理拉了配置记得加上相关依赖
我用了MySQL所以要加

<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

(后续有遇到问题再添加)


声明:如本内容中存在错误或不准确之处,欢迎指正。转载时请注明原作者信息(麻辣香蝈蝈)。

Gateway集成了Nacos之后,可以使用Spring Cloud LoadBalancer来实现自定义负载均衡。 首先,需要在项目中引入Spring Cloud LoadBalancer的依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> ``` 然后,可以通过实现LoadBalancerClient来实现自定义负载均衡算法。具体步骤如下: 1. 创建一个实现LoadBalancerClient接口的类,例如: ```java @Component public class MyLoadBalancerClient implements LoadBalancerClient { @Override public ServiceInstance choose(String serviceId) { // 实现自定义的负载均衡算法 return null; } @Override public <T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException { return null; } @Override public <T> T execute(String serviceId, ServiceInstance serviceInstance, LoadBalancerRequest<T> request) throws IOException { return null; } } ``` 2. 在该类中实现choose方法,该方法可以根据自定义的负载均衡算法选择一个服务实例,并返回该实例的ServiceInstance对象。 3. 在Gateway的配置文件中,指定使用自定义的LoadBalancerClient,例如: ```yaml spring: cloud: gateway: routes: - id: myservice uri: lb://myservice predicates: - Path=/myservice/** filters: - StripPrefix=1 # 使用自定义的LoadBalancerClient lb: client: name: myservice # 指定自定义的LoadBalancerClient custom: classname: com.example.MyLoadBalancerClient ``` 通过上述步骤,就可以实现自定义的负载均衡算法了。需要注意的是,自定义的LoadBalancerClient必须实现LoadBalancerClient接口的choose方法,其他两个方法可以不用实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值