Alibaba SpringCloud集成Nacos、openFeign实现负载均衡-15

Spring cloud alibaba

Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

主要功能

  • 服务限流降级:默认支持 WebServlet、WebFlux、OpenFeign、RestTemplate、Spring Cloud Gateway、Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
  • 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成对应 Spring Cloud 版本所支持的负载均衡组件的适配。
  • 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
  • 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
  • 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。
  • 阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
  • 分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
  • 阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

功能组件

  • Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
  • Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
  • RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
  • Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
  • Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
  • Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
  • Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

springboot集成

<dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2023.0.0.1-RC2</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

OpenFeign

OpenFeign(简称Feign)是一个声明式的Web服务客户端,用于简化服务之间的HTTP通信。它是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端,内置了Ribbon来做客户端负载均衡,以调用服务注册中心的服务。

主要特性

  1. 声明式API定义:使用注解方式定义和配置HTTP请求,使得代码更加简洁、易读和易于维护。
  2. 与Spring Cloud集成:OpenFeign与Spring Cloud无缝集成,可以通过@EnableFeignClients注解开启Feign的功能,并利用Eureka等服务注册发现机制进行服务间的调用。
  3. 负载均衡和容错支持:OpenFeign内置了Ribbon负载均衡器的支持,可以根据配置的策略自动选择可用的服务实例。此外,结合Hystrix等熔断器框架,还能提供容错保护和自动降级的能力。
  4. 支持多种编解码器:OpenFeign提供了多种默认的编码器和解码器,使得开发者无需过多关注底层实现细节,更加专注于业务逻辑的开发。
  5. 可扩展性和定制化:OpenFeign支持自定义的编码器、解码器和拦截器,可以根据实际需求进行扩展和定制。

OpenFeign的工作方式是声明式接口编程,开发者可以定义一个接口,并对其进行注解,以标识需要调用的远程服务的HTTP端点。借助Spring MVC的注解,如@RequestMapping和@PathVariable等,这个接口直观地映射了远程服务的API。OpenFeign自动处理请求的发送和响应的接收,封装了编码请求和解码响应的过程,极大地减少了样板代码。

总之,OpenFeign是一个功能强大的Web服务客户端,可以方便地实现服务间的HTTP通信,并且与Spring Cloud无缝集成,为微服务架构提供了良好的支持。

Nacos安装

因为后面会经常用到nacos,所以最好先安装好了。

安装

  1. 下载:https://github.com/alibaba/nacos/releases
  2. 修改JDK版本,因为下载的是V2.3.2版本,需要JDK17支持。 在在startup.sh中约66行配置
export JAVA_HOME = /Users/liudong/Library/Java/JavaVirtualMachines/openjdk-21.0.1/Contents/Home

开启授权

防止出现登陆失败,修改nacos配置,如下:

nacos.core.auth.system.type=nacos
nacos.core.auth.enabled=true###设置服务端验证 key
nacos.core.auth.server.identity.key=test
nacos.core.auth.server.identity.value=test
### The default token (Base64 String):
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789

启动

sh startup.sh -m standalone ,然后可以通过 http://127.0.0.1:8848/nacos 地址访问。

授权验证

### 获取 accessToken:使用用户名和密码登陆 nacos server:
curl -X POST '127.0.0.1:8848/nacos/v1/auth/login' -d 'username=nacos&password=nacos'### 使用 accessToken 请求 nacos api 接口:
curl -X GET '127.0.0.1:8848/nacos/v1/cs/configs?accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTYwNTYyMzkyM30.O-s2yWfDSUZ7Svd3Vs7jy9tsfDNHs1SuebJB4KlNY8Q&dataId=nacos.example.1&group=nacos_group'

配置mysql数据库

这是可选的,默认采用了内置的Derby数据库,配置了mysql更有利于数据共享和操作。

  1. 创建一个名为nacos的数据库;
  2. 初始化名为mysql-schema.sql的脚本文件;
  3. 修改nacos配置,如下:
spring.datasource.platform=mysql
db.num=1db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123456

alibaba-nacos-server provider模块

在这里插入图片描述

