Alibaba SpringCloud集成Nacos、openFeign实现负载均衡的解决方案
作者:korgs
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来做客户端负载均衡,以调用服务注册中心的服务。
主要特性
- 声明式API定义:使用注解方式定义和配置HTTP请求,使得代码更加简洁、易读和易于维护。
- 与Spring Cloud集成:OpenFeign与Spring Cloud无缝集成,可以通过@EnableFeignClients注解开启Feign的功能,并利用Eureka等服务注册发现机制进行服务间的调用。
- 负载均衡和容错支持:OpenFeign内置了Ribbon负载均衡器的支持,可以根据配置的策略自动选择可用的服务实例。此外,结合Hystrix等熔断器框架,还能提供容错保护和自动降级的能力。
- 支持多种编解码器:OpenFeign提供了多种默认的编码器和解码器,使得开发者无需过多关注底层实现细节,更加专注于业务逻辑的开发。
- 可扩展性和定制化:OpenFeign支持自定义的编码器、解码器和拦截器,可以根据实际需求进行扩展和定制。
OpenFeign的工作方式是声明式接口编程,开发者可以定义一个接口,并对其进行注解,以标识需要调用的远程服务的HTTP端点。借助Spring MVC的注解,如@RequestMapping和@PathVariable等,这个接口直观地映射了远程服务的API。OpenFeign自动处理请求的发送和响应的接收,封装了编码请求和解码响应的过程,极大地减少了样板代码。
总之,OpenFeign是一个功能强大的Web服务客户端,可以方便地实现服务间的HTTP通信,并且与Spring Cloud无缝集成,为微服务架构提供了良好的支持。
Nacos安装
因为后面会经常用到nacos,所以最好先安装好了。
安装
- 下载:https://github.com/alibaba/nacos/releases
- 修改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更有利于数据共享和操作。
- 创建一个名为nacos的数据库;
- 初始化名为
mysql-schema.sql
的脚本文件; - 修改nacos配置,如下:
spring.datasource.platform=mysql db.num=1 db.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=19501 management.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=19502 management.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-schema swagger-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=19506 management.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 logging.level.com.korgs.biz.service = debug
OpenFeign Bean 实现
@Configuration public class OpenFeignConfig { @Bean Logger.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 { @Autowired private 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客户端
源码下载:
基础框架源码下载:
百度网盘下载:
链接: https://pan.baidu.com/s/1XUQyKdR6yDM__aJqCF-b5g?pwd=58pd
提取码: 58pd
Alibaba SpringCloud集成Nacos、openFeign实现负载均衡
百度网盘下载:
链接: https://pan.baidu.com/s/1T-YRtfuuJq0xA4jqlWxvkQ?pwd=1gcj
提取码: 1gcj
参考资料:
源码运行方法:
依次启动nacos、server(两个)、client,在浏览器中输入:http://localhost:19503/swagger-ui/index.html#/open-feign-controller/loadHelloContent,观察返回字符串中端口的变化。
到此这篇关于Alibaba SpringCloud集成Nacos、openFeign实现负载均衡的文章就介绍到这了,更多相关SpringCloud负载均衡内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!