Alibaba?SpringCloud集成Nacos、openFeign實(shí)現(xiàn)負(fù)載均衡的解決方案
Spring cloud alibaba
Spring Cloud Alibaba 致力于提供微服務(wù)開發(fā)的一站式解決方案。此項(xiàng)目包含開發(fā)分布式應(yīng)用微服務(wù)的必需組件,方便開發(fā)者通過 Spring Cloud 編程模型輕松使用這些組件來開發(fā)分布式應(yīng)用服務(wù)。
主要功能
- 服務(wù)限流降級(jí):默認(rèn)支持 WebServlet、WebFlux、OpenFeign、RestTemplate、Spring Cloud Gateway、Dubbo 和 RocketMQ 限流降級(jí)功能的接入,可以在運(yùn)行時(shí)通過控制臺(tái)實(shí)時(shí)修改限流降級(jí)規(guī)則,還支持查看限流降級(jí) Metrics 監(jiān)控。
- 服務(wù)注冊(cè)與發(fā)現(xiàn):適配 Spring Cloud 服務(wù)注冊(cè)與發(fā)現(xiàn)標(biāo)準(zhǔn),默認(rèn)集成對(duì)應(yīng) Spring Cloud 版本所支持的負(fù)載均衡組件的適配。
- 分布式配置管理:支持分布式系統(tǒng)中的外部化配置,配置更改時(shí)自動(dòng)刷新。
- 消息驅(qū)動(dòng)能力:基于 Spring Cloud Stream 為微服務(wù)應(yīng)用構(gòu)建消息驅(qū)動(dòng)能力。
- 分布式事務(wù):使用 @GlobalTransactional 注解, 高效并且對(duì)業(yè)務(wù)零侵入地解決分布式事務(wù)問題。
- 阿里云對(duì)象存儲(chǔ):阿里云提供的海量、安全、低成本、高可靠的云存儲(chǔ)服務(wù)。支持在任何應(yīng)用、任何時(shí)間、任何地點(diǎn)存儲(chǔ)和訪問任意類型的數(shù)據(jù)。
- 分布式任務(wù)調(diào)度:提供秒級(jí)、精準(zhǔn)、高可靠、高可用的定時(shí)(基于 Cron 表達(dá)式)任務(wù)調(diào)度服務(wù)。同時(shí)提供分布式的任務(wù)執(zhí)行模型,如網(wǎng)格任務(wù)。網(wǎng)格任務(wù)支持海量子任務(wù)均勻分配到所有 Worker(schedulerx-client)上執(zhí)行。
- 阿里云短信服務(wù):覆蓋全球的短信服務(wù),友好、高效、智能的互聯(lián)化通訊能力,幫助企業(yè)迅速搭建客戶觸達(dá)通道。
功能組件
- Sentinel:把流量作為切入點(diǎn),從流量控制、熔斷降級(jí)、系統(tǒng)負(fù)載保護(hù)等多個(gè)維度保護(hù)服務(wù)的穩(wěn)定性。
- Nacos:一個(gè)更易于構(gòu)建云原生應(yīng)用的動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺(tái)。
- RocketMQ:一款開源的分布式消息系統(tǒng),基于高可用分布式集群技術(shù),提供低延時(shí)的、高可靠的消息發(fā)布與訂閱服務(wù)。
- Seata:阿里巴巴開源產(chǎn)品,一個(gè)易于使用的高性能微服務(wù)分布式事務(wù)解決方案。
- Alibaba Cloud OSS: 阿里云對(duì)象存儲(chǔ)服務(wù)(Object Storage Service,簡(jiǎn)稱 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存儲(chǔ)服務(wù)。您可以在任何應(yīng)用、任何時(shí)間、任何地點(diǎn)存儲(chǔ)和訪問任意類型的數(shù)據(jù)。
- Alibaba Cloud SchedulerX: 阿里中間件團(tuán)隊(duì)開發(fā)的一款分布式任務(wù)調(diào)度產(chǎn)品,提供秒級(jí)、精準(zhǔn)、高可靠、高可用的定時(shí)(基于 Cron 表達(dá)式)任務(wù)調(diào)度服務(wù)。
- Alibaba Cloud SMS: 覆蓋全球的短信服務(wù),友好、高效、智能的互聯(lián)化通訊能力,幫助企業(yè)迅速搭建客戶觸達(dá)通道。
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(簡(jiǎn)稱Feign)是一個(gè)聲明式的Web服務(wù)客戶端,用于簡(jiǎn)化服務(wù)之間的HTTP通信。它是Spring Cloud組件中的一個(gè)輕量級(jí)RESTful的HTTP服務(wù)客戶端,內(nèi)置了Ribbon來做客戶端負(fù)載均衡,以調(diào)用服務(wù)注冊(cè)中心的服務(wù)。
主要特性
- 聲明式API定義:使用注解方式定義和配置HTTP請(qǐng)求,使得代碼更加簡(jiǎn)潔、易讀和易于維護(hù)。
- 與Spring Cloud集成:OpenFeign與Spring Cloud無縫集成,可以通過@EnableFeignClients注解開啟Feign的功能,并利用Eureka等服務(wù)注冊(cè)發(fā)現(xiàn)機(jī)制進(jìn)行服務(wù)間的調(diào)用。
- 負(fù)載均衡和容錯(cuò)支持:OpenFeign內(nèi)置了Ribbon負(fù)載均衡器的支持,可以根據(jù)配置的策略自動(dòng)選擇可用的服務(wù)實(shí)例。此外,結(jié)合Hystrix等熔斷器框架,還能提供容錯(cuò)保護(hù)和自動(dòng)降級(jí)的能力。
- 支持多種編解碼器:OpenFeign提供了多種默認(rèn)的編碼器和解碼器,使得開發(fā)者無需過多關(guān)注底層實(shí)現(xiàn)細(xì)節(jié),更加專注于業(yè)務(wù)邏輯的開發(fā)。
- 可擴(kuò)展性和定制化:OpenFeign支持自定義的編碼器、解碼器和攔截器,可以根據(jù)實(shí)際需求進(jìn)行擴(kuò)展和定制。
OpenFeign的工作方式是聲明式接口編程,開發(fā)者可以定義一個(gè)接口,并對(duì)其進(jìn)行注解,以標(biāo)識(shí)需要調(diào)用的遠(yuǎn)程服務(wù)的HTTP端點(diǎn)。借助Spring MVC的注解,如@RequestMapping和@PathVariable等,這個(gè)接口直觀地映射了遠(yuǎn)程服務(wù)的API。OpenFeign自動(dòng)處理請(qǐng)求的發(fā)送和響應(yīng)的接收,封裝了編碼請(qǐng)求和解碼響應(yīng)的過程,極大地減少了樣板代碼。
總之,OpenFeign是一個(gè)功能強(qiáng)大的Web服務(wù)客戶端,可以方便地實(shí)現(xiàn)服務(wù)間的HTTP通信,并且與Spring Cloud無縫集成,為微服務(wù)架構(gòu)提供了良好的支持。
Nacos安裝
因?yàn)楹竺鏁?huì)經(jīng)常用到nacos,所以最好先安裝好了。
安裝
- 下載:https://github.com/alibaba/nacos/releases
- 修改JDK版本,因?yàn)橄螺d的是V2.3.2版本,需要JDK17支持。 在在startup.sh中約66行配置
export JAVA_HOME = /Users/liudong/Library/Java/JavaVirtualMachines/openjdk-21.0.1/Contents/Home
開啟授權(quán)
防止出現(xiàn)登陸失敗,修改nacos配置,如下:
nacos.core.auth.system.type=nacos nacos.core.auth.enabled=true ###設(shè)置服務(wù)端驗(yàn)證 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
啟動(dòng)
sh startup.sh -m standalone ,然后可以通過 http://127.0.0.1:8848/nacos 地址訪問。
授權(quán)驗(yàn)證
### 獲取 accessToken:使用用戶名和密碼登陸 nacos server: curl -X POST '127.0.0.1:8848/nacos/v1/auth/login' -d 'username=nacos&password=nacos' ### 使用 accessToken 請(qǐng)求 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數(shù)據(jù)庫
這是可選的,默認(rèn)采用了內(nèi)置的Derby數(shù)據(jù)庫,配置了mysql更有利于數(shù)據(jù)共享和操作。
- 創(chuàng)建一個(gè)名為nacos的數(shù)據(jù)庫;
- 初始化名為
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啟動(dòng)類
@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 實(shí)現(xiàn)
@Configuration
public class OpenFeignConfig {
@Bean
Logger.Level level() {
return Logger.Level.FULL;
}
}Service服務(wù)類實(shí)現(xiàn)
這個(gè)類用于調(diào)用Provider的Restful接口,相比ribbon省云了定義RestTemplate這一步。但從結(jié)構(gòu)上更合理了,注意添加@FeignClient注解,值為provide的注冊(cè)名稱。
@FeignClient(value = "AlibabaSpringbootNacosServer")
public interface LoadService {
@GetMapping("/helloworld/{uuid}")
BaseResponse<String> loadHelloContent(@PathVariable String uuid);
}Controller測(cè)試類實(shí)現(xiàn)
@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啟動(dòng)類
@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服務(wù)端
- springboot-openFeign-client : 19506, consumer客戶端
源碼下載:
基礎(chǔ)框架源碼下載:
百度網(wǎng)盤下載:
鏈接: https://pan.baidu.com/s/1XUQyKdR6yDM__aJqCF-b5g?pwd=58pd
提取碼: 58pd
Alibaba SpringCloud集成Nacos、openFeign實(shí)現(xiàn)負(fù)載均衡
百度網(wǎng)盤下載:
鏈接: https://pan.baidu.com/s/1T-YRtfuuJq0xA4jqlWxvkQ?pwd=1gcj
提取碼: 1gcj
參考資料:
源碼運(yùn)行方法:
依次啟動(dòng)nacos、server(兩個(gè))、client,在瀏覽器中輸入:http://localhost:19503/swagger-ui/index.html#/open-feign-controller/loadHelloContent,觀察返回字符串中端口的變化。

