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=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,观察返回字符串中端口的变化。