SOFAStack 技术栈Demo
1、概述
SOFAStack(Scalable Open Financial Architecture Stack)是蚂蚁金服自主研发的金融级云原生架构,包含了构建金融级云原生架构所需的各个组件,是在金融场景里锤炼出来的最佳实践。
官网: https://www.sofastack.tech
码云源码: https://gitee.com/sofastack/
源码: http://github.com/sofastack
项目列表
- SOFABoot 是基于 Spring Boot 的一套研发框架,完全兼容 Spring Boot 的基础上,还提供了启动期监控检查,上下文隔离,模块化开发,类隔离,日志空间隔离等能力。
- SOFARPC 是一个高可扩展性、高性能、生产级的 Java RPC 框架。
- SOFAMesh 是基于 Istio 改进和扩展而来的 Service Mesh 大规模落地实践方案。
- SOFATracer 是基于 OpenTracing 规范的分布式链路跟踪系统。
- SOFALookout 是一款解决系统的度量和监控问题的轻量级中间件服务。
- SOFABolt 是基于 Netty 实现的网络通信框架。
- SOFAArk 是一款基于 Java 实现的轻量级类隔离容器。
- SOFAJarslink 是基于 SOFAArk 的动态模块和合并部署的解决方案。
- SOFAActs 是一款白盒测试框架,旨在为企业提供高效、精细化的接口自动化测试。
- SOFAJraft 是生产级的 Java 版本的 Raft 协议实现。
- SOFARegistry 是一款生产级、高时效、高可用的服务注册中心。
- SOFADashboard 是一站式的 SOFA 框架管控端。
- Mosn 是 Golang 开发的 Service Mesh 数据平面代理,旨在提供分布式,模块化,可观察,智能化的代理能力。
- Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
这里主要对SOFABoot、SOFARegistry、SOFARPC进行使用
测试Demo地址
http://gitlab.zkj.test/enterprise-wechat/dev/sofaboot.git
2、SOFABoot
1、介绍
SOFABoot 是蚂蚁金服开源的基于 SpringBoot 的研发框架,提供了诸如 Readiness Check、类隔离、日志空间隔离等能力,用于快速、敏捷地开发 Spring 应用程序,特别适合构建微服务系统。
SpringBoot 基于 Spring 的按条件配置(Conditional Configuration),结合 starter 依赖机制提供了快捷、方便开发 Spring 项目的体验,获得了极大的成功;SOFABoot 同样在这两个能力上基于 SpringBoot 扩展出适应于金融级应用开发框架。作为脱胎于蚂蚁金服内部对于 SpringBoot 的实践,SOFABoot 补充了 SpringBoot 在大规模金融级生产场景下一些不足的地方,例如 Readiness 检查、类隔离和日志空间隔离等等能力。在增强了 SpringBoot 的同时,SOFABoot 还提供了让用户可以在 SpringBoot 中非常方便地使用 SOFAStack 中间件的能力。
你可以在发布历史中查看所有的发布报告,SOFABoot 版本和 Spring Boot 版本对应关系如下:
SOFABoot 版本 | Spring Boot 版本 |
---|---|
2.3.x | 1.4.2.RELEASE |
2.4.x | 1.4.2.RELEASE |
2.5.x | 1.5.16.RELEASE |
3.0.x | 2.0.3.RELEASE |
3.1.x | 2.1.0.RELEASE |
3.2.x | 2.1.0.RELEASE |
3.3.0~3.3.1 | 2.1.11.RELEASE |
3.3.2 及以后 | 2.1.13.RELEASE |
现有项目SpringBoot 2.1.0.RELEASE,引入SOFABoot 3.2.1版本
技术栈版本
依赖版本 | 原因 |
---|---|
SpringBoot 2.1.0.RELEASE | 现有springcloud项目的版本 |
SOFABoot 3.2.1 | SpringBoot对应版本,与顺德框架统一版本 |
SOFARegistry 5.2.0 | |
SOFARPC 3.2.1 | SOFABoot 3.2.1中托管 |
2、搭建步骤
1、父工程POM依赖
<!-- 统一管理jar包版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<registry.client.version>5.2.0</registry.client.version>
<rpc.version>5.5.2</rpc.version>
</properties>
<!-- 子模块全部继承,子模块不需要写-->
<dependencies>
<!-- SpringBoot 监控暴露-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- sofa健康检查-->
<dependency>
<groupId>com.alipay.sofa</groupId>
<artifactId>healthcheck-sofa-boot-starter</artifactId>
</dependency>
</dependencies>
<!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version -->
<dependencyManagement>
<dependencies>
<!--spring-cloud-dependencies引入为pom 文件 -->
<!-- <scope>import</scope>解决单继承问题,类似parent标签-->
<!-- sofaboot依赖-->
<dependency>
<groupId>com.alipay.sofa</groupId>
<artifactId>sofaboot-dependencies</artifactId>
<version>3.1.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- SOFARegistry依赖-->
<dependency>
<groupId>com.alipay.sofa</groupId>
<artifactId>registry-client-all</artifactId>
<version>${registry.client.version}</version>
</dependency>
<!--SOFARPC 依赖Sofaboot中托管-->
</dependencies>
</dependencyManagement>
<!--SOFARPC 依赖Sofaboot中托管 在Sofaboot3.1.4中需要单独加Sofaboot的依赖 3.2.1不需要-->
<dependency>
<groupId>com.alipay.sofa</groupId>
<artifactId>rpc-sofa-boot-starter</artifactId>
<version>${rpc.version}</version>
<exclusions>
<exclusion>
<groupId>org.jboss.resteasy</groupId>
<artifactId>jaxrs-api</artifactId>
</exclusion>
</exclusions>
</dependency>
2、SOFABootDemo的POM依赖
<!-- SpringBootWeb依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- SpringBoot 监控暴露-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- sofa健康检查-->
<dependency>
<groupId>com.alipay.sofa</groupId>
<artifactId>healthcheck-sofa-boot-starter</artifactId>
</dependency>
3、yml配置
#必须要有name,否则报错
spring:
application:
name: SOFABoot Demo
#端口号
server:
port: 9090
#日志
logging:
path: ./logs
level:
com:
alipay:
test: INFO
# 暴露监控端点
management:
endpoints:
web:
exposure:
include: "*"
4、写测试controller
@RestController
public class HelloController {
@GetMapping("/hello")
public String Hello()
{
return "ok";
}
}
5、测试
浏览器访问地址:http://localhost:9090/hello,返回ok
可以通过在浏览器中输入 http://localhost:9090/actuator/readiness 查看应用 Readiness Check 的状况
{
"status":"UP",
"details":{
"SOFABootReadinessHealthCheckInfo":{
"status":"UP"
},
"diskSpace":{
"status":"UP",
"details":{
"total":296626417664,
"free":293247467520,
"threshold":10485760
}
}
}
}
3、SOFARegistry
1、介绍
SOFARegistry 是蚂蚁金服开源的一个生产级、高时效、高可用的服务注册中心。SOFARegistry 最早源自于淘宝的 ConfigServer,十年来,随着蚂蚁金服的业务发展,注册中心架构已经演进至第五代。目前 SOFARegistry 不仅全面服务于蚂蚁金服的自有业务,还随着蚂蚁金融科技服务众多合作伙伴,同时也兼容开源生态。SOFARegistry 采用 AP 架构,支持秒级时效性推送,同时采用分层架构支持无限水平扩展。
2、搭建
1. 下载源码或者安装包
git clone https://github.com/sofastack/sofa-registry.git
cd sofa-registry
mvn clean package -DskipTests
cp server/distribution/integration/target/registry-integration.tgz <somewhere>
cd <somewhere> && mkdir registry-integration
tar -zxvf registry-integration.tgz -C registry-integration
cd registry-integration
下载安装包方式
您可以从 release 页面 下载最新的 registry-integration-$version.tar.gz 包。
mkdir registry-integration
tar -zxvf registry-integration-$version.tar.gz -C registry-integration
cd registry-integration
2. 启动 registry-integration
Linux/Unix/Mac
启动命令:sh bin/startup.sh
Windows
双击 bin 目录下的 startup.bat 运行文件。
3.确认运行状态
可访问三个角色提供的健康监测 API,或查看日志 logs/registry-startup.log:
# 查看meta角色的健康检测接口:
$ curl http://localhost:9615/health/check
{"success":true,"message":"... raftStatus:Leader"}
# 查看data角色的健康检测接口:
$ curl http://localhost:9622/health/check
{"success":true,"message":"... status:WORKING"}
# 查看session角色的健康检测接口:
$ curl http://localhost:9603/health/check
{"success":true,"message":"..."}
4、SOFARPC
1、介绍
SOFARPC 是蚂蚁金服开源的一款基于 Java 实现的 RPC 服务框架,为应用之间提供远程服务调用能力,具有高可伸缩性,高容错性,目前蚂蚁金服所有的业务的相互间的 RPC 调用都是采用 SOFARPC。SOFARPC 为用户提供了负载均衡,流量转发,链路追踪,链路数据透传,故障剔除等功能。
SOFARPC 还支持不同的协议,目前包括 bolt,RESTful,dubbo,H2C 协议进行通信。其中 bolt 是蚂蚁金融服务集团开放的基于 Netty 开发的网络通信框架。
- 当一个 SOFARPC 的应用启动的时候,如果发现当前应用需要发布 RPC 服务的话,那么 SOFARPC 会将这些服务注册到服务注册中心上。如图中 Service 指向 Registry。
- 当引用这个服务的 SOFARPC 应用启动时,会从服务注册中心订阅到相应服务的元数据信息。服务注册中心收到订阅请求后,会将发布方的元数据列表实时推送给服务引用方。如图中 Registry 指向 Reference。
- 当服务引用方拿到地址以后,就可以从中选取地址发起调用了。如图中 Reference 指向 Service。
2、服务端搭建
1、POM依赖
<!-- SpringBootWeb依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--SOFARPC 依赖-->
<dependency>
<groupId>com.alipay.sofa</groupId>
<artifactId>rpc-sofa-boot-starter</artifactId>
</dependency>
<!--SOFARegistry 依赖-->
<dependency>
<groupId>com.alipay.sofa</groupId>
<artifactId>registry-client-all</artifactId>
</dependency>
2、yml
#应用名称
spring:
application:
name: sofa-server
#端口号
server:
port: 8081
#日志位置
logging:
path: ./logs
#暴露监控
management:
endpoints:
web:
exposure:
include: "*"
#注册中心地址
com:
alipay:
sofa:
rpc:
registry:
address: sofa://10.99.67.16:9603
3、Config
/*
阿里更新bug https://github.com/sofastack/sofa-boot/issues/566
升级sofa-boot到3.2.1版本后,SOFARegistry无法使用,只能使用zk做注册中心。
检查代码发现是SofaRpcAutoConfiguration这个类在做注入注册中心处理器实现时添加了 @ConditionalOnMissingBean 注解,
导致只注入了local、mesh和zk的处理器,其它注册中心的处理器没有注入。
不知为何要做这个配置?
添加此配置添加SofaRegistry的使用
*/
@Component
public class SofaRegistry {
@Bean
@ConditionalOnMissingBean
public SofaRegistryConfigurator sofaRegistryConfigurator() {
return new SofaRegistryConfigurator();
}
}
4、测试代码
package com.feng.service;
public interface HelloSyncService {
String saySync(String string);
}
实现
//发布成一个 SOFARPC 服务: HelloSyncService接口,bolt协议
@SofaService(interfaceType = HelloSyncService.class, bindings = { @SofaServiceBinding(bindingType = "bolt")})
@Component
public class HelloSyncServiceImpl implements HelloSyncService {
@Override
public String saySync(String string) {
System.out.println("1111111111111111111111111111111111");
return string;
}
}
@RestController
public class HelloController {
@GetMapping("/hello")
public String Hello()
{
return "ok";
}
}
3、客户端调用
1、POM依赖
<!-- SpringBootWeb依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--SOFARPC 依赖-->
<dependency>
<groupId>com.alipay.sofa</groupId>
<artifactId>rpc-sofa-boot-starter</artifactId>
</dependency>
<!--SOFARegistry 依赖-->
<dependency>
<groupId>com.alipay.sofa</groupId>
<artifactId>registry-client-all</artifactId>
</dependency>
2、yml
#应用名称
spring:
application:
name: sofa-client
#端口号
server:
port: 8082
#日志位置
logging:
path: ./logs
#暴露监控
management:
endpoints:
web:
exposure:
include: "*"
#注册中心地址
com:
alipay:
sofa:
rpc:
registry:
address: sofa://10.99.67.16:9603
3、Config
/*
阿里更新bug https://github.com/sofastack/sofa-boot/issues/566
升级sofa-boot到3.2.1版本后,SOFARegistry无法使用,只能使用zk做注册中心。
检查代码发现是SofaRpcAutoConfiguration这个类在做注入注册中心处理器实现时添加了 @ConditionalOnMissingBean 注解,
导致只注入了local、mesh和zk的处理器,其它注册中心的处理器没有注入。
不知为何要做这个配置?
添加此配置添加SofaRegistry的使用
*/
@Component
public class SofaRegistry {
@Bean
@ConditionalOnMissingBean
public SofaRegistryConfigurator sofaRegistryConfigurator() {
return new SofaRegistryConfigurator();
}
}
3、测试代码
- HelloSyncService必须和server里面的包名相同
package com.feng.service;
public interface HelloSyncService {
String saySync(String string);
}
HelloSyncClientService类
@Component
public class HelloSyncClientService {
//引用 SOFARPC 服务,bolt协议
@SofaReference(interfaceType = HelloSyncService.class, binding = @SofaReferenceBinding(bindingType = "bolt"))
private HelloSyncService helloSyncService;
public String saySync(String str) {
return helloSyncService.saySync(str);
}
}
HelloController
@RestController
public class HelloController {
@Autowired
private HelloSyncClientService helloSyncClientService;
@GetMapping(value = "/hello")
public String saySync(@RequestParam("str") String str) {
return helloSyncClientService.saySync(str);
}
@GetMapping(value = "/hello1")
public String saySync1() {
return helloSyncClientService.saySync("11111");
}
@GetMapping(value = "/hello12")
public String saySync() {
return "11111";
}
}
4、测试
浏览器访问http://localhost:8082/hello?str=111 ,返回111
成功