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生命…

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

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

搭建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开发者后台生成安卓云端证书

获取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;一…

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

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

MySql软件安装

1.打开mysql官网网址 MySQL :: Download MySQL Community Server 2.本次针对版本8的图形化界面安装&#xff0c;下载成功后接下来对MySQL进行安装 3.图形化下载后有一个MSI文件 4.我们安装典型即可&#xff0c;选择第一个 5.选择数据库信息存放的路径&#xff0c;我默认放在C盘…

如何解决pycharm在HTML文件中注释快捷键出错的问题(HTML注释规则出错)

文章目录 💢 问题 💢🏡 演示环境 🏡💯 解决方案 💯⚓️ 相关链接 ⚓️💢 问题 💢 你是否在编程时遇到过这样的烦恼?当你正专注地编写HTML代码,想要快速注释掉某部分内容时,却发现PyCharm的注释快捷键失灵了(没有使用正确的注释格式)。这不仅打断了你的工作…

Spring Event--踩坑(注意事项)

原文网址&#xff1a;Spring Event--踩坑(注意事项)-CSDN博客 简介 本文介绍Spring的事件的使用注意事项。 Spring Event框架实现了基于事件的发布订阅机制。开发者可以自定义事件&#xff0c;发布事件&#xff0c;Spring 会将该事件广播给监听该事件的监听者。监听者可以实…

linux学习:视频输入+V4L2

目录 V4L2 视频采集流程 代码例子 核心命令字和结构体 VIDIOC_ENUM_FMT VIDIOC_G_FMT / VIDIOC_S_FMT / VIDIOC_TRY_FM VIDIOC_REQBUFS VIDIOC_QUERYBUF VIDIOC_QBUF /VIDIOC_DQBUF VIDIOC_STREAMON / VIDIOC_STREAMOFF V4L2 是 Linux 处理视频的最新标准代码模块&…

Java后端实现对象与文件接收数据(minio测试)

实现思路&#xff1a; 1. 两个接口实现&#xff0c;一个接对象数据(file)&#xff0c;一个接文件数据(json)。 2. json对象(base64String) 实体类信息 &#xff0c;请求体统一接收 3. file, String name ,String password ,String name &#xff0c; Controller层接收 统一…

OpenHarmony 实战开发——如何编译OpenHarmony自带APP

概述 OpenHarmony 的主干代码是开源社区的重要学习资源&#xff0c;对于想进行应用开发和熟悉 OpenHarmony 能力的同学主干代码是非常重要的资源&#xff0c;在主干代码的 applications 目录里聚集了很多原生的应用实现&#xff0c;那么如何编译这些代码就是我们这篇文章的主要…

Vue3项目打包部署到云服务器的Nginx中

文章目录 一、打包vue3项目二、dist文件夹上传到服务器三、改nginx配置文件Docker安装nginx 一、打包vue3项目 npm run build 二、dist文件夹上传到服务器 将dist文件夹放到docker安装的nginx中的html目录下 三、改nginx配置文件 然后重启nginx【改了配置文件重启nginx才能…

消息中间件Kafka(PHP版本)

小编最近需要用到消息中间件&#xff0c;有需要要复习一下以前的东西&#xff0c;有需要的自取&#xff0c;强调一点&#xff0c;如果真的想了解透彻&#xff0c;一定要动手&#xff0c;脑袋会了不代表就会写了 Kafka是由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅…

等保一体机能过三级等保吗?过等保无需再买安全设备如何做到?

等保一体机能过三级等保吗&#xff1f;过等保无需再买安全设备如何做到&#xff1f; 全云在线 2024-03-28 12:08 广东 尽管等保建设的标准是统一的&#xff0c;但由于不同行业和用户规模的差异&#xff0c;建设方案呈现出多样化的特点。 虽然重点行业过等保现象确实已经十分…

免费思维13招之八:跨行业思维

免费思维13招之八:跨行业思维 免费思维的另一大战略思维——跨行业型思维。 跨行业型思维有两种:一种是通过跨行业,把自己的产品免费掉,从而赚取其他行业的利润。另一种是通过跨行业,把别人的主流产品免费掉,从而增大自己产品的销量。 第一种,把自己的产品免费,从而赚…