到此這篇關(guān)于Alibaba SpringCloud集成Nacos、openFeign實(shí)現(xiàn)負(fù)載均衡的文章就介紹到這了,更多相關(guān)SpringCloud負(fù)載均衡內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中日期時(shí)間比較的多種方法及實(shí)用代碼
本文介紹了Java中不同日期時(shí)間類的比較方法,包括java.util.Date、java.util.Calendar、java.time?API和java.sql.Timestamp,提供了使用before、after和compareTo等方法進(jìn)行日期比較的示例代碼,展示了各自的特點(diǎn)和使用場(chǎng)景,需要的朋友可以參考下2024-09-09
SpringBoot使用Atomikos技術(shù)整合多數(shù)據(jù)源的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot使用Atomikos技術(shù)整合多數(shù)據(jù)源的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
JAVA實(shí)現(xiàn)Excel和PDF上下標(biāo)的操作代碼
這篇文章主要介紹了JAVA實(shí)現(xiàn)Excel和PDF上下標(biāo),本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09
一文盤點(diǎn)Spring MVC中用于處理HTTP請(qǐng)求的常用注解
這篇文章主要為大家詳細(xì)介紹了Spring MVC中用于處理HTTP請(qǐng)求的常用注解,包括@RequestMapping,@RequestController,@RequestParam等,希望對(duì)大家有所幫助2026-03-03
SpringBoot中Mybatis + Druid 數(shù)據(jù)訪問的詳細(xì)過程
Spring Boot 底層都是采用 SpringData 的方式進(jìn)行統(tǒng)一處理各種數(shù)據(jù)庫,SpringData也是Spring中與SpringBoot、SpringCloud 等齊名的知名項(xiàng)目,下面看下SpringBoot Mybatis Druid數(shù)據(jù)訪問的詳細(xì)過程,感興趣的朋友一起看看吧2021-11-11