pom.xml

依赖版本可参考 springbootSeries 模块中pom.xml文件中的版本定义

    <dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency></dependencies>

application.properties配置

spring.profiles.active = dev
spring.application.name=AlibabaSpringbootNacosServer
server.port=19501management.endpoints.web.exposure.include=*spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.nacos.discovery.fail-fast=true
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos

application-server2.properties配置

spring.application.name=AlibabaSpringbootNacosServer
server.port=19502management.endpoints.web.exposure.include=*spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.nacos.discovery.fail-fast=true
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos#springboot Server
spring.aop.auto=true
spring.aop.proxy-target-class=true# log4j
logging.config=classpath:log4j2.xml
logging.level.root=INFO
logging.level.org.springframework.web=ERROR#restful Server
server.compression.enabled=true
server.compression.mime-types=application/json,application/octet-stream#swagger
springdoc.api-docs.enabled=true
springdoc.api-docs.path=/api-schemaswagger-config.group = default-group
swagger-config.description= The following is a restful-api list of {} application, and you can browse or test them to determine if they are working as you expect.
swagger-config.version=V1.0
swagger-config.urlPattern=/**
swagger-config.base-package=com.korgs
swagger-config.authorization-key-name=token
swagger-config.wiki = https://korgs.blog.csdn.net/

SpringbootApplication启动类

@Slf4j
@SpringBootApplication(scanBasePackages = {"com.korgs",  "cn.hutool.extra.spring"})
@Configuration
@EnableConfigurationProperties
@ServletComponentScan
@RestController
@EnableDiscoveryClient
public class AlibabaSpringbootNacosServerApplication {@Value("${server.port}")private String serverPort;public static void main(String[] args) {SpringApplication.run(AlibabaSpringbootNacosServerApplication.class, args);}@GetMapping("/helloworld/{uuid}")public BaseResponse<String> helloWorld(@PathVariable String uuid){String str = LogGenerator.trackLog()+ " uuid=" + uuid + " I am busy to handle this request."+ " serverPort=" + serverPort;log.info( str );return BaseResponse.success(str);}
}

springboot-openFeign-client consumer模块

在这里插入图片描述

pom.xml

依赖版本可参考 springbootSeries 模块中pom.xml文件中的版本定义

        <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>

application.properties配置

spring.profiles.active = dev
spring.application.name=SpringbootOpenFeignClient
server.port=19506management.endpoints.web.exposure.include=*spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.nacos.discovery.fail-fast=true
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacoslogging.level.com.korgs.biz.service = debug

OpenFeign Bean 实现

@Configuration
public class OpenFeignConfig {@BeanLogger.Level level() {return Logger.Level.FULL;}}

Service服务类实现

这个类用于调用Provider的Restful接口,相比ribbon省云了定义RestTemplate这一步。但从结构上更合理了,注意添加@FeignClient注解,值为provide的注册名称。

@FeignClient(value = "AlibabaSpringbootNacosServer")
public interface LoadService {@GetMapping("/helloworld/{uuid}")BaseResponse<String> loadHelloContent(@PathVariable String uuid);
}

Controller测试类实现

@RestController
@RequestMapping("/api/load")
@RestController
@RequestMapping("/api/load")
public class LoadBalanceController {@Autowiredprivate LoadService loadService;@GetMapping("/v1/hello-content")public BaseResponse<String> loadHelloContent(String uuid){return  loadService.loadHelloContent(uuid);}
}

SpringbootApplication启动类

@Slf4j
@SpringBootApplication(scanBasePackages = {"com.korgs",  "cn.hutool.extra.spring"})
@Configuration
@EnableConfigurationProperties
@ServletComponentScan
@RestController
@EnableDiscoveryClient
@EnableFeignClients
public class SpringbootOpenFeignClientApplication {public static void main(String[] args) {SpringApplication.run(SpringbootOpenFeignClientApplication.class, args);}@GetMapping("/helloworld")public BaseResponse helloWorld(){log.info( LogGenerator.trackLog()+ "msg=" + "I am busy to handle this request.");return BaseResponse.success("hello world");}
}

源码下载

涉及模块:

  • alibaba-nacos-server:19501,19502 provide服务端
  • springboot-openFeign-client : 19506, consumer客户端

源码下载:

  • 基础框架源码下载
  • Alibaba SpringCloud集成Nacos、openFeign实现负载均衡

源码运行方法:

  • 模块详细功能说明和运行测试方法

依次启动nacos、server(两个)、client,在浏览器中输入:http://localhost:19503/swagger-ui/index.html#/open-feign-controller/loadHelloContent,观察返回字符串中端口的变化。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/11214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity生命周期函数详解

Unity生命周期函数详解 Unity生命周期函数是Unity引擎中用于控制游戏对象行为的一系列方法。它们在游戏的不同阶段被自动调用&#xff0c;允许开发者在适当的时机执行特定的代码。了解和正确使用生命周期函数对于创建流畅和高效的游戏至关重要。 生命周期函数概述 Unity生命…

Nacos集群的扩展性和容错性如何?

Nacos集群的扩展性与容错性深度解析 在微服务的架构设计中&#xff0c;服务注册与发现、配置管理是两个至关重要的环节。它们如同微服务架构的“中枢神经”&#xff0c;负责着服务的协调与调度。而Nacos&#xff0c;作为一款优秀的服务注册与发现、配置管理平台&#xff0c;凭…

Leetcode 3147. Taking Maximum Energy From the Mystic Dungeon

Leetcode 3147. Taking Maximum Energy From the Mystic Dungeon 1. 解题思路2. 代码实现 题目链接&#xff1a;3147. Taking Maximum Energy From the Mystic Dungeon 1. 解题思路 这一题的话我们倒序看一下以各个位置作为终点时前面各个位置作为起点时的energy各是多少&am…

外网如何访问内网服务器?快解析内网穿透使用教程

随着信息化建设的飞速发展&#xff0c;为了提高工作效率&#xff0c;越来越多的企业搭建了ERP、OA、CRM等应用服务器&#xff0c;同时为了数据安全考虑&#xff0c;将应用服务器放在内网。随着企业的发展壮大&#xff0c;访问需求不再局限于局域网&#xff0c;如何实现外网访问…

(13)配置飞行中的FFT(二)

文章目录 前言 1 FFT 动态谐波陷波频率跟踪 2 FFT 选项 2.1 后置滤波器链 FFT 分析窗口 2.2 电机噪音检查 3 典型用途 4 补充信息 5 参数说明 前言 FFT 模式跟踪将基频设置为最大的噪声峰值。 1 FFT 动态谐波陷波频率跟踪 FFT 模式跟踪将基频设置为最大的噪声峰值。通…

leetcode经典例题之使用栈实现队列

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 目录 1、题目展示2、题目分析3、完整代码演示4、结语 1、题目展示 前面我们了解过如何实现栈相…

[力扣题解]406. 根据身高重建队列

题目&#xff1a;406. 根据身高重建队列 思路 贪心法&#xff1b; 本题涉及到2种选择因素&#xff1a;h和k&#xff1b; 优先考虑h&#xff0c;再考虑k&#xff1b; 如果在你的脑子里&#xff0c;这2个变量搅在一起就完蛋了 w(&#xff9f;Д&#xff9f;)w 代码 // 有2种因…

搭建nacos集群

1.修改nacos/conf/application.properties 2.在数据库中执行nacos/conf/nacos-mysql.sql脚本 3.修改nacos/conf/cluster.conf文件 4.修改startup.sh文件模式为集群 5.启动服务 附&#xff1a;安装nginx 修改/usr/local/openresty/nginx/conf/nginx.confi文件 http{}中增加如下…

电机控制系列模块解析(20)—— MTPA

一、MTPA MTPA 是 "Maximum Torque Per Ampere" 的缩写&#xff0c;意为“最大转矩电流比”。在电机控制系统中&#xff0c;特别是永磁同步电机&#xff08;PMSM&#xff09;或其它永磁电机的控制策略中&#xff0c;MTPA 控制旨在实现电机在给定负载条件下&#xff…

uniapp 生成安卓证书没有md5指纹怎么办?

由于最新的jdk版本对应的keystore工具无法查看到md5指纹信息 但是不代表它没有md5指纹信息&#xff0c;只是看不到而已 解决方案&#xff1a; 登录uniapp开发者后台生成安卓云端证书

【前端开发】Uniapp:uView组件库和封装接口请求

【uView组件库导入及使用】 1. 导入uView组件库依赖 &#xff08;无package.json&#xff09;npm init -ynpm install uview-ui1.8.8安装成功&#xff0c;自动放到“/node_modules/uview-ui/”&#xff08;可自行更换路径&#xff09; 2. 项目配置使用uView App.vue <style…

获取Linux上的Redis的用户名、密码、端口、host等信息

目录 进入redis-cli的目录 启动./redis-cli服务 查询密码 查询用户名 查询端口 查询host 参考文章&#xff1a;解决redis-cli连接时出现Could not connect to Redis at 127.0.0.1:6379: Connection refused-阿里云开发者社区 (aliyun.com) linux查看redis用户和密码_mo…

ChatGPT付费创作系统软件开发

uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 框架支持:springboot/Ssm/thinkphp/django/flask/express均支持 前端开发:vue.js 可选语言&#xff1a;pythonjavanode.jsphp均支持 运行软件…

【Spring Boot】Spring Boot 中的 Starter

Spring Boot 中的 Starter 1.常用 Starter2.为什么要用 Starter3.Starter 有哪些要素 我们都知道&#xff0c;Spring 的功能非常强大&#xff0c;但也有些弊端。比如&#xff1a;我们需要手动去配置大量的参数&#xff0c;没有默认值&#xff0c;需要我们管理大量的 jar 包和它…

【JS面试题】闭包

一、自由变量 在学习闭包之前&#xff0c;首先了解一下什么是自由变量&#xff1a; 一个变量在当前作用域&#xff08;比如函数内&#xff09;没有定义&#xff0c;但是被使用了&#xff0c;这个变量就是自由变量。在定义该函数的位置&#xff0c;向上级作用域&#xff0c;一…

Springboot整合向量数据库Milvus

Springboot整合向量数据库Milvus 导入依赖 <!--milvus 向量数据库 client sdk --><dependency><groupId>io.milvus</groupId><artifactId>milvus-sdk-java</artifactId

JavaScript 动态网页实例 —— 文字色彩与形状

首先介绍霓虹灯文字效果的设计,介绍文字色彩的静态渐变,然后介绍两个文字大小不断变化的示例,最后,则是两段文字色彩动态变化的代码。本章实例针对性较强,稍加修改就可以应用在网页中。读者不必拘泥于实例的效果,而应更重视实现这些效果的方法,相信这些实例能对开阔思路有…

【C++】STL — map和set的使用详细介绍

前言 本章将继续学习STL中的两个很重要的容器map和set&#xff0c;其底层实现是封装了一个红黑树&#xff0c;我们通过本节来学习和深入了解一下这两大容器。。。 序列式容器&#xff1a; string 、Vector、List 、dequeue 关联式容器&#xff1a;MAP 、SET、nordered_map、uno…

codeforce#939 (div2) 题解

C. Nene’s Magical Matrix 给一个nxn的矩阵&#xff0c;现在你可以执行一个操作&#xff1a;将数字1-n任意排列&#xff0c;并将这个序列覆盖到矩阵的任意一行或列。操作次数小于 2 n 2n 2n&#xff0c;求矩阵中元素和的最大值。 这个题显然存在一种巧妙的构造方法使得矩阵中…

软件设计各个阶段的成果

软件设计各个阶段的成果 1.可行性分析与项目开发计划2.需求分析3.系统设计4.系统测试运行和维护知识 自行整理的软件设计阶段性成果&#xff0c;如有不对的地方&#xff0c;欢迎指正。 1.可行性分析与项目开发计划 可行性分析报告项目开发计划 2.需求分析 软件需求说明书用